web-dev-qa-db-ja.com

KafkaProducerをローカルマシンからvirtualboxのhortonworksサンドボックスに送信します

私は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を実行していますが、接続できないようです。virtualboxネットワーク構成でポート転送を試しましたが、同じ問題が発生します。何か足りないものがありますか? ?

10
Mez

Kafkaコンシューマーを作成/使用しようとしている場合は、デフォルトでおそらく9092と2181のポートを開くのは正しいです。Kafkaただし、使用するプロデューサーとコンシューマーへの「ホスト名」。その名前は、接続している場所から解決する必要があります。ホスト名を解決してローカルホストに移動するように指示するエントリがホスティングマシンにないため、VirtualBox/VMホスト名は解決されません。あなたの場合、DNSのようにそれを解決するのに役立つものは何もありません。ホストファイルを編集することはできますが、それはあまりにも煩わしいです。簡単に言えば、Kafkaはこれが要件である可能性があることを認め、 Kafkaは、ブローカーへのアクセス方法を世界に伝えます。構成はadvertised.Host.nameおよびadvertised.portと呼ばれます。ポートを変更しない限り、 advertised.Host.nameを設定する必要があります。

Kafkaのadvertised.Host.name構成ファイルのserver.propertiesをlocalhostに設定してみてください。これは、ポートを開くことと一緒にトリックを行う必要があります。

9
akizl