读取多个经纪人kafka与flink

时间:2016-10-27 09:55:07

标签: apache-kafka apache-flink

我想从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实例(这是您正在做的事情),然后将生成的流联合起来

我的情况不合适。

所以我的问题是:

  1. 我错过了什么吗?
  2. 如果我们在Kafka群集中安装了新计算机,我们是否需要更改flink的代码以为新的borker添加消费者?或者我们可以在运行时自动处理吗?

1 个答案:

答案 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);