Kafka-connector kafka中的partition机制和flink的并行度机制深度结合,kafka可以作为flink的source和sink,任务失败,通过设置offset来恢复应用。
依赖 <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka-0.11_2.11</artifactId> <version>1.6.1</version> </dependency>
setStartFromSpecificOffsets(Map<KafkaTopicPartition
Kafka consumer的容错 当checkpoint机制开启的时候,Kafka Consumer会定期把kafka的offset信息还有其他operator的状态信息一块保存起来。当job失败重启的时候,Flink会从最近一次的checkpoint中进行恢复数据,重新消费kafka中的数据。为了能够使用支持容错的kafka Consumer,需要开启checkpoint
env.enableCheckpointing(5000); // 每5s checkpoint一次
动态加载topic
Kafka consumers offset 自动提交 针对job是否开启checkpoint来区分 Checkpoint关闭时: 可以通过下面两个参数配置 enable.auto.commit auto.commit.interval.ms Checkpoint开启时:当执行checkpoint的时候才会保存offset,这样保证了kafka的offset和checkpoint的状态偏移量保持一致。 可以通过这个参数设置setCommitOffsetsOnCheckpoints(boolean) 这个参数默认就是true。表示在checkpoint的时候提交offset 此时,kafka中的自动提交机制就会被忽略
Producer Kafka Producer的容错-Kafka 0.9 and 0.10 如果Flink开启了checkpoint,针对FlinkKafkaProducer09 和FlinkKafkaProducer010 可以提供 at-least-once的语义,还需要配置下面两个参数 setLogFailuresOnly(false) setFlushOnCheckpoint(true) Kafka Producer的容错-Kafka 0.11 如果Flink开启了checkpoint,针对FlinkKafkaProducer011 就可以提供 exactly-once的语义 但是需要选择具体的语义 Semantic.NONE Semantic.AT_LEAST_ONCE【默认】 Semantic.EXACTLY_ONCE
##source with kafka StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment(); pro.setProperty("zookeeper.connect","master:2181,slave2:2181,slave3:2181/kafka"); // 设置zookeeper地址,以逗号为分隔符 //创建连接器,消费主题为“topic”,反序列化
##启动kafka producer ##第二步启动程序 ##在kafka prodcer中输入数据,可以看到idea控制台也输出了字符串 ##测试consumer011.setStartFromGroupOffsets()
##先输入数据,在运行程序 结果 flink丢弃了kafka中程序运行前的数据, flink以kafka作为数据源,设置了 group.id之后,并没有使用默认配置,而是选用setStartFromLatest(),去除 group.id之后,就是默认setStartFromGroupOffsets!正常情况下是不会造成数据丢失的,我试着使用con1为group名创建了一个consumer进行测试,结果依然会出现数据丢失,发现是group.id属性错误,在kafka中并没有group-id,而是—group,故去除修改为pro.setProperty("group","con1");结果成功。
测试consumer011.setStartFromEarliest();
##该方法是从第一次producer产生数据开始读取 ##测试consumer011.setStartFromLatest();
##此方法是在程序运行之后,producer产生的数据可是获取
### socket as source and sink with kafka public static void main(String[] args) throws Exception {
##打开一台终端 Nc –lk 9001 ##再打开一个终端,启动消费者 ##运行程序
可以看到,从9001端口输入的数据,被消费者消费了,成功 |