kafka-connect在分布式模式下返回409

时间:2018-12-11 18:27:41

标签: apache-kafka apache-kafka-connect confluent

我正在运行kafka-connect分布式设置。

我正在使用单个机器/进程设置(仍处于分布式模式)进行测试,该设置工作正常,现在我正在使用3个节点(和3个连接进程),日志中没有错误,但是当我提交一个通过rest-api的s3-connector请求,它返回:{"error_code":409,"message":"Cannot complete request because of a conflicting operation (e.g. worker rebalance)"}

当我在其中一个节点上停止kafka-connect进程时,我实际上可以提交作业,并且一切运行正常。

我的集群中有3个代理,主题的分区号为32。

这是我要启动的连接器:

{
    "name": "s3-sink-new-2",
    "config": {
        "connector.class": "io.confluent.connect.s3.S3SinkConnector",
        "tasks.max": "32",
        "topics": "rawEventsWithoutAttribution5",
        "s3.region": "us-east-1",
        "s3.bucket.name": "dy-raw-collection",
        "s3.part.size": "64000000",
        "flush.size": "10000",
        "storage.class": "io.confluent.connect.s3.storage.S3Storage",
        "format.class": "io.confluent.connect.s3.format.avro.AvroFormat",
        "schema.generator.class": "io.confluent.connect.storage.hive.schema.DefaultSchemaGenerator",
        "partitioner.class": "io.confluent.connect.storage.partitioner.TimeBasedPartitioner",
        "partition.duration.ms": "60000",
        "path.format": "\'year\'=YYYY/\'month\'=MM/\'day\'=dd/\'hour\'=HH",
        "locale": "US",
        "timezone": "GMT",
        "timestamp.extractor": "RecordField",
        "timestamp.field": "procTimestamp",
        "name": "s3-sink-new-2"
    }
}

日志中没有任何内容表明有问题,我真的在这里迷路了。

3 个答案:

答案 0 :(得分:1)

我在Kubernetes上的设置也遇到了同样的问题。问题是我在16个节点的每个节点上都将CONNECT_REST_ADVERTISED_HOST_NAME设置为相同的值。这会引起持续的重新平衡问题。有独特的价值,你应该没事。

适用于我的K8S解决方案:

- env:
  - name: CONNECT_REST_ADVERTISED_HOST_NAME
    valueFrom:
      fieldRef:
        fieldPath: status.podIP

答案 1 :(得分:0)

与@OmriManor一样,在我的情况下,这是一个节点之一的问题,导致重新平衡循环。我所做的是pause the connector,然后我停止所有节点接受一个,然后delete the connector就可以了,因为单个节点没有引起重新平衡循环。

答案 2 :(得分:0)

正如Wojciech Sznapka所说,CONNECT_REST_ADVERTISED_HOST_NAME(如果您不使用Docker,则为rest.advertised.host.name)是这里的问题。它不仅需要设置为唯一值,而且还必须设置工人的正确主机名,并且可以从其他工作器中解析

Kafka Connect使用

rest.advertised.host.name来确定如何与其他工作人员联系-例如,如果它不是领导者,则需要将REST请求转发给工作人员时。如果此配置设置不正确,则会出现问题。

如果您有一群工人,并且关闭了所有工人,但突然之间一切正常,那是因为通过关闭其他工人,您可以确保其余工人是领军人物,从而赢得了胜利不必继续转发请求。

有关更多详细信息,请参见https://rmoff.net/2019/11/22/common-mistakes-made-when-configuring-multiple-kafka-connect-workers/