前言
之前初步跑了flink官网的词频统计的demo。太初级了,不实用,只是带我进行了以便flink的基本操作。总计下来,我还需要试验这些操作:
从kafka读取数据作为数据输入
根据计算输出到另一个kafka主题中
将后面kafka主题中的内容存储到数据库。
根据这个目的,我设计了这次的demo
设计
计算场景设计
我的实际的主干场景是有一个上报数据的无限流,然后根据配置以及数据的内容,将数据转换为业务粒度的数据投入到后续的数据队列中。在这里,转换前和转换后的数据都是需要进行原样保存的。
这里有一些需要被测试实现的点:
从kafka的指定topic中读取数据流,topic名称:data-upload-stream
将数据进行计算后投入到新的流中,两个流的转换并不是一对一的。topic名称:transformed-data-stream
根据可以动态变更的配置进行计算
将数据存储到postgre中
如果可以,使用现成的connector或者自定义connector
实现步骤
由于这里存在不少没用过的东西,无论技术是否测试成功,相应的问题还是要解决的。所以,我们从最小的陌生技术集合开始引入,我们分这么几个测试步骤。
数据拉取和投递
该过程,主要测试核心的从kafka拉取数据,并向kafka投递数据。
数据发送模拟由一个springmvc项目进行模拟,调用一次接口发送一次数据,以此可控得模拟数据发送
从kafka中拉取数据,进行转换后(这里转换规则先写为固定的)投递到另一个主题中
持久化数据
分别从刚才两个主题中拉取数据,并持久化到postgre数据库中。虽然之后最终的持久化容器计划是hbase,但是这里先对postgre进行测试,等本次例子全部完成后再规划对hbase的相关探索。
动态调整配置
这里数据转换的规则是根据配置进行改变的,故这里的配置需要可以动态改变的。根据了解,这里是根据其支持的Broadcast State功能进行支持的。
实现
数据源投递端
这里因为需要和计算端共享数据结构和逻辑,我这里设计了两个项目:
flink.common:公共项目,用来共享代码逻辑
flink-mockdata:数据模拟项目,仅实现/mock/push接口
关于kafka的java操作这里就不细述了,因为最近系统性得学习了下kafka的使用关于kafka从调用到运维的细节还需要重新梳理一遍,这里就先完成功能了。
另外,需要创建两个主题,kafka操作命令如下:
bin/kafka-topics.sh --zookeeper 192.168.137.11:2181 --create --topic data-upload-stream --partitions 1 --replication-factor 1
bin/kafka-topics.sh --zookeeper 192.168.137.11:2181 --create --topic transformed-data-stream --partitions 1 --replication-factor 1
需要说明的有这么两点:
我使用的是kafka2.1版本,对于低于2.2版本的kafka在创建topic的时候需要指明的参数是zookeeper的地址,而大于等于2.2版本的则需要使用--bootstrap-server指明broker的地址
在创建kafka的topic的时候如果使用下划线(_)或者点号(.)作连接符的话则会弹出一个警告信息,即这两个符号相冲突,不可以同时使用。所以这里用减号作连接符。
代码投递完,使用如下命令在服务端消费并查看相关的消息:
bin/kafka-console-c