「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
如何将kafka作为flink数据源及输出节点
前文
本文为对于kafka学习过程中经验的总结,难免有不足之处,还请见谅。
环境准备
本文采用的开发环境为flink,版本1.10,同时需要预先准备好java8开发环境,此处不再进行赘述。由于需要与卡夫卡进行通信,因此需要再项目中引入卡夫卡连接的依赖包。考虑到版本适配关系,flink采用了2.12的版本,因此卡夫卡连接配置也需要采用2.12版本。因此在pom中引入如下依赖。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.12</artifactId>
<version>1.9.1</version>
</dependency>
代码及分析
具体的代码如下所示,通过代码逐行进行一下解析。
public static void main(String[] args) throws Exception {
// 声明运行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 设置程序并行度
env.setParallelism(8);
// 声明数据源
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "127.0.0.1:9092");
properties.setProperty("group.id", "test111");
properties.setProperty("auto.offset.reset", "earliest");
FlinkKafkaConsumer<String> myConsumer = new FlinkKafkaConsumer<>("kafka_in", new SimpleStringSchema(), properties);
DataStreamSource<String> dataStream = env.addSource(myConsumer);
SingleOutputStreamOperator<Object> process = dataStream.process(new ProcessFunction<String, Object>() {
@Override
public void processElement(String s, Context context, Collector<Object> collector) throws Exception {
System.out.println(s);
System.out.println(context.timerService().currentProcessingTime());
collector.collect(s);
}
});
SinkFunction<Object> producer = new FlinkKafkaProducer("kafka_out",
new KafkaSerializationSchema<String>() {
@Override
public ProducerRecord<byte[], byte[]> serialize(String o, @org.jetbrains.annotations.Nullable Long aLong) {
ProducerRecord<byte[], byte[]> producerRecord = new ProducerRecord<byte[], byte[]>("kafka_out",o.getBytes(StandardCharsets.UTF_8));
return producerRecord;
}
},
properties, FlinkKafkaProducer.Semantic.EXACTLY_ONCE);
process.addSink(producer);
// 执行flink程序
env.execute("kafka.test");
}
- 首先需要声明一个flink的运行环境,将并行度设置为8。
- 接下来要对数据源进行配置,由于本文采用卡夫卡作为数据源,因此在此处配置好卡夫卡相关的连接信息,以及消费者组和偏移量等相关卡夫卡信息。
- 指定卡夫卡作为flink的数据源,并设置消费主题,同时利用
SimpleStringSchema作为解码器。 - 指定卡夫卡作为flink的输出节点,与数据源的配置类似,并指定输出主题。
- 最后,执行程序即可。 以上,即为同时采用卡夫卡作为数据源及输出节点的方案。通过这样设置,就可以从卡夫卡的指定主题读取消息数据,然后再对消息进行处理,最后输出到新的主题中。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。