J'ai un fichier local kafka s'exécutant à l'aide du fichier docker-compose.yml suivant
version: '2'
services:
zookeeper:
image: "confluentinc/cp-zookeeper:5.0.1"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: "confluentinc/cp-enterprise-kafka:5.0.1"
ports:
- '9092:9092'
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_Host:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_Host://localhost:9092
KAFKA_METRIC_REPORTERS: io.confluent.metrics.reporter.ConfluentMetricsReporter
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 100
Essayer de lancer un sujet de création de base en utilisant kafka-client 2.1.0 dans Scala:
val props = new Properties()
props.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092")
val adminClient: AdminClient = AdminClient.create(props)
val newTopic = new NewTopic("test", 1, 1.toShort)
val topicsF = adminClient.createTopics(List(newTopic).asJavaCollection)
val result = topicsF.all().get()
mais après quelque temps, je reçois:
org.Apache.kafka.common.errors.TimeoutException: Timed out waiting for a node assignment.
Je peux créer un sujet en utilisant la ligne de commande:
kafka-topics --create \
--zookeeper localhost:2181 \
--replication-factor 1 \
--partitions 1 \
--topic test
Created topic "test".
L'API AdminClient de kafka a expiré pour l'attribution d'un nœud décrit un problème similaire avec Java, mais le commentaire suggère qu'un redémarrage du système a corrigé le problème, ce qui n'est pas le cas de mon côté. .
Si vous exécutez Kafka dans Docker (ou similaire), vous devez configurer les écouteurs correctement. Cet article le décrit en détail.
Voici un exemple d'un Docker Compose que vous pouvez utiliser pour accéder à Kafka à partir de votre ordinateur hôte.
Disclaimer: J'ai écrit l'article:)
Je pense que le localhost
est le problème. Dans votre bootstrap-servers
_ propriétés utilisent l'hôte publié (192.168.99.100) que vous avez défini dans votre fichier de composition, au lieu de localhost
, cela devrait fonctionner.