一,背景
公司需要用到flink和kafka来处理大数据,对于一个没有接触过这两个东西的40岁程序员,决定自学一下,用了两天的时间终于实现了flink和kafka的对接,目标就是要向kafka输入 "时间戳,温度,设备ID",然后在flink里面按照时间戳分组,再按照设备ID计算的在一个时间段内的温度平均值。
二,运行环境
window 10, kafka 2.1.1, flink 1.7.2, jdk8
三,准备步骤
1,在window下面运行kafka 2.1.1
1) 启动zookeeper
从网上下载,然后解压到某个文件夹,例如:C:\software\kafka_2.12-2.1.1\kafka_2.12-2.1.1
进入cmd,进入C:\software\kafka_2.12-2.1.1\kafka_2.12-2.1.1\bin\windows目录,注意运行之前一定要修改zookeeper配置文件里面的 dataDir值,配置文件具体路径C:\software\kafka_2.12-2.1.1\kafka_2.12-2.1.1\config下面的zookeeper.properties,把该配置指到一个具体目录,我的设置如下图:
在cmd执行如下命令
zookeeper-server-start.bat C:\software\kafka_2.12-2.1.1\kafka_2.12-2.1.1\config\zookeeper.properties,如果启动正常会看到下图红框的提示
2) 启动kafka
开启一个新的cmd,同样进入 C:\software\kafka_2.12-2.1.1\kafka_2.12-2.1.1\bin\windows目录 ,注意运行之前一定要修改配置文件里面的 log.dirs,配置文件具体路径C:\software\kafka_2.12-2.1.1\kafka_2.12-2.1.1\config下面的server.properties,把该配置指到一个具体目录,我的设置如下图:
在cmd执行如下命令
kafka-server-start.bat C:\software\kafka_2.12-2.1.1\kafka_2.12-2.1.1\config\server.properties,如果启动正常会看到下图红框的提示
四,编码
1 编写发送信息到kafka的代码,这里我参考如下链接,直接用spring boot来发送信息到kafka,直接使用spring boot不需要考虑操作kafka的细节,spring boot已经帮你做好封装。
http://www.54tianzhisheng.cn/2018/01/05/SpringBoot-Kafka/
具体修改了上面链接里面的 KafkaSender 里面的发送逻辑,修改了发送信息的格式,具体如下:
String tempMessage= String.format("%d,%d,%s", System.currentTimeMillis(), ra.nextInt(), "test"+ra.nextInt(3));
log.info("+++++++++++++++++++++ message = {}", tempMessage);
kafkaTemplate.send("temp", tempMessage);
2 编写对接kafka的flink接收代码
这部分的代码参考 Packt.Mastering.Apache.Flink 第2章,利用 flink-connector-kafka与kafka对接,该书可以百度下载,只是该书中用的是旧的包,本文把旧的包全部换成新的包,新包没有了之前类似 FlinkKafkaConsumer**的类,全部换成了统一的 FlinkKafkaConsumer
另外这里还是采用原文中提到的event time来作为聚合的标准,这里说一下我个人对event time和warter mark的理解
首先 ,event time 是发送来消息里面自带的时间,flink就是根据这个时间来对发送过来的信息进行分组,以这个时间作为依据,把信息分到不同的窗口里面进行汇总处理。
然后,由于不同类型的消息里面的event time格式不一样,所以需要统一生成一种flink能够理解的标记,这个标记就是warter mark。
不知道这样理解是否对,如果不对,还请高手指教
五 运行
整个项目分两部分,分别是 kafkasender 和 flinkreceiver
首先,运行 kafkasender里面的 KafkaApplication,具体运行结果如下图,可以看到程序每隔100毫秒就发送一次信息
接着,运行 flinkreceiver 里面的 FlinkReceiver,具体结果如下图,可以看到程序从kafka收到信息,然后在指定时间段内,按照设备ID计算温度的平均值
本章源码可以参考 https://gitee.com/kengan/40_programmers_learn_flink.git