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

Hadoop 将KafkaProducer从本地计算机发送到virtualbox上的hortonworks沙箱,hadoop,bigdata,apache-kafka,hortonworks-data-platform,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.VAL

我有一个非常简单的生产者,我正在我的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();
Properties=newproperties();
put(ProducerConfig.BOOTSTRAP\u SERVERS\u CONFIG,“localhost:9020”);
put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,StringSerializer.CLASS.getName());
put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.CLASS.getName());
卡夫卡制作人=新卡夫卡制作人(道具);
布尔同步=真;
字符串topic=“mytopic”;
String key=“mykey”;
String value=“myvalue”;
ProducerRecord ProducerRecord=新的ProducerRecord(主题、键、值);
如果(同步){
producer.send(producerRecord.get();
}否则{
生产商发送(生产商记录);
}
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.
线程“main”java.util.concurrent.ExecutionException中的异常:org.apache.kafka.common.errors.TimeoutException:在60000毫秒后更新元数据失败。 位于org.apache.kafka.clients.producer.KafkaProducer$futurefilure(KafkaProducer.java:437) 位于org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:352) 位于org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:248) 在kafkaProducer.TestProducer.main(TestProducer.java:30)上,由于以下原因导致:org.apache.kafka.common.errors.TimeoutException:未能在60000毫秒后更新元数据。
我有hortonworks沙盒设置,kafka正在运行,但我似乎无法连接到它。我尝试在virtualbox网络配置中进行端口转发,但仍然存在相同的问题。有什么我遗漏的吗?

如果您还试图创建/使用卡夫卡消费者,那么打开端口(默认情况下可能是9092和2181)是正确的。然而,卡夫卡向制作人和消费者宣传其“主机名”以供使用,该名称需要从您连接的位置解析。VirtualBox/VM主机名不存在,因为在您的情况下,主机上没有任何条目告诉它解析主机名并转到localhost,并且没有任何东西像DNS那样有助于解析主机名。你可以编辑你的主机文件,但那太麻烦了。长话短说,Kafka承认这可能是一项要求,并为您提供了一个配置参数,以覆盖Kafka告诉世界如何访问代理的内容。配置被称为
advised.host.name
advised.port
。除非更改端口,否则只需设置播发的.host.name

尝试将Kafka的
server.properties
配置文件中的
advised.host.name
设置为localhost。这与打开端口一起应该可以达到目的