flink实时读取kafka数据到mysql flink 读取kafka
Flink提供了Kafka连接器,用于从或向Kafka读写数据。
本文总结Flink与Kafka集成中的问题,并对一些疑点进行总结和梳理。
问题一: 读Kafka的方式
问题二: 读Kafka与反序列化器
可通过org.apache.flink.api.common.serialization.DeserializationSchema
或org.apache.flink.streaming.connectors.kafka.KafkaDeserializationSchema
,将从Kafka读取的二进制字节流反序列化成Flink内部支持的Java/Scala对象。
Flink内置支持以下2种常用反序列化器:
org.apache.flink.api.common.serialization.SimpleStringSchema
:反序列化成String。org.apache.flink.streaming.util.serialization.JSONKeyValueDeserializationSchema
:反序列化成jackson ObjectNode。
如果想实现Kafka复杂JSON直接转换成想要的Object,可仿照org.apache.flink.api.common.serialization.SimpleStringSchema
自定义即可。主要实现deserialize
反序列化方法。
问题三: 读Kafka动态发现Topic、Partition
之前使用Spark Streaming,Spark 2.2.2
不支持动态发现Kafka 0.10.1
中新增的Topic(基于正则指定)和Partition。当新增了Topic或Partition,需要重启Spark Streaming任务。
在Flink中, 默认支持动态发现Kafka中新增的Topic或Partition,但需要手动开启。
问题四: 读Kafka与Exactly Once语义
没有开启Checkpoint,默认自动提交Offset至外部存储(如Kafka Broker或Zookeeper),自动提交的间隔是5秒。Flink Kafka Consumer的容错依赖于自动提交的Offset。
开启Checkpoint,默认在Checkpoint完成后将存储在Checkpoint中的Offset再提交至外部存储(如Kafka Broker或0.8版本中的Zookeeper),Flink Kafka Consumer在Flink作业运行过程中的容错依赖于Checkpoint中的Offset,Flink作业恢复,则可能是从Checkpoint中的Offset恢复,也可能是从外部存储如Kafka Broker中的Offset恢复,具体取决于恢复方式。注意: 在这种方式下,Kafka Broker(或0.8中Zookeeper)存储的Offset仅用于监控消费进度。
总结,基于Kafka可重复消费的能力并结合Flink Checkpoint机制,Flink Kafka Consumer
能提供Exactly-Once语义。
问题五: 写Kafka与Exactly Once语义
- Kafka 0.8 Flink不提供Exactly-Once或At-Least-Once语义。
- Kafka 0.9、0.10 Flink启用Checkpoint,
FlinkKafkaProducer09
和FlinkKafkaProducer010
提供At-Least-Once语义。除此之外,还需设置以下参数:setLogFailuresOnly(false)
: 若为true
,Producer
遇到异常时,仅记录失败时的日志,流处理程序继续。需要设置为false
,当遇到异常,流处理程序失败,抛出异常恢复任务并重试发送。setFlushOnCheckpoint(true)
: Checkpoint中包含Kafka Producer Buffer
中的数据,设置为true, 确保Checkpoint成功前,Buffer中的所有记录都已写入Kafka。retries
: 重试次数,默认0,建议设置更大。 - Kafka 0.11、1.0.0+ Flink启用Checkpoint,基于
Two Phase Commit
,FlinkKafkaProducer011
和FlinkKafkaProducer(Kafka >=1.0.0)
默认提供Exactly-Once语义。
如需要其他语义Semantic.NONE(可能会丢或重)
、Semantic.AT_LEAST_ONCE(可能会重)
、Semantic.EXACTLY_ONCE(默认)
,可手动选择。
从Kafka 0.10.1
读数据并写入到Kafka 0.11.0.3
并实现PV统计
部分依赖
代码实现