我想从flink读取多个kafka。
我有3台计算机用于kafka。使用以下主题
Topic:myTopic PartitionCount:3 ReplicationFactor:1 Configs:
Topic: myTopic Partition: 0 Leader: 2 Replicas: 2 Isr: 2
Topic: myTopic Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: myTopic Partition: 2 Leader: 1 Replicas: 1 Isr: 1
从Flink我执行以下代码:
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "x.x.x.x:9092,x.x.x.x:9092,x.x.x.x:9092");
properties.setProperty("group.id", "flink");
DataStream<T> stream = env.addSource(new FlinkKafkaConsumer09<>("myTopic", new SimpleStringSchema(), properties)
stream.map(....)
env.execute()
我开了3次相同的工作。
如果我用一个代理执行此代码,它运行良好,但有3个破坏(在3台不同的机器上),只读取一个分区。
(In this question)提出的解决方案是
为每个集群创建单独的FlinkKafkaConsumer实例(这是您正在做的事情),然后将生成的流联合起来
我的情况不合适。
所以我的问题是:
答案 0 :(得分:1)
您似乎误解了Kafka分布式流的概念。
Kafka主题包含多个分区(在您的情况下为3个分区)。每个消费者可以使用这些分区中的一个或多个。如果您使用相同的 group.id 启动应用程序的3个实例,则每个消费者确实只会从一个代理读取数据 - 它会尝试均匀分配负载,因此每个消费者都有一个分区。
我建议您在Kafka documentation中详细了解此主题,尤其是使用者群组的概念。
无论如何FlinkKafkaConsumer09
可以在多个并行实例中运行,每个实例都将从一个或多个Kafka分区中提取数据。您无需担心创建更多消费者实例。一个消费者实例可以从所有分区中提取记录。
我不知道你为什么要开始这项工作3次而不是将并行性设置为3次。这将解决你的问题。
DataStream<T> stream =
env.addSource(new FlinkKafkaConsumer09<>("myTopic", new SimpleStringSchema(), properties))
.setParallelism(3);