Docker環境下でKafka Connectを気軽に試す

前回の記事では、Docker Imageを使ってKafkaを立ち上げた。今回は、Kafkaを使うならほぼ確実にお世話になるKafka Connectを試したい。

Kafka Connectとは

前回の記事では、コンソールからコマンドを叩いてTopicに直接メッセージを出し入れしていた。しかし、実際のサービスではいちいちそんなことをしていられない。
そこで用意されているのがKafka Connect。これはKafkaを外部サービス(ファイルシステム・DB・MQなど)と接続するためのフレームワーク。このKafka Connectを動かしておくことで、外部サービスから直接topicとのやり取りができる。

Kafka Connectorとは

このKafka Connect上で動作し、実際に外部サービスとKafkaをつなぐアプリケーションがKafka Connector。外部サービス -> Kafkaという流れのSource Connectorと、Kafka -> 外部サービスという流れのSink Connectorの2種類がある。Kafka Connectorはいろいろなサービスに対応したものが開発されており、公式サイトでいろいろなConnectorが配布されている。

www.confluent.io

Kafka Connectを試す

前回の記事で使ったのと同様の landoop/fast-deta-dev のDocker Imageを使う。このimageを使うと、docker-compose upするだけでKafka Connectサーバが立ち上がる。

https://hub.docker.com/r/landoop/fast-data-dev

今回は、Source ConnectorとSink Connectorを両方使い、あるファイルに書き込みをすると別のファイルに反映されるようにしてみる。Source Connectorが書き込み元ファイルの変更を検知してTopicに放り込み、Sink ConnectorがTopicからメッセージを取り出して書き込み先ファイルに書く、という流れになる。

まず下準備として、書き込み元と書き込み先のファイルを作っておく。

touch /usr/local/source.txt #書き込み元
touch /usr/local/dest.txt #書き込み先
chmod 646 /usr/local/dest.txt #Kafka Connectorから書き込めるよう権限設定

また、今回使うTopicを作成する。名前はsampleTopicにした。

kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic sampleTopic

次に、Connectorを設定する。fast-data-devでは、コンソールからいろいろなConnectorを設定できる。
ブラウザからhttp://localhost:3030に行き、トップからConnectorをクリックする。

Newを押して設定画面に行き、左列(Source Connector)からFileを選択。 f:id:Udomomo:20190120230009p:plain

するとPropertiesを設定できる画面になる。 f:id:Udomomo:20190120230447p:plain

Propertiesを以下のように修正する。topicとfileの項目を足している。

name=FileStreamSourceConnector
connector.class=org.apache.kafka.connect.file.FileStreamSourceConnector
topic=sampleTopic
file=/usr/local/source.txt
tasks.max=1

これでSource Connectorは設定できた。

同様にSink Connectorも設定する。Connector選択の際は、今度は右列(Sink Connector)から選ぶのに注意。また、fileの指定はdest.txtにする。 f:id:Udomomo:20190120230601p:plain

name=FileStreamSinkConnector
connector.class=org.apache.kafka.connect.file.FileStreamSinkConnector
topic=sampleTopic
file=/usr/local/dest.txt
tasks.max=1

以下のように、2つのConnectorがTopicを挟んでつながっていれば、設定は完了。 f:id:Udomomo:20190120230754p:plain

書き込み元ファイルに何か内容を追加してみる。上書きだとConnectorに認識されないので、>>を使って追記モードにするのがポイント。

echo "Hello" >> /usr/local/source.txt
echo "Hi" >> /usr/local/source.txt

# 別ウィンドウ
tail -f usr/local/dest.txt
Hello
Hi

書き込み元のファイルに書いた内容が、書き込み先に反映されている。