0

Docker の fig.yml ファイルで Zookeeper と Kafka コンテナーを構成しました。両方のコンテナが正常に起動します。しかし、多数のメッセージを送信した後、アプリケーション /zk-client がハングします。Zookeeper のログを確認すると、次のエラーが表示されます。

Error Path:/brokers Error:KeeperErrorCode = NoNode for /brokers

私の fig.yml は次のとおりです。

zookeeper:
  image: wurstmeister/zookeeper
  ports:
    - "2181:2181"
  environment:
    ZK_ADVERTISED_HOST_NAME: xx.xx.x.xxx
    ZK_CONNECTION_TIMEOUT_MS: 6000
    ZK_SYNC_TIME_MS: 2000
    ZK_DATADIR: /path/to/data/zk/data/dir
kafka:
  image: wurstmeister/kafka:0.8.2.0
  ports:
    - "xx.xx.x.xxx:9092:9092"
  links:
    - zookeeper:zk
  environment:
    KAFKA_ADVERTISED_HOST_NAME: xx.xx.x.xxx
    KAFKA_LOG_DIRS: /home/svc_cis4/dl
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock

かなり長い間検索しましたが、まだ解決策がありません。また、ZK_DATADIR: '/path/to/zk/data/dir' を使用して fig.yml にデータ ディレクトリを設定しようとしましたが、役に立たないようです。任意の支援をいただければ幸いです。

アップデート

の内容/opt/kafka_2.10-0.8.2.0/config/server.properties:

broker.id=0
port=9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.cleaner.enable=false
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
4

2 に答える 2

2

あなたが抱えている問題は、Zookeeper のデータ ディレクトリとは関係ありません。このエラーError Path:/brokers Error:KeeperErrorCode = NoNode for /brokersは、アプリケーションが飼育係のデータでブローカー znode を見つけられないことが原因です。これはおそらく、kafka コンテナーが Zookeeper と正しく接続されていないために発生しており、wurstmeister の画像を見ると、問題が変数に関連している可能性があると思われますKAFKA_ADVERTISED_HOST_NAME。渡す必要があるenv変数を介してその変数を割り当てる理由があるかどうかはわかりませんが、私の観点からは、これは良いアプローチではありません。kafka を構成するには複数の方法があります (実際、設定する必要はなくadvertised.host.name、コメントのままにしておくことができます。kafka は docker で設定できるデフォルトのホスト名を使用します)、これを使用した迅速な解決策start-kafka.shは、イメージを編集して再構築することです。 :

#!/bin/bash

if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
    export KAFKA_ADVERTISED_PORT=$(docker port `hostname` 9092 | sed -r "s/.*:(.*)/\1/g")
fi
if [[ -z "$KAFKA_BROKER_ID" ]]; then
    export KAFKA_BROKER_ID=$KAFKA_ADVERTISED_PORT
fi
if [[ -z "$KAFKA_LOG_DIRS" ]]; then
    export KAFKA_LOG_DIRS="/kafka/kafka-logs-$KAFKA_BROKER_ID"
fi
if [[ -z "$KAFKA_ZOOKEEPER_CONNECT" ]]; then
    export KAFKA_ZOOKEEPER_CONNECT=$(env | grep ZK.*PORT_2181_TCP= | sed -e 's|.*tcp://||' | paste -sd ,)
fi

if [[ -n "$KAFKA_HEAP_OPTS" ]]; then
    sed -r -i "s/^(export KAFKA_HEAP_OPTS)=\"(.*)\"/\1=\"$KAFKA_HEAP_OPTS\"/g" $KAFKA_HOME/bin/kafka-server-start.sh
    unset KAFKA_HEAP_OPTS
fi

for VAR in `env`
do
  if [[ $VAR =~ ^KAFKA_ && ! $VAR =~ ^KAFKA_HOME ]]; then
    kafka_name=`echo "$VAR" | sed -r "s/KAFKA_(.*)=.*/\1/g" | tr '[:upper:]' '[:lower:]' | tr _ .`
    env_var=`echo "$VAR" | sed -r "s/(.*)=.*/\1/g"`
    if egrep -q "(^|^#)$kafka_name=" $KAFKA_HOME/config/server.properties; then
        sed -r -i "s@(^|^#)($kafka_name)=(.*)@\2=${!env_var}@g" $KAFKA_HOME/config/server.properties #note that no config values may contain an '@' char
    else
        echo "$kafka_name=${!env_var}" >> $KAFKA_HOME/config/server.properties
    fi
  fi
done

###NEW###
IP=$(hostname --ip-address)
sed -i -e "s/^advertised.host.name.*/advertised.host.name=$IP/" $KAFKA_HOME/config/server.properties
###END###

$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties

これで問題が解決しない場合は、コンテナ内でセッションを開始して詳細情報を取得できます (つまりdocker exec -it kafkadocker_kafka_1 /bin/bash、kafka と Zookeeperdocker exec -it kafkadocker_zookeeper_1 /bin/bashの場合)。そこで kafka ログまたは Zookeeper コンソールを確認します ( /opt/zookeeper-3.4.6/bin/zkCli.sh)

于 2015-02-13T19:00:20.310 に答える
0

過去 2 日間、問題なく動作している構成には、Zookeeper と Kafka の両方にホスト アドレスを指定することが含まれます。私のfig.ymlコンテンツは次のとおりです。

zookeeper:
  image: wurstmeister/zookeeper
  ports:
    - "xx.xx.x.xxx:2181:2181"
kafka:
  image: wurstmeister/kafka:0.8.2.0
  ports:
    - "9092:9092"
  links:
    - zookeeper:zk
  environment:
     KAFKA_ADVERTISED_HOST_NAME: xx.xx.x.xxx
     KAFKA_NUM_REPLICA_FETCHERS: 4
     ...other env variables...
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
validator:
  build: .
  volumes:
    - .:/host
  entrypoint: /bin/bash
  command: -c 'java -jar /host/app1.jar'
  links:
    - zookeeper:zk
    - kafka
analytics:
  build: .
  volumes:
    - .:/host
  entrypoint: /bin/bash
  command: -c 'java -jar /host/app2.jar'
  links:
    - zookeeper:zk
    - kafka
loader:
  build: .
  volumes:
    - .:/host
  entrypoint: /bin/bash
  command: -c 'java -jar /host/app3.jar'
  links:
    - zookeeper:zk
    - kafka

付随するDockerfileコンテンツ:

FROM ubuntu:trusty

MAINTAINER Wurstmeister

RUN apt-get update; apt-get install -y unzip openjdk-7-jdk wget git docker.io

RUN wget -q http://apache.mirrors.lucidnetworks.net/kafka/0.8.2.0/kafka_2.10-0.8.2.0.tgz -O /tmp/kafka_2.10-0.8.2.0.tgz
RUN tar xfz /tmp/kafka_2.10-0.8.2.0.tgz -C /opt

VOLUME ["/kafka"]

ENV KAFKA_HOME /opt/kafka_2.10-0.8.2.0
ADD start-kafka.sh /usr/bin/start-kafka.sh
ADD broker-list.sh /usr/bin/broker-list.sh
CMD start-kafka.sh
于 2015-02-18T05:33:58.423 に答える