2015-07-17 21 views
8

Ho un produttore molto semplice che sto eseguendo eclipse sulla mia macchina locale Windows ... Quello che voglio veramente è far passare un messaggio a kafka, quindi sarò in grado di visualizzare il broker tramite zookeeper. Giusto per vedere come funziona la comunicazione da un capo all'altro ... quindi ecco qui il codice:Invia KafkaProducer dalla macchina locale alla sandbox di hortonworks su virtualbox

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

Tuttavia dopo qualche tempo ricevo

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. 

ho Hortonworks configurazione sandbox, con Kafka corsa, ma io non riesco a connetterci ad esso. Ho provato il port forwarding nelle configurazioni di rete della virtualbox ma ho ancora lo stesso problema. C'è qualcosa che mi manca?

risposta

9

È corretto aprire le porte, presumibilmente 9092 e 2181 per impostazione predefinita se si sta tentando di creare/utilizzare un utente Kafka. Kafka, tuttavia, pubblicizza il suo "nome host" per i produttori e i consumatori, il cui nome deve essere risolto dal punto in cui ci si connette. Il nome dell'host di VirtualBox/VM non esiste perché non c'è una voce sul computer host che gli dica di risolvere il nome host e di andare su localhost nel tuo caso e non c'è nulla che possa risolverlo come un DNS. Puoi modificare il tuo file hosts ma è troppo invadente. Per farla breve, Kafka riconosce che questo potrebbe essere un requisito e fornisce un parametro di configurazione per farvi ignorare ciò che Kafka dice al mondo su come arrivare al broker. La configurazione è denominata advertised.host.name e advertised.port. A meno che non si cambi la porta, sarà sufficiente impostare advertised.host.name.

Provare a impostare advertised.host.name nel file di configurazione server.properties di Kafka su localhost. Questo insieme all'apertura delle porte dovrebbe fare il trucco.