Apache Flink PlaygroundsでApache FlinkとApache Kafkaによるストリーム処理の雰囲気を感じてみた

Amazon Kinesis Data Analyticsでは、Apache Flinkをベースとしたストリーム処理が可能です。 Apache Flink PlaygroundsはFlinkの機能を手早く試せる環境をDocker Composeを使って構築できます。 今回はApache Flinkがどういったものなのかを知る為にApache Flink Playgroundsで遊んでみました。

Apache Flink is an open source platform for distributed stream and batch data processing. Flink’s core is a streaming dataflow engine that provides data distribution, communication, and fault tolerance for distributed computations over data streams. Flink builds batch processing on top of the streaming engine, overlaying native iteration support, managed memory, and program optimization.

Apache Flink 1.9 Documentation: Apache Flink Documentationより

やってみる

今回作成するPlayground環境は、次のようなデータの流れをFlinkとKafkaで構成します。

  • Javaでクリックイベントデータを生成
  • 生成したデータをKafkaのinputトピックに流し込む
  • Flinkでページごとのイベント数をウインドウ時間ごとに集計
  • 集計後データをKafkaのoutputトピックに流し込む

環境作成

Playground用のリポジトリをローカルにクローンしてきて、Docker Composeで各種コンテナを立ち上げます。

git clone --branch release-1.9 https://github.com/apache/flink-playgrounds.git
cd flink-playgrounds/operations-playground
docker-compose build
docker-compose up -d
docker-compose ps

FlinkやKafka、ZooKeeperのコンテナが起動しているのが確認できます。

WebUI

環境を作成したら、http://localhost:8081 からWebUIにアクセスできます。 WebUIからは動かしているジョブの確認や新しいジョブのサブミットなどが可能なようです。

ジョブのワークフローも次のように確認できます。

入力と出力の確認

Kafkaコンテナでkafka-console-consumerを実行することで、Kafkaのトピックに流れているデータを確認できます。まずはinputトピックからみてみます。

docker-compose exec kafka kafka-console-consumer.sh \
  --bootstrap-server localhost:9092 --topic input

大量のjson形式のデータが流れているのが確認できます。秒間で1000レコード程度のようです。

続いて、outputトピックの方も確認してみます。

docker-compose exec kafka kafka-console-consumer.sh \
  --bootstrap-server localhost:9092 --topic output

こちらは15秒ごとに集計されたデータなので、流量は少ないです。

耐障害性の確認

Flinkはデータに対してexactly-onceの処理を行います。これは障害時も同様です。 これからわざとFlinkのタスクマネージャを落とし、しばらくした後に復帰させることで、このexactly-onceを確認してみます。

まずはタスクマネージャのコンテナを強制停止します。

docker-compose kill taskmanager

タスクが停止していることが、FlinkのWebUIからわかります。

タスクが停止しているため、Kafkaのoutputトピックにはデータが流れてきません。

それでは、タスクマネージャのコンテナを再び起動させてみます。

docker-compose up -d taskmanager

ジョブのステータスがCREATEDを経てRUNNINGに変化しました。

Kafkaのoutputトピックに流れる集計データはジョブが停止していた分も含めて流れてきました。

15秒ごとにデータが正しく集計されていることがわかります。 Flinkの耐障害性については以下のドキュメントで解説されています。興味のある方はご参照ください。

後片付け

遊び終えたら、起動していたコンテナを終了し、後片付けします。

docker-compose down -v

さいごに

Apache FlinkをApache Flink Playgroundsで環境を作り、Flinkの雰囲気や耐障害性についてざっくり確認しました。