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が配布されている。
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
を選択。
するとPropertiesを設定できる画面になる。
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にする。
name=FileStreamSinkConnector connector.class=org.apache.kafka.connect.file.FileStreamSinkConnector topic=sampleTopic file=/usr/local/dest.txt tasks.max=1
以下のように、2つのConnectorがTopicを挟んでつながっていれば、設定は完了。
書き込み元ファイルに何か内容を追加してみる。上書きだとConnectorに認識されないので、>>
を使って追記モードにするのがポイント。
echo "Hello" >> /usr/local/source.txt echo "Hi" >> /usr/local/source.txt # 別ウィンドウ tail -f usr/local/dest.txt Hello Hi
書き込み元のファイルに書いた内容が、書き込み先に反映されている。