Alink连接Kafka等第三方数据源的方式(插件下载与导入)

像Kafka等第三方数据源,Alink目前还没有可以直接在pom文件里面导入的依赖,需要用Alink提供的插件下载器,将插件下载到本地,然后导入到项目中,才可以完成连接

官方文档
https://www.yuque.com/pinshu/alink_guide/plugin_downloader

package source_sink;

import com.alibaba.alink.common.AlinkGlobalConfiguration;
import com.alibaba.alink.common.io.plugin.PluginDownloader;

import java.util.List;

public class PluginDemo {
    public static void main(String[] args) throws Exception {
        // 插件下载位置
        String downloadPath = "plugins\\";

        // 设置插件下载的位置,当路径不存在时会自行创建路径
        AlinkGlobalConfiguration.setPluginDir(downloadPath);

        // 获得Alink插件下载器
        PluginDownloader pluginDownloader = AlinkGlobalConfiguration.getPluginDownloader();

        // 从远程加载插件的配置项
        pluginDownloader.loadConfig();

        // 展示所有可用的插件名称
        List<String> plugins = pluginDownloader.listAvailablePlugins();
        System.out.println("----------------------");
        System.out.println("alink中所有的插件:" + plugins);

        // 显示第0个插件的所有版本
        String pluginName = plugins.get(4); // kafka
        List<String> availableVersions = pluginDownloader.listAvailablePluginVersions(pluginName);
        System.out.println("----------------------");
        System.out.println(pluginName);
        System.out.println(availableVersions);

        // 下载某个插件的特定版本
        //String pluginVersion = availableVersions.get(4);
        //pluginDownloader.downloadPlugin(pluginName, pluginVersion);
        // 运行结束后,插件会被下载到"/Users/xxx/alink_plugins/"目录中

        // 下载某个插件的默认版本
        pluginDownloader.downloadPlugin(pluginName);
        // 运行结束后,插件会被下载到"/Users/xxx/alink_plugins/"目录中
    }
}

这里的插件下载位置,是idea项目中的相对路径
在这里插入图片描述
String downloadPath = “plugins\”; 下载的插件就会保存在plugins文件夹下面的flink-1.13里面

首先查看Alink支持下载的全部插件

alink中所有的插件:[datahub, derby, hadoop, hive, kafka, mysql, odps, onnx_predictor, oss, parquet, redis, 
s3-hadoop, s3-presto, sqlite, tf_predictor_linux, tf_predictor_macosx, tf_predictor_windows, torch_predictor, xgboost, base_cased_ckpt, base_cased_saved_model, base_cased_vocab, base_chinese_ckpt,
 base_chinese_saved_model, base_chinese_vocab, base_multilingual_cased_ckpt, base_multilingual_cased_saved_model, base_multilingual_cased_vocab, base_uncased_ckpt, base_uncased_saved_model, base_uncased_vocab,
  libtorch_linux, libtorch_macosx, libtorch_windows, tf115_python_env_linux, tf115_python_env_macosx, tf115_python_env_windows, tf231_python_env_linux, tf231_python_env_macosx, tf231_python_env_windows]

在上面这一大堆插件中找到自己要下载的插件,这里以kafka为例,从左往右,第一个插件位置为0,则kafka位于第4的位置

通过 String pluginName = plugins.get(4); 看到kafka插件的全部版本

在这里插入图片描述
然后利用 pluginDownloader.downloadPlugin(pluginName); 直接下载kafka插件的默认版本

下载完成后,在下载路径下面找到插件

注意:Alink 的新版本中使用了更先进的插件机制:当使用了需要插件的组件、并且能正常访问外网时,会自动下载插件,不需要再使用下文介绍的 PluginDownloader 手动下载了。通常情况下,只需根据需要设置插件下载路径 AlinkGlobalConfiguration.setPluginDir 就可以了。

在这里插入图片描述
上图是我下载完成的kafka组件,此时只是下载完成,还没有导入项目,运行代码依旧是会报错的

在这里插入图片描述
在这里将我划红线标注的Jar包导入项目

之后再运行如下代码

#创建topic
kafka-topics.sh --create --zookeeper master:2181 --replication-factor 1 --partitions 3 --topic iris
package source_sink;

import com.alibaba.alink.common.AlinkGlobalConfiguration;
import com.alibaba.alink.operator.stream.StreamOperator;
import com.alibaba.alink.operator.stream.dataproc.JsonValueStreamOp;
import com.alibaba.alink.operator.stream.sink.KafkaSinkStreamOp;
import com.alibaba.alink.operator.stream.source.CsvSourceStreamOp;
import com.alibaba.alink.operator.stream.source.KafkaSourceStreamOp;

public class demo3 {
    public static void main(String[] args) throws Exception {
        // 设置本地csv文件路径以及各字段的名字、类型
        String filePath = "D:\\data\\iris.csv";
        String schema = "s1 double,s2 double,p1 double,p2 double";

        // 利用CsvSourceStreamOp读取本地csv文件
        //由于 CSV 文件中数据有限,当读取完最后一条时,流式任务会结束
        CsvSourceStreamOp csvSource = new CsvSourceStreamOp()
                .setFilePath(filePath)
                .setSchemaStr(schema)
                .setFieldDelimiter(",");

		//验证是否读取成功
        csvSource.filter("s1 < 4.5").print();
        StreamOperator.execute();

        // 利用KafkaSinkStreamOp将上面csvSource读取的数据写入kafka中
        KafkaSinkStreamOp kafkaSink = new KafkaSinkStreamOp()
                .setBootstrapServers("master:9092")
                .setDataFormat("json")
                .setTopic("iris");

        // 通过link串联起两个组件
        csvSource.link(kafkaSink);

        StreamOperator.execute();
    }
}

在kafka中查看数据
在这里插入图片描述
写入成功

下面利用Alink读取kafka中的数据

package source_sink;

import com.alibaba.alink.common.AlinkGlobalConfiguration;
import com.alibaba.alink.operator.stream.StreamOperator;
import com.alibaba.alink.operator.stream.dataproc.JsonValueStreamOp;
import com.alibaba.alink.operator.stream.sink.KafkaSinkStreamOp;
import com.alibaba.alink.operator.stream.source.CsvSourceStreamOp;
import com.alibaba.alink.operator.stream.source.KafkaSourceStreamOp;

public class demo3 {
    public static void main(String[] args) throws Exception {
        // 使用KafkaSourceStreamOp从kafka中获取数据
        KafkaSourceStreamOp kafkaSourceStream = new KafkaSourceStreamOp()
                .setBootstrapServers("master:9092")  // 地址
                .setTopic("iris")  // 要读取的topic
                .setStartupMode("earliest") //从头读取数据,也可以设置为latest,有偏移量则从偏移量处开始消费,没有则从最新处开始消费
                .setGroupId("iris1");  // 消费者组id

        // 利用上面这种方式获取的每条数据都是 Json 格式的字符串,利用下面这种方式对Json字符串进行格式化
        StreamOperator data = kafkaSourceStream
                .link(
                        new JsonValueStreamOp()
                                .setSelectedCol("message")
                                .setReservedCols(new String[]{})
                                .setOutputCols("s1", "s2", "p1", "p2")
                                .setJsonPath("$.s1", "$.s2", "$.p1", "$.p2")

                )
                .select("cast(s1 as double) as c1, cast(s2 as double) as c2, cast(p1 as double) as c3, cast(p2 as double) as c4");

        // 打印表结构,数据
        System.out.println(data.getSchema());
        data.print();
        StreamOperator.execute();
    }
}

JsonValueStreamOp

名称中文名称描述类型是否必须?默认值
jsonPathJson 路径数组用来指定 Json 抽取的内容。String[]
skipFailed是否跳过错误当遇到抽取值为null 时是否跳过booleanfalse
selectedCol选中的列名计算列对应的列名String
reservedCols算法保留列名算法保留列String[]null
outputCols输出结果列列名数组输出结果列列名数组,必选String[]

结果为
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一纸春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值