Kafka Remote Producer - advertised.listeners

时间:2017-06-03 23:59:40

标签: apache-kafka cloudera kafka-consumer-api kafka-producer-api

我在CDH 5.9上运行Kafka 0.10.0,群集是kerborized。 我想要做的是将消息从远程机器写入我的Kafka经纪人。 群集(安装Kafka的位置)具有内部和外部IP地址。 群集中的计算机主机名解析为专用IP,远程计算机将相同的主机名解析为公共IP地址。 我从远程机器向Kafka Broker打开了必要的端口9092(我正在使用SASL_PLAINTEXT协议),验证了使用telnet。

第一步 - 除了Kafka代理的标准属性外,我还配置了以下内容:

listeners=SASL_PLAINTEXT://0.0.0.0:9092

advertised.listeners=SASL_PLAINTEXT://<hostname>:9092

我可以用

启动控制台消费者
kafka-console-consumer --new consumer --topic <topicname> --from-beginning --bootstrap-server <hostname>:9092 --consumer.config consumer.properties

我可以在群集中的另一台机器上使用我的自定义生产者。 生产者属性的相关摘录:

security.protocol=SASL_PLAINTEXT 

bootstrap.servers=<hostname>:9092

我无法使用远程计算机上的自定义生成器:

Exception org.apache.kafka.common.errors.TimeoutException: Batch containing 1 record(s) expired due to timeout while requesting metadata from brokers for <topicname>-<partition>

使用相同的生产者属性。我可以从机器telnet Kafka Broker,/ etc / hosts包括主机名和公共IP。

第二步 - 我修改了server.properties:

listeners=SASL_PLAINTEXT://0.0.0.0:9092
advertised.listeners=SASL_PLAINTEXT://<kafkaBrokerInternalIP>:9092
  • 消费者&amp;同一集群内的生产者仍然运行良好(bootstrap 服务器现在是带有端口9092的内部IP)
  • 正如预期的远程生产者失败(但鉴于它,这是显而易见的 不知道内部IP地址)

第三步 - 毛茸茸的地方:(

listeners=SASL_PLAINTEXT://0.0.0.0:9092
advertised.listeners=SASL_PLAINTEXT://<kafkaBrokerPublicIP>:9092

开始我的消费者
kafka-console-consumer --new-consumer --topic <topicname> --from-beginning --bootstrap-server <hostname>:9092 --consumer.config consumer.properties

给了我一个警告,但我认为这不对......

WARN clients.NetworkClient: Error while fetching metadata with correlation id 1 : {<topicname>=LEADER_NOT_AVAILABLE}

开始我的消费者
kafka-console-consumer --new-consumer --topic <topicname> --from-beginning --bootstrap-server <KafkaBrokerPublicIP>:9092 --consumer.config consumer.properties

在这些日志消息之后挂起:

INFO utils.AppInfoParser: Kafka version : 0.10.0-kafka-2.1.0
INFO utils.AppInfoParser: Kafka commitId : unknown

似乎无法在正常流程中找到协调器,这将成为下一个日志:

INFO internals.AbstractCoordinator: Discovered coordinator <hostname>:9092 (id: <someNumber> rack: null) for group console-consumer-<someNumber>.

使用bootstrap.servers =:9092在集群节点上启动生产者 我和制片人一样观察:

WARN NetworkClient:600 - Error while fetching metadata with correlation id 0 : {<topicname>=LEADER_NOT_AVAILABLE}

使用bootstrap.servers = 9092在集群节点上启动生产者

org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.

使用bootstrap.servers =:9092或bootstrap.servers =:9092启动我的远程计算机上的生产者

NetworkClient:600 - Error while fetching metadata with correlation id 0 : {<topicname>=LEADER_NOT_AVAILABLE}

过去三天我一直在努力让这个工作起来,但是我没有想法:/我的理解是advertised.hostnames正是为了这个目的而服务,但要么我做错了,要么就是机器设置有问题。

非常感谢任何提示!

1 个答案:

答案 0 :(得分:0)

我最近遇到了这个问题。 在我的情况下,我启用了Kafka ACL,并在通过注释这个2配置禁用它后,问题解决了。

authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
super.users=User:kafka

我认为一个帖子可以帮助你: https://gist.github.com/jorisdevrede/a7933a99251452bb1867

最后提到的内容:

  

如果你只在Kafka Broker上使用SASL_PLAINTEXT监听器,那么你   必须确保你已经设置了   security.inter.broker.protocol = SASL_PLAINTEXT,否则你会   在客户端中收到LEADER_NOT_AVAILABLE错误。