データパイプラインの基礎
データパイプライン
データが流れる経路や処理のための基盤全体のことを指す。すなわちデータの発生源から分析結果を利用する現場までのインフラ基盤ということになる。
データパイプラインの Producer 側の構成
1. Producer(ミドルウェア) が直接 Kafka に送信する
ミドルウェアが Kafka への Message 送信機構を持っている場合は有効。ミドルウェアの標準機構として存在しなくても、ミドルウェアのプラグインとして存在する場合がある。
例えば
などのミドルウェアは標準機構として Kafka へ結果を送信することが可能。
2. Producer(ミドルウェア) が他のツールを経由して Kafka に送信する
ミドルウェアが Kafka への Message 送信に対応していない場合は一度何らかの形式でデータを出力し、データ送信を行うミドルウェアとは別のメッセージ送信ツールを利用して Kafka へ送信する。
たとえば Web サーバのアクセスログ収集などのユースケースの場合、Web サーバ自体には Kafka への送信機構を持っていないので、ローカルまたはNASなどにログファイルを出力したあと、別のメッセージ送信ツールで Kafka へ Message を送信することになる。IoT などのセンサーデバイスが MQTT という軽量プロトコルを利用してデータを送信することがある。この場合はデータを Kafka に送信するために、プロトコル変換の目的でツールを利用することがある。
ミドルウェアが出力したデータを Kafka へ送信するツールの代表例は Kafka Connect と Fluentd がある。
データパイプラインの Consumer 側の構成
1. ミドルウェアが直接 Kafka から Message を取得して処理する
データの処理を行うミドルウェアが Kafka からの Message 受信に対応している場合である。バッチ処理・ストリーム処理のいずれも対応できるが、ストリーム処理のほうが多い(とのこと)。ストリーム処理に対応したミドルウェアは Spark, Apache Flink などがある。Consumer が Kafka から Message を取得した後に再度 Kafka に Message を出力するケースがある。IoT のユースケースでセンサー側からのデータを Consume してエンリッチメントなどの処理をした後に Kafka に Produce するケースなどもそうである。
2. ミドルウェアから他のツールを介して Kafka からの Message を取得し、処理する
ミドルウェアが Kafka からの Message 受信に対応していないケースである。他のツールが一度 Message を受け取り、目的のシステムなどにデータを受け渡す方式である。代表例は Kafka Connect と Fluentd がある。
データパイプラインの処理の性質
複数のミドルウェアやアプリケーションによってデータが読み書きされる
データは様々な Producer、Consumer によって扱われるので、データの形式は重要。
アプリケーションなどが常時起動して処理をしている
ストリームデータ、ストリーム処理による性質である。ストリームデータは継続的に生成されるため、受信するアプリケーションも継続的に処理をしなければならない。
設計のポイントとしては以下がある。
1. Message のデータ型
Message が扱うデータ型は Producer 側と Consumer 側で整合性が取れていなければならない。Producer からは送信する Message の Key, Value のデータ型が指定され、データをシリアライズして送信される。Consumer はデータをデシリアライズして受信するが、Producer から送信される Message のKey. Value のデータ型および含まれるデータを意識して設計・実装する必要がある。データベースなどを介した処理などでは、テーブルの型が指定されるので、当然のように思える。ただ Kafka の仕組みとしてデータ型を管理していないので、 Kafka ではデータ型の不整合を検知できない。
Producer 側から送信される Message のデータ型が変更になる場合は Consumer のアプリケーションも改修する必要がある。
2. スキーマ構造を持つデータ・フォーマットの利用とスキーマエボリューション
データに複数の値を含ませたい場合がある。その場合において、ストリームデータやストリーム処理では JSON や Apache Avro といった構造化データフォーマットがよく利用される。これによって 1 つの Message に複数の値を含めることができる。
スキーマエボリューションとは、スキーマ定義が運用中に変更されることを指す。
3. データの表現方法
時刻系の話など。UnixTime で保持するのか文字列で表現するのかなど。