2016-01-25 8 views
9

Ho problemi nella risoluzione dei problemi, cosa dovrebbe essere un semplice problema kafka.Kafka - Docker - Errore durante l'invio del messaggio dall'Host al Container (batch scaduto)

Sto tentando di pubblicare alcuni messaggi da kafak-console-producer. Quando digito 'ciao' ottengo:

/opt/kafka/bin/kafka-console-producer.sh --topic test --broker-list 172.17.0.21:9092 
hi 
[2016-01-25 12:56:19,839] ERROR Error when sending message to topic test with key: null, value: 2 bytes with error: Batch Expired (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 

io non sembrano essere in grado di trovare nessuna Kafka log4j-logs ...

Sono in esecuzione il server di Kafka il modo in cui è descritto nello quick-start

Posso creare l'argomento & descriverlo.

Una nota che forse importante è che il guardiano dello zoo Kafka & sono in esecuzione in una finestra mobile-contenitore (172.17.0.21) sto creando il tema e l'invio di messaggi dall'host.


Si prega di notare il sia il (Kafka-server) 9092 & (ZK) 2181 sono aperti e accessibili dall'host, ho confermato questo usando netstat & telnet.

+0

Quale versione di Kafka? Esecuzione di un'immagine pubblica di Docker o di uno che hai creato da solo? Qual è il comando 'docker run' che stai usando per avviare il contenitore? Hai modificato la configurazione predefinita di Kafka? Stai utilizzando ZK in un contenitore separato? –

+0

@MarkoBonaci - questo problema mi ha ucciso ma ho imparato molte lezioni importanti. È la mia immagine di finestra mobile. Ha pubblicato una risposta – hba

risposta

13

Si è rivelato essere più di un problema Docker ...

OK, quando si esegue il client kafka-console-consumer.sh ho visto che stava tentando di connettersi al broker utilizzando il nome del contenitore (che è i primi caratteri del un GUID).

Il mio host non può risolvere la connessione al docker-container utilizzando il nome host.

Poiché avevo già mappato le porte sul mio host, ho modificato il kafak-server config's advertised.host.name in modo che indicasse l'indirizzo IP del mio ospite.

In questo modo ogniqualvolta viene interrogato zk per il broker viene restituito l'indirizzo IP del mio host, quindi tramite il port forwarding sono connesso al broker nella finestra mobile.

+0

Sì, 'advertised.host.name 'era il mio pensiero iniziale ([un problema comune] (http://stackoverflow.com/a/34494443/465710)), ma volevo avere maggiori informazioni prima di menzionarlo. –

+0

L'hai modificato nella configurazione di kafka-server nel tuo contenitore docker? – Jonathan

0

BTW, si sa che è possibile impostare tale variabile dal comando docker run, giusto?

E.g. questo è il modo di iniziare Kafka & ZK in un unico contenitore, per il mio ambiente di sviluppo locale:

docker run --name st-kafka -p 2181:2181 -p 9092:9092 -e ADVERTISED_HOST=`docker-machine ip machine_name` -e ADVERTISED_PORT=9092 -d spotify/kafka 

Poi, per creare un argomento:

docker exec -ti st-kafka bash -c "/opt/kafka_*/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 4 --topic topic_name" 

Ecco su OS X, ed è per questo io uso docker-machine ip MACHINE_NAME.
Come potete vedere, questa è l'immagine di Spotify. Sebbene non sia stata effettuata l'ultima volta l'v0.9, è banale inserire lo Dockerfile e regolare per 0.9.

+0

grazie. Ho costruito la mia immagine ... Non stavo usando spotify. – hba

+0

Potresti risolverlo? – nanounanue

2

Sto provando con Kafka 0.10.0.0 nella finestra mobile e trovato sotto

advertised.host.name DISAPPROVATO: utilizzato solo quando advertised.listeners o listeners non sono impostati. Utilizzare invece advertised.listeners. Nome host da pubblicare su ZooKeeper per i client da utilizzare.Negli ambienti IaaS , potrebbe essere necessario che l'interfaccia sia diversa da che il broker esegue il binding. Se non è impostato, utilizzerà il valore per host.name se configurato. Altrimenti utilizzerà il valore restituito da java.net.InetAddress.getCanonicalHostName().

così insieme advertised.listeners = PLAINTEXT: // yourhost: 9092 funzionerà