将KafkaProducer从本地计算机发送到virtualbox上的hortonworks沙箱

时间:2015-07-17 13:13:42

标签: hadoop bigdata apache-kafka hortonworks-data-platform

我有一个非常简单的制作人,我在我的Windows本地机器上运行eclipse ...我真正想要的是通过kafka获取消息,所以我将能够通过zookeeper查看代理。只是为了看看通信如何在端到端工作......所以这里是代码:

Properties props = new Properties();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9020");
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

    KafkaProducer<String,String> producer = new KafkaProducer<String,String>(props);

    boolean sync = true;
    String topic="mytopic";
    String key = "mykey";
    String value = "myvalue";

    ProducerRecord<String,String> producerRecord = new ProducerRecord<String,String>(topic, key, value);

    if (sync) {
        producer.send(producerRecord).get();
    } else {
        producer.send(producerRecord);
    }

    producer.close();

然而,过了一段时间我得到了

Exception in thread "main" java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.
at org.apache.kafka.clients.producer.KafkaProducer$FutureFailure.<init>(KafkaProducer.java:437)
at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:352)
at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:248)
at kafkaProducer.TestProducer.main(TestProducer.java:30)  Caused by: org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.

我有hortonworks沙盒设置,kafka正在运行,但我似乎无法连接到它。我尝试在虚拟机网络配置中进行端口转发,但仍然存在相同的问题。有什么东西我不见了吗?

1 个答案:

答案 0 :(得分:9)

如果您还尝试创建/使用Kafka消费者,则打开端口是正确的,默认情况下可能是9092和2181。然而,Kafka将其“主机名”广告给生产者和消费者使用,该名称需要从您连接的地方解决。 VirtualBox / VM主机名没有,因为托管计算机上没有任何条目告诉它解析主机名并转到你的案例中的localhost,没有任何东西可以像DNS那样帮助解决它。您可以编辑您的主机文件,但这太侵入了。简而言之,Kafka承认这可能是一项要求,并为您提供配置参数,以覆盖Kafka告诉全世界如何到达经纪人的内容。配置称为advertised.host.nameadvertised.port。除非您更改端口,否则只需设置advertised.host.name

尝试将Kafka的advertised.host.name配置文件中的server.properties设置为localhost。这与打开端口一起应该可以解决问题。