Apache kafka Kafka Connect:java.lang.IllegalStateException:没有分区的当前分配

Apache kafka Kafka Connect:java.lang.IllegalStateException:没有分区的当前分配,apache-kafka,apache-kafka-connect,rebalancing,Apache Kafka,Apache Kafka Connect,Rebalancing,我正在Kubernetes 8-16节点上运行Kafka Connect,自动缩放。我总共定义了44个连接器,每个卡夫卡主题一个,每个主题一个分区。这些主题由Debezium/Postgresql生成。有3个卡夫卡节点。每个连接器的tasks.max设置为4。我的大部分连接器,但不是每一个!由于java.lang.IllegalStateException:没有分区-0的当前分配,始终有一个任务失败 注意,这里不是卡夫卡的专家;我假设有3个卡夫卡节点,所以3个工作人员做得很好,第4个任务没有任何

我正在Kubernetes 8-16节点上运行Kafka Connect,自动缩放。我总共定义了44个连接器,每个卡夫卡主题一个,每个主题一个分区。这些主题由Debezium/Postgresql生成。有3个卡夫卡节点。每个连接器的tasks.max设置为4。我的大部分连接器,但不是每一个!由于java.lang.IllegalStateException:没有分区-0的当前分配,始终有一个任务失败

注意,这里不是卡夫卡的专家;我假设有3个卡夫卡节点,所以3个工作人员做得很好,第4个任务没有任何连接,所以它失败了。但是为什么有时候有4个任务运行得很好呢

此外,由于再平衡问题,我经常会遇到操作冲突,这种情况可能会持续几分钟甚至几小时。最近我删除了所有的POD,它们自己重新启动,问题消失了,但这不是长期的解决方案

tasks.max建议值是多少?提前谢谢

例外情况:

java.lang.IllegalStateException: No current assignment for partition table-0
    at org.apache.kafka.clients.consumer.internals.SubscriptionState.assignedState(SubscriptionState.java:259)
    at org.apache.kafka.clients.consumer.internals.SubscriptionState.seek(SubscriptionState.java:264)
    at org.apache.kafka.clients.consumer.KafkaConsumer.seek(KafkaConsumer.java:1501)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.rewind(WorkerSinkTask.java:601)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.access$1200(WorkerSinkTask.java:70)
    at org.apache.kafka.connect.runtime.WorkerSinkTask$HandleRebalance.onPartitionsAssigned(WorkerSinkTask.java:675)
    at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.onJoinComplete(ConsumerCoordinator.java:291)
    at org.apache.kafka.clients.consumer.internals.AbstractCoordinator.joinGroupIfNeeded(AbstractCoordinator.java:406)
    at org.apache.kafka.clients.consumer.internals.AbstractCoordinator.ensureActiveGroup(AbstractCoordinator.java:340)
    at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.poll(ConsumerCoordinator.java:341)
    at org.apache.kafka.clients.consumer.KafkaConsumer.updateAssignmentMetadataIfNeeded(KafkaConsumer.java:1214)
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1179)
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1164)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.pollConsumer(WorkerSinkTask.java:445)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:318)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:226)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:194)
    at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:175)
    at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:219)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748
接收器连接器配置:

connector.class com.wepay.kafka.connect.bigquery.BigQuerySinkConnector
autoUpdateSchemas   true
sanitizeTopics  true
autoCreateTables    true
topics  <topic-name>
tasks.max   3
schemaRegistryLocation  http://<ip>:8081
project <big-query-project>
maxWriteSize    10000
datasets    .*=<big-query-dataset>
task.class  com.wepay.kafka.connect.bigquery.BigQuerySinkTask
keyfile /credentials/<credentials-file>.json
name    <connector-name>
schemaRetriever com.wepay.kafka.connect.bigquery.schemaregistry.schemaretriever.SchemaRegistrySchemaRetriever
tableWriteWait  1000
bufferSize  100000
它会抛出上面的异常java.lang.IllegalStateException:property tasks.max的[…]当前没有赋值取决于几个因素。最重要的是特殊的连接器。 特定连接器取决于其逻辑和任务值。最大计算将创建的任务数。 例如,FileStreamSourceConnector总是创建一个任务,所以即使您传递的值高于1,它也只会创建一个任务。 PostgresConnector的情况也是一样的,它与一并行

tasks.max值还应取决于其他因素,如:卡夫卡连接模式、您有多少个卡夫卡连接实例、机器的CPU等

我如何理解您正在使用SourceConnector PostgresConnector。 源连接器不轮询来自Kafka的数据。您发布的异常与某些连接器有关。 如果使用的是SinkConnector,则tasks.max不应超过分区数。
如果启动的任务数超过分区数,则某些任务将处于空闲状态,但它们不会处理数据,可能会发生重新平衡。

是否可以附加一些日志?@wardziniak我已在上面添加了跟踪,这是否有帮助?是否使用io.debezium.connector.postgresql.PostgresConnector?是@wardziniak,但这不在我的控制之下。它是0.9.2.finalSinkConnector抛出的上述异常是什么?你能附上它的配置吗?不,真的。我根本不使用源连接器。SINK CONNECTORS 38 SOURCE CONNECTORS 0 CONNECTORS使用的主题36给出以上答案,我开始认为task.max在我的情况下应该是1,但我想了解为什么大多数连接器都可以与tasks.max配合使用。max-1 config.每个主题一个分区在引擎盖下Kafka Connect使用纯消费者,因此,在这样的场景中使用多个任务是没有意义的,它通常适用于所有接收器连接器。创建的任务的确切数量是Connector::taskConfigs返回的列表的大小。如果没有长时间的重新平衡和异常,还有哪些连接器可以工作?