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[]

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

### Kafka 是否支持通过安装第三方插件实现死信队列 Kafka 并不像 RabbitMQ 那样内置对死信队列的支持,但在实际应用中可以通过一些设计模式和工具间接实现死信队列的功能。以下是关于如何利用 Kafka 和可能存在的第三方插件方案来实现死信队列的分析。 #### 1. **Kafka 原生特性死信队列** Kafka 提供了强大的消息传递能力,但其核心设计理念并不完全围绕传统的“死信队列”概念展开。然而,Kafka 支持以下几种方式可以帮助构建类似的机制: - **Topic 分区消费者组** 使用不同的 Topic 来区分正常消息和死信消息。例如,当某个消息因某种原因未能被成功消费时,可以将其重新发送到另一个专门用于存储死信的 Topic 中[^4]。 - **Producer Retry Mechanism** 如果消息发送失败,Kafka Producer 可以配置 retry 参数尝试多次重发该消息。虽然这不是严格意义上的死信队列,但它能够在一定程度上减少消息丢失的可能性[^4]。 - **Offset Management** 手动管理消费者的 Offset 是一种重要的手段。如果某条消息无法被当前 Consumer 成功处理,则可以选择不提交对应的 Offset,从而让其他 Consumer 或后续轮次再次尝试消费这条消息[^4]。 #### 2. **第三方插件或框架辅助实现** 尽管 Kafka 自身并未直接提供类似于 RabbitMQ 的 Dead Letter Exchange 功能,但仍可通过引入外部组件或者自定义逻辑达成目的: - **Stream Processing Frameworks** Apache Flink、Apache Spark Streaming 等流式计算框架能够监听 Kafka 主题上的数据流动情况,并根据预设条件判断哪些属于“死信”。一旦发现此类事件即可采取相应措施(如转发至备用主题)[^3]。 - **Custom Middleware Solutions** 开发人员也可以编写中间层服务作为桥梁连接原始生产者最终消费者之间。此中介程序负责监控整个流程状态变化并将不合格项转移至特殊区域保存待查证解决后再返回主线继续执行下去[^3]。 - **Third-party Plugins or Libraries** 虽然目前官方文档并没有提到任何正式发布的专用插件可以直接应用于 Kafka 上创建 dead-letter queues ,但是社区版可能存在满足需求的相关项目可供选用 。需要注意的是,在选择这些非标准扩展前务必充分评估它们的安全性和兼容性风险。 #### 示例代码展示 下面给出一段简单的 Java 实现思路示意如何将未成功处理的消息转移到新的 topic 中充当 “DLQ”。 ```java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); Producer<String, String> producer = new KafkaProducer<>(props); try { // Simulate normal processing... } catch (Exception e) { // If an error occurs during consumption, send the failed message to DLQ. ProducerRecord<String, String> dlqRecord = new ProducerRecord<>("dlq-topic", key, value); producer.send(dlqRecord); } finally{ producer.close(); } ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一纸春秋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值