我对Flink Kafka Consumer(FlinkKafkaConsumer09)有疑问。 我一直在使用这个版本的连接器: flink-connector-kafka-0.9_2.11-1.1.2(连接器版本为0.9,akka版本为2.11,flink版本为1.1.2)
我在5分钟的翻滚窗口内收集来自kafka的通讯数据。根据我所见,窗口与系统时间对齐(例如窗口在12:45,12:50,12:55,13:00等结束) 窗口关闭后,其记录将被处理/聚合,并通过Sink运算符发送到数据库。
我的程序的简化版本:
env.addSource(new FlinkKafkaConsumer09<>(topicName,jsonMapper, properties))
.keyBy("srcIp", "dstIp", "dstPort")
.window(TumblingEventTimeWindows.of(Time.of(5, TimeUnit.MINUTES)))
.apply(new CounterSum<>())
.addSink(new DbSink(...));
但是我需要在kafka中提交偏移量。根据我的阅读,FlinkKafkaConsumer09的唯一方法是打开检查点。我是这样做的:
env.enableCheckpointing(300000); // 5 minutes
检查点存储所有运营商的状态。检查点完成后,偏移量将被发送到kafka。 我的检查点通过任务管理器系统文件结构中的FsStateBackend存储(第一个问题 - 旧的检查点数据未被删除,我看到为此报告了一些错误)。 第二个问题是触发检查点时。如果在窗口开始时触发,则生成的检查点文件很小,在窗口关闭之前触发的另一侧,结果状态很大(例如50MB),因为此窗口中已经有很多通信记录。检查点过程通常需要不到1-2秒,但是当窗口关闭后以及处理聚合和数据库接收时触发检查点时,检查点过程需要45秒。
但重点是我根本不需要国家检查点。我需要的是在窗口关闭后对kafka提交偏移,处理并将结果数据下沉到db(或在另一个窗口的开头)。如果发生故障转移,则flink将从kafka获取最后一个偏移量,并将再次读取最后5分钟间隔的数据。由于上次失败的结果未发送到数据库,因此不会向DB发送重复数据,并且重新读取最后5分钟的间隔不会产生任何开销。
基本上我有两个问题:
有没有办法实现关闭检查点 并且只提交如上所述的偏移量?
如果没有,有什么方法可以将检查点与开头对齐 窗户 ?我阅读了flink文档 - 有一个叫做的功能 保存点(即手动检查点),但它是要使用的 从命令行。我需要从代码中调用savepoint 窗口启动 - 状态将很小并且检查点进程将是 快。