2015-07-17 6 views
8

Ich habe einen wirklich einfachen Produzenten, den ich durch eclipse auf meinem lokalen Windows-Rechner laufe ... Was ich wirklich will ist, eine Nachricht an kafka zu richten, also werde ich sein Der Broker kann über den Tierpfleger angezeigt werden. Nur um zu sehen, wie die Kommunikation von Ende funktioniert ... zu Ende geht also hier den Code:KafkaProducer vom lokalen Rechner an hortonworks sandbox auf virtualbox senden

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(); 

jedoch nach einiger Zeit bekomme ich

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. 

I Hortonworks Sandbox-Setup haben, mit kafka Laufen, aber ich kann nicht scheinen, sich damit zu verbinden. Ich habe versucht, Portweiterleitung in den Virtualbox-Netzwerkkonfigurationen, aber immer noch das gleiche Problem. Gibt es etwas, das ich vermisse?

Antwort

9

Sie haben die Ports korrekt geöffnet, vermutlich 9092 und 2181, wenn Sie auch versuchen, einen Kafka-Consumer zu erstellen/verwenden. Kafka kündigt jedoch seinen "Hostnamen" an, den Hersteller und Verbraucher verwenden sollen. Dieser Name muss von dem Ort, an dem Sie eine Verbindung herstellen, aufgelöst werden. Der VirtualBox/VM-Hostname ist nicht da, da es keinen Eintrag auf dem Hostcomputer gibt, der ihm sagt, dass er den Hostnamen auflösen soll und in Ihrem Fall zu localhost gehen soll und nichts hilft, das wie ein DNS aufzulösen. Sie könnten Ihre Hosts-Datei bearbeiten, aber das ist zu aufdringlich. Lange Rede, kurzer Sinn, Kafka erkennt an, dass dies eine Anforderung sein könnte und stellt einen Konfigurationsparameter bereit, mit dem Sie überschreiben können, was Kafka der Welt über den Weg zum Broker erzählt. Config heißt advertised.host.name und advertised.port. Wenn Sie den Port nicht ändern, müssen Sie nur advertised.host.name einstellen.

Versuchen Sie advertised.host.name in Kafkas server.properties Konfigurationsdatei zu localhost. Dies zusammen mit dem Öffnen der Ports sollte den Trick machen.