在本地执行模式下停止/启动Kafka Consumer / Producer Stream

时间:2017-03-27 22:27:44

标签: apache-flink

设定:

  • Java 8
  • Flink 1.2(Mac OSX)
  • Kafka 0.10.0(VirtualBox / Ubuntu)
  • FlinkKafkaConsumer010
  • FlinkKafkaProducer010

创建了一个简单的示例程序,用于从一个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);

在本地执行模式下这是预期的吗?我是否需要启用保存点才能停止并重新启动流作业?我发现生产者在发生这种情况时并未提交所有消息。

提前致谢!

1 个答案:

答案 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连接器文档。