我怎么知道我已经消耗了所有卡夫卡主题?

时间:2018-01-24 16:54:43

标签: apache-kafka apache-flink

我正在使用Flink v1.4.0。我根据以下代码使用Kafka使用Kafka FLink Consumer主题中的数据:

Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
// only required for Kafka 0.8
properties.setProperty("zookeeper.connect", "localhost:2181");
properties.setProperty("group.id", "test");
DataStream<String> stream = env
.addSource(new FlinkKafkaConsumer08<>("topic", new SimpleStringSchema(), properties));

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

FlinkKafkaConsumer08<String> myConsumer = new FlinkKafkaConsumer08<>(...);
myConsumer.setStartFromEarliest();     // start from the earliest record possible
myConsumer.setStartFromLatest();       // start from the latest record
myConsumer.setStartFromGroupOffsets(); // the default behaviour

DataStream<String> stream = env.addSource(myConsumer);
...

有没有办法知道我是否已经消耗了整个主题?如何监控偏移量? (这是否足以确认我已经消耗了Kafka主题中的所有数据?)

2 个答案:

答案 0 :(得分:2)

由于Kafka通常与连续的数据流一起使用,所以&#34; all&#34;一个主题可能是也可能不是一个有意义的概念。我建议您查看documentation on how Flink exposes Kafka's metrics,其中包含以下解释:

The difference between the committed offset and the most recent offset in 
each partition is called the consumer lag. If the Flink topology is consuming 
the data slower from the topic than new data is added, the lag will increase 
and the consumer will fall behind. For large production deployments we 
recommend monitoring that metric to avoid increasing latency.

因此,如果消费者滞后为零,那么你就会陷入困境。也就是说,您可能希望能够自己比较偏移量,但我不知道一种简单的方法。

答案 1 :(得分:0)

Kafka它被用作流媒体源,而流没有结束。

如果我没错,Flink的Kafka连接器每X毫秒从主题中提取数据,因为所有kafka消费者都是活跃消费者,如果主题内有新数据,Kafka不通知您

因此,在您的情况下,只需设置超时,如果您在该时间内没有读取数据,则表示已经删除了主题中的所有数据。

无论如何,如果您需要阅读一批有限数据,您可以使用Flink的一些Windows或在Kafka主题中引入某种标记,以划分批次的开始和批处理。