【发布时间】:2020-10-22 02:49:59
【问题描述】:
我在这里设置了一个最小的示例,其中我有来自 N Kakfa 主题的 N 个流(在下面的示例中为 100 个)。
我想在看到“EndofStream”消息时完成每个流。
当所有流都完成后,我希望 Flink 程序能够优雅地完成。
当并行度设置为 1 时会出现这种情况,但通常不会发生。
从Another question看来,kafka消费者组的线程似乎不是所有的都结束了。
Others 建议抛出异常。但是,程序将在第一个异常处终止,并且不会等待所有流完成。
我还添加了一个最小的 python 程序来向 kafka 主题添加消息以实现可重复性。请在每个程序中填写<IP>:<PORT>。
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
String outputPath = "file://" + System.getProperty("user.dir") + "/out/output";
Properties kafkaProps = null;
kafkaProps = new Properties();
String brokers = "<IP>:<PORT>";
kafkaProps.setProperty("bootstrap.servers", brokers);
kafkaProps.setProperty("auto.offset.reset", "earliest");
ArrayList<FlinkKafkaConsumer<String>> consumersList = new ArrayList<FlinkKafkaConsumer<String>>();
ArrayList<DataStream<String>> streamList = new ArrayList<DataStream<String>>();
for (int i = 0; i < 100; i++) {
consumersList.add(new FlinkKafkaConsumer<String>(Integer.toString(i),
new SimpleStringSchema() {
@Override
public boolean isEndOfStream(String nextElement) {
if (nextElement.contains("EndofStream")) {
// throw new RuntimeException("End of Stream");
return true;
} else {
return false;
}
}
}
, kafkaProps));
consumersList.get(i).setStartFromEarliest();
streamList.add(env.addSource(consumersList.get(i)));
streamList.get(i).writeAsText(outputPath + Integer.toString(i), WriteMode.OVERWRITE);
}
// execute program
env.execute("Flink Streaming Java API Skeleton");
Python 3 程序
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='<IP>:<PORT>')
for i in range(100): # Channel Number
for j in range(100): # Message Number
message = "Message: " + str(j) + " going on channel: " + str(i)
producer.send(str(i), str.encode(message))
message = "EndofStream on channel: " + str(i)
producer.send(str(i), str.encode(message))
producer.flush()
更改这一行:streamList.add(env.addSource(consumersList.get(i))); 到 streamList.add(env.addSource(consumersList.get(i)).setParallelism(1)); 也可以完成这项工作,但 Flink 会将所有消费者放置到同一台物理机器上。
我希望消费者也被分发。
flink-conf.yaml
parallelism.default: 2
cluster.evenly-spread-out-slots: true
最后的手段是将每个主题写入单独的文件并使用文件作为源而不是 kafka 消费者。
最终目标是测试 flink 需要多少时间来处理某些程序的某些工作负载。
【问题讨论】:
标签: apache-kafka apache-flink flink-streaming