设定:
创建了一个简单的示例程序,用于从一个Kafka主题中获取1M消息并生成另一个 - 在本地执行模式下运行。这两个主题都有32个分区。
当我从头到尾运行时,它会消耗并生成所有消息。如果我在完成之前启动然后停止(SIGINT),那么再次重新启动生产者只会收到原始1M消息的子集。
我已经确认了消费者的偏移量,并且它读取了所有1M消息。
final StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(32);
env.enableCheckpointing(1000L, CheckpointingMode.EXACTLY_ONCE);
-
producer.setFlushOnCheckpoint(true);
producer.setLogFailuresOnly(false);
在本地执行模式下这是预期的吗?我是否需要启用保存点才能停止并重新启动流作业?我发现生产者在发生这种情况时并未提交所有消息。
提前致谢!
答案 0 :(得分:1)
首先,在后续运行中,它只接收消息的子集,因为j
正在使用Kafka中的已提交偏移量作为起始位置。目前,在版本中(现在最多FlinkKafkaConsumer
)避免此问题的唯一方法是始终分配新的1.2.0
。在下一个版本中,会有新选项:https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/connectors/kafka.html#kafka-consumers-start-position-configuration。
作为附注,请注意,Kafka中的承诺抵消根本不用于Flink的一次性处理保证。 Flink仅依赖于检查点偏移量。有关详细信息,请参阅上面链接中的Flink Kafka连接器文档。