【问题标题】:kafka-connect returning 409 in distributed modekafka-connect 在分布式模式下返回 409
【发布时间】:2019-05-12 19:18:23
【问题描述】:

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

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

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

我的集群中有 3 个 broker,topic 的分区号​​是 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 个工人和 32 个分区/任务。我认为 kafka-connect 试图在 3 个工作人员之间平均分配工作,并且无法(32 / 3 = 10.66667)。明天我会用 4 名工人进行测试。
  • 我之前看到过这个错误,rest.advertised.host.name 无法在每个工作人员上解决
  • 感谢您的评论,至少可以说缺少有关此配置参数的文档。这究竟应该解决什么问题?其中一名工作人员的主机名?,我认为他们严格通过 kafka 进行通信。
  • 需要设置为机器的外部主机或IP,端口设置为rest.port。但是据我所知,重新平衡和 REST 请求直接在工作人员之间进行通信,而不仅仅是通过 Kafka。如果这不是问题,那么消费者组实际上正在重新平衡,并且集群中可能存在其他不稳定性,而不仅仅是 Connect

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


【解决方案1】:

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

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

如果你有一个工人集群并且你关闭了除了一个之外的所有工人并且突然一切正常,那是因为通过关闭其他工人你保证了剩下的工人领导者并因此获胜不必转发请求。

更多详情见https://rmoff.net/2019/11/22/common-mistakes-made-when-configuring-multiple-kafka-connect-workers/

【讨论】:

    【解决方案2】:

    与@OmriManor 相同,在我的情况下,这是其中一个节点的问题,导致重新平衡循环。我所做的是pause the connector,然后我停止了所有节点接受一个,然后我能够delete the connector,因为单个节点不会导致重新平衡循环。

    【讨论】:

    • 这里正确的做法是正确配置rest.advertised.host.name。您所做的唯一原因是通过关闭所有其他节点,您可以保证您连接的节点是领导者。由于它是领导者,因此不必将请求转发给作为领导者的工作人员,它使用rest.advertised.host.name
    【解决方案3】:

    我在 Kubernetes 上的设置也遇到了同样的问题。问题是我将 CONNECT_REST_ADVERTISED_HOST_NAME 在 16 个节点中的每个节点上设置为相同的值。它会导致不断的再平衡问题。有独特的价值,你应该没问题。

    适用于我的 K8S 解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-03
      • 2019-11-30
      • 2020-05-17
      • 2018-08-13
      • 2017-06-11
      • 2020-01-02
      • 2017-06-17
      • 2018-04-21
      相关资源
      最近更新 更多