10

Kafka プロデューサーおよびコンシューマー (0.9.0) スクリプトを使用してトピックからメッセージをプッシュ/プルしようとすると、以下のエラーが発生します。

プロデューサー エラー

[2016-01-13 02:49:40,078] ERROR Error when sending message to topic test with key: null, value: 11 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

消費者エラー

> [2016-01-13 02:47:18,620] WARN
> [console-consumer-90116_f89a0b380f19-1452653212738-9f857257-leader-finder-thread],
> Failed to find leader for Set([test,0])
> (kafka.consumer.ConsumerFetcherManager$LeaderFinderThread)
> kafka.common.KafkaException: fetching topic metadata for topics
> [Set(test)] from broker
> [ArrayBuffer(BrokerEndPoint(0,192.168.99.100,9092))] failed   at
> kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:73)    at
> kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)    at
> kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
>   at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
> Caused by: java.io.EOFException   at
> org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel(NetworkReceive.java:83)
>   at
> kafka.network.BlockingChannel.readCompletely(BlockingChannel.scala:129)
>   at kafka.network.BlockingChannel.receive(BlockingChannel.scala:120)
>   at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:77)
>   at
> kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74)
>   at kafka.producer.SyncProducer.send(SyncProducer.scala:119)     at
> kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
>   ... 3 more

エラーが発生する理由と解決方法を教えてください。

構成

Mac 上の Docker コンテナーですべてのコンポーネントを実行します。ZooKeeper と Kafka は個別の Docker コンテナーで実行されます。

Docker マシン (boot2docker) IP アドレス: 192.168.99.100 ZooKeeper ポート: 2181 Kafka ポート:9092

Kafka 構成ファイルserver.propertiesは以下を設定します。

host.name=localhost
broker.id=0
port=9092
advertised.host.name=192.168.99.100
advertised.port=9092

コマンド

kafka サーバーの Docker コンテナー内から次のコマンドを実行します。パーティションが 1 つ、レプリケーション係数が 1 のトピックを既に作成しています。

リーダー指定が 0であることに注意してください。これは問題の一部である可能性があります。

root@f89a0b380f19:/opt/kafka/dist# ./bin/kafka-topics.sh --zookeeper 192.168.99.100:2181 --topic test --describe
Topic:test  PartitionCount:1    ReplicationFactor:1 Configs:
    Topic: test Partition: 0    Leader: 0   Replicas: 0 Isr: 0

次に、次のようにしてメッセージを送信します。

root@f89a0b380f19:/opt/kafka/dist# ./bin/kafka-console-producer.sh --broker-list 192.168.99.100:9092 --topic test
one message
two message
three message
four message
[2016-01-13 02:49:40,078] ERROR Error when sending message to topic test with key: null, value: 11 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
[2016-01-13 02:50:40,080] ERROR Error when sending message to topic test with key: null, value: 11 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
[2016-01-13 02:51:40,081] ERROR Error when sending message to topic test with key: null, value: 13 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
[2016-01-13 02:52:40,083] ERROR Error when sending message to topic test with key: null, value: 12 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

これは、上記で投稿した消費者エラーを生成するメッセージを消費しようとするために使用しているコマンドです。

root@f89a0b380f19:/opt/kafka/dist# ./bin/kafka-console-consumer.sh --zookeeper 192.168.99.100:2181 --topic test --from-beginning

ポートを確認21819092、Kafka Docker コンテナー内から開いてアクセスできることを確認しました。

root@f89a0b380f19:/# nc -z 192.168.99.100 2181; echo $?;
0
root@f89a0b380f19:/# nc -z 192.168.99.100 9092; echo $?;
0
4

1 に答える 1

4

解決策は、私がまったく期待していたものではありませんでした。エラー メッセージは、実際に起こっていることと一致しませんでした。

主な問題は、Docker のログ ディレクトリをローカル ファイル システムにマウントすることでした。私のdocker runコマンドは、ボリューム マウントを使用してlog.dir、コンテナー内の Kafka フォルダーを、実際に Mac にマウントされたホスト VM 上のローカル ディレクトリにマウントしました。問題だったのは後者の点です。

例えば、

docker run --name kafka -v /Users/<me>/kafka/logs:/var/opt/kafka:rw -p 9092:9092 -d kafka

私は Mac 上で docker-machine (例: boot2docker) を使用しているため/Users/、ホスト VM で boot2docker が自動マウントするパスを介してマウントする必要があります。基盤となる VM 自体がバインド マウントを使用しているため、Kafka の I/O エンジンは VM と正しく通信できませんでした。ボリューム マウントがホスト Linux VM (つまり、boot2docker マシン) 上のディレクトリに直接行われた場合、それは機能します。

Kafka I/O の詳細がわからないため、正確な詳細を説明することはできませんが、マウントされたボリュームを Mac ファイル システムに削除すると機能します。

于 2016-01-13T22:22:04.863 に答える