ちょっと前なのですが、JJUG CCC 2017 Fallの時に@bufferingsさんの発表を見ていて、内容以外で気になっていたことがありまして。
それは、「あのKafkaを操作しているUIなに??」
すごく便利そうだったので、内容以外にもずーっとそっちも見ていました(笑)。で、なにを使っているかは気付いたものの、
それからあまり時間が取れていなかったので、今頃ですが試そうかなと思います。
ちなみに、自分はTopic内のデータを見たい場合はTrifecta、そうでない場合はKafka Managerを使っていました。
GitHub - yahoo/kafka-manager: A tool for managing Apache Kafka.
Kafka Topics UI
Landoopが提供する、Kafka Topics UIというツールみたいです。
※この「Landoop」って文字だけデモで覚えて帰りました…
Landoop | Kafka Topics UI (rest proxy v2)
GitHub - Landoop/kafka-topics-ui: Web Tool for Kafka Topics using Kafka Rest |
GitHubの内容を見ていると、ConfluentのKafka REST Proxyを使ってApache Kafkaにアクセスするツールのようで。
GitHub - confluentinc/kafka-rest: Confluent REST Proxy for Kafka
Kafka REST Proxyは、Confluent Platformの一部らしいです。Confluent Platformについては、こちら。
What is the Confluent Platform?
ライセンス上の注意は、こちら。
Dockerで構築する
というわけで、Kafka Topics UIを使うにはApache ZooKeer、Apache Kafka以外にConfluent Kafka REST ProxyとLandoop Kafka Topics UIが必要になります、と。
どうしようかなーとダウンロードページとかインストール方法とかを見て考えた結果…
Dockerイメージを使うことにしました。
※ダウンロード時のEmailを嫌っただけです
となると、Docker Composeで立てるのがよさそうですが、@bufferingsさんが作成しているdocker-compose.ymlが
すでにあったりします。
https://github.com/bufferings/jjug2017/blob/master/tools/docker-compose.yml
まあ、自分でもやってみるかと。
いろいろSingle Nodeですが、とりあえず簡単に使うために用意したのはこちら。
docker-compose.yml
version: "3" services: zookeeper: image: confluentinc/cp-zookeeper:4.0.0 container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 networks: - kafka-cluster-network kafka: image: confluentinc/cp-kafka:4.0.0 depends_on: - zookeeper container_name: kafka environment: KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092" networks: - kafka-cluster-network kafka-rest: image: confluentinc/cp-kafka-rest:4.0.0 depends_on: - kafka container_name: kafkarest environment: KAFKA_REST_ZOOKEEPER_CONNECT: "zookeeper:2181" KAFKA_REST_HOST_NAME: "kafkarest" KAFKA_REST_LISTENERS: "http://kafkarest:8082" networks: - kafka-cluster-network kafka-topic-ui: image: landoop/kafka-topics-ui:0.9.3 depends_on: - kafka-rest environment: KAFKA_REST_PROXY_URL: "http://kafkarest:8082" PROXY: "true" ports: - "8000:8000" networks: - kafka-cluster-network networks: kafka-cluster-network:
Apache ZooKeeper、Apache Kafkaについては、特に公式のものはなさそうだったのでConfluentのDockerイメージを使うことにしました。
※ふつうにApache Kafkaのダウンロードページから取得できるApache Kafka、Apache ZooKeeperを使っても問題ありません
ConfluentのQuick Startでは、Dockerのネットワークは「host」になっていますが、そこは今回やらない方向で。
設定については、こちらを参照。
ZooKeeper
Docker Quick Start / ZooKeeper
Apache ZooKeeperへの接続ポートを指定。
zookeeper: image: confluentinc/cp-zookeeper:4.0.0 container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 networks: - kafka-cluster-network
Kafka
Docker Quick Start / Kafka
Apache ZooKeeperへの接続先と、Listenerの指定。「KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR」については、今回はパス。
kafka: image: confluentinc/cp-kafka:4.0.0 depends_on: - zookeeper container_name: kafka environment: KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092" networks: - kafka-cluster-network
REST Proxy
Docker Quick Start / REST Proxy
Schema Registryは今回使わないので、「KAFKA_REST_SCHEMA_REGISTRY_URL」はパス。あとは、Apache ZooKeeperへの接続先や、Kafka REST Proxyとしての
接続先定義。
kafka-rest: image: confluentinc/cp-kafka-rest:4.0.0 depends_on: - kafka container_name: kafkarest environment: KAFKA_REST_ZOOKEEPER_CONNECT: "zookeeper:2181" KAFKA_REST_HOST_NAME: "kafkarest" KAFKA_REST_LISTENERS: "http://kafkarest:8082" networks: - kafka-cluster-network
最後は、Kafka Topics UI。
kafka-topics / Running it
Kafka REST Proxyと別ホストで動作させる場合は、PROXYをtrueにすればよいみたいです。
kafka-topic-ui: image: landoop/kafka-topics-ui:0.9.3 depends_on: - kafka-rest environment: KAFKA_REST_PROXY_URL: "http://kafkarest:8082" PROXY: "true" ports: - "8000:8000" networks: - kafka-cluster-network
Kafka Topics UIだけは、ホスト側の8000ポートで参照可能なようにしています。
ホスト名の解決については、Docker Networkを使って解決するのが良さそうなので、networksを定義してコンテナ名を指定する方向で。
とりあえず、Apache KafkaとかApache ZooKeeperが複数Nodeになることは、今回は考えない…。
networks: kafka-cluster-network:
確認
では、起動。
$ docker-compose up
「http://localhost:8000」にアクセスしてみます。こういう画面が見れたらOKです。
Kafka REST Proxyにアクセスできない場合は、「KAFKA REST」の欄にエラーメッセージが表示され、Topic数やBroker数も認識しません。
では、ここでTopicを作ってみましょう。
$ docker exec -it kafka bash -c 'kafka-topics --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test-topic' Created topic "test-topic".
Kafka Topics UIをリロードすると、作成したTopicを認識しています。
左側に作成したTopicが現れているので、クリックするとさらに詳細を見ることができます。
最後に、データを入れてみましょう。
$ docker exec -it kafka bash -c 'kafka-console-producer --broker-list kafka:9092 --topic test-topic' >Hello Kafka >Kafka Topics UI >test
対象のTopicの「DATA」タブを選んでリロードしてみます。
登録したデータが確認できました。
これはいいですね、ちょっと使っていってみましょう。