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

Apache kafka kafka connect在分布式模式下返回409,apache-kafka,apache-kafka-connect,confluent-platform,Apache Kafka,Apache Kafka Connect,Confluent Platform,我正在运行kafka connect分布式设置 我使用单机/进程设置(仍处于分布式模式)进行测试,工作正常,现在我使用3个节点(和3个连接进程),日志不包含错误,但当我通过rest api提交s3连接器请求时,它返回:{“error\u code”:409,“message”:“由于操作冲突(如工作人员重新平衡),无法完成请求”} 当我在其中一个节点上停止kafka connect进程时,我实际上可以提交作业,并且一切都正常运行 我的集群中有3个代理,主题的分区号是32 这是我正在尝试启动的连接

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

我使用单机/进程设置(仍处于分布式模式)进行测试,工作正常,现在我使用3个节点(和3个连接进程),日志不包含错误,但当我通过rest api提交s3连接器请求时,它返回:
{“error\u code”:409,“message”:“由于操作冲突(如工作人员重新平衡),无法完成请求”}

当我在其中一个节点上停止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"
    }
}

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

我在Kubernetes上的设置也有同样的问题。问题是我在16个节点中的每个节点上都将
CONNECT\u REST\u advised\u HOST\u NAME
设置为相同的值。这会导致不断的重新平衡问题。具有唯一的值,您应该没事

适合我的K8S解决方案:

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

与@OmriManor相同,在我的例子中,这是一个节点的问题,导致了一个重新平衡循环。我所做的是,然后我停止所有节点接受一个,然后我能够接受,因为单个节点没有导致重新平衡循环。

正如Wojciech Sznapka所说,
连接REST\u公布的主机名
rest.advised.host.name
如果您不使用Docker)是这里的问题。它不仅需要设置为唯一值,还需要设置为工作程序的正确主机名,并且可以从其他工作程序中解决

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

如果你有一组员工,你关闭了所有员工,但只有一个员工关闭了,而突然间一切都正常了,那是因为关闭了其他员工,你就保证了剩下的员工是领导者,因此不必在任何时候转发请求


有关更多详细信息,请参见

将在必要时从日志中提供更多信息:)我想我已经找到了答案,我有3个工作人员和32个分区/任务。我认为kafka connect正在尝试在3个工作人员之间平均分配工作,但无法(32/3=10.66667)。我明天将使用4个工作进程进行测试。我以前见过此错误,当时无法在每个工作进程上解析rest.Adverted.host.name。感谢您的评论,关于此配置参数的文档至少没有说明。此错误应解析为什么?其中一个工作进程的主机名?我认为他们可以通信严格通过kafka进行设置。它需要设置为机器的外部主机或IP,端口设置为
rest.port
。但据我所知,重新平衡和rest请求在工人之间直接通信,而不仅仅是通过kafka。如果这不是问题所在,那么消费者群体实际上正在重新平衡,并且没有问题集群中可能存在其他不稳定性,而不仅仅是连接正确的操作是正确配置
rest.advised.host.name
。您这样做的唯一原因是,通过关闭所有其他节点,您可以确保连接到的节点是指导节点。因为它是指导节点,因此不必转发请求t发送给作为领导者的工作人员,它使用
rest.advised.host.name
执行此操作。