我期待产品电离并部署我的Kafka Connect应用程序。但是,我有两个关于tasks.max设置的问题,这是必需的并且具有很高的重要性,但细节对于实际设置该值的内容是模糊的。
我最简单的问题如下:如果我有一个带有n个分区的主题,我希望从中获取数据并写入某个接收器(在我的情况下,我写入S3),我该怎么设置tasks.max至?我应该把它设置为n吗?我应该把它设置为2n吗?直观地说,我似乎想要将值设置为n,这就是我一直在做的事情。
如果我更改我的Kafka主题并增加主题分区怎么办?如果我把它设置为n,我将不得不暂停我的Kafka连接器并增加tasks.max?如果我设置了2n的值,那么我的连接器应该自动增加它运行的并行度吗?
感谢您的帮助!
答案 0 :(得分:15)
在Kafka Connect接收器中,任务本质上是消费者线程并接收要读取的分区。如果您有10个分区且tasks.max
设置为5,则每个任务都会接收2个分区以读取和跟踪偏移量。如果您已将tasks.max
配置为高于分区计数的数字,则Connect将启动一系列与其正在阅读的主题的分区相等的任务。
如果更改主题的分区计数,则必须重新启动连接任务,如果tasks.max
仍然大于分区计数,则Connect将启动这么多任务。
编辑,刚发现ConnectorContext
:https://kafka.apache.org/0100/javadoc/org/apache/kafka/connect/connector/ConnectorContext.html
必须编写连接器以包含此连接,但如果主题发生更改(添加/删除分区),Connect似乎可以重新配置连接器。
答案 1 :(得分:1)
由于tasks.max
数量多于分区数量,导致Kafka-Connect(5.1.2)实例之间的工作负载分配存在问题。
在我们的例子中,有10个Kafka Connect任务和3个主题分区需要使用。这10个工作人员中有3个被分配给该主题的3个分区,其他7个没有分配给任何分区(这是预期的),但是Kafka Connect在不考虑其工作量的情况下平均分配任务。因此,我们最终将任务分配给我们的实例,其中某些实例保持空闲状态(因为它们没有分配给任何非空worker),或者某些实例比其他实例工作更多。
要解决这个问题,我们将tasks.max
设置为等于主题划分的数量。
对于我们来说,看到Kafka Connect在重新平衡时没有考虑任务的分配确实让我们感到意外。另外,我找不到tasks.max
设置的任何文档。