一个消费者多个主题导致潜在的线程问题?

时间:2017-01-18 22:34:41

标签: java multithreading hadoop apache-kafka

我有一个REST服务,我们称之为MDD,它有一个kafka消费者。当我第一次启动休息服务时,另一个服务告诉MDD的消费者订阅特定主题,一切似乎都没问题。

然后该服务告诉MDD的消费者订阅另一个主题。我现在这样做的方式是通过consumer.assign()方法。基本上,如果引入了未分配消费者的新主题,我将此新主题分配给消费者。因此,现在为一个消费者分配了两个不同的主题。

此消费者轮询消息并将其存入HDFS。

现在我注意到的是,当第二个主题的订阅进来时,有时我会收到有关无法附加到HDFS中的文件的错误,当我查看日志时,它试图附加一些应该的数据直到后来才被追加。 例如,到kafka的数据按照A,B,C的顺序排列。当MDD完成将A附加到HDFS时,它会尝试附加C(而不是B)并同时尝试附加B。另外需要注意的是,此时第一个主题没有数据,只有第二个主题的数据流入。所以目前只有一个kafka主题在任何给定时间都有数据流。

任何人都知道会发生什么事吗?当我将一个消费者分配给多个主题时,是否有可能创建一些线程问题?因为当将消费者分配给一个主题时,一切似乎都很好,但是一旦将其分配给多个主题,我就无法附加到HDFS中的文件,因为其他一些作者已经拥有该租约。此错误不会经常发生,只是非常随机。

每次创建新主题时,也会建议修复,创建新的kafka消费者吗?

1 个答案:

答案 0 :(得分:0)

只有一位消费者阅读来自多个主题的消息,这绝对有效且可行。您遇到的问题是因为Kafka目前不支持使用手动分区分配(使用KafkaConsumer #assid)和组管理(使用KafkaConsumer#subscribe)。

为了支持订阅新创建的主题,您可以尝试调用传递正则表达式的KafkaConsumer#subscribe,匹配所有新创建的主题。

相关问题