こんにちは。
最近、社内のデータパイプラインの再設計をしておりまして、その中でGCPのDataflowを使う話が出てきました。その中で、Apache Beamの内容について勉強する必要があったので、それについてまとめます*1
Apache Beamとは
概要
大雑把にいうと、
- パイプライン処理を実現するためのフレームワーク
- バッチ処理とストリーミングの処理を統一的な書き方で対応することができる
- Apache Beamで書くと、このプログラムを様々なデータ処理実行エンジン(ランナーという)上で動かすことができる
というような特徴があります。
以下のスライドに、概要などがうまくまとまっています。
www.slideshare.net
Runners
元々は、GCPのDataflowだったのが、オープンソース化されました。
そのため、RunnerとしてはDataflowはもちろんのこと、現在は以下のような様々なRunnerに対応しています。
- DirectRunner: Runs locally on your machine – great for developing, testing, and debugging.
- SparkRunner: Runs on Apache Spark.
- DataflowRunner: Runs on Google Cloud Dataflow, a fully managed service within Google Cloud Platform.
SDK
現在、Apache Beam SDKは、Java/Python/Goに対応しています。また、Spotifyが出している、Scala製のScioというライブラリがあるのですが、これはJavaのラッパーです。標準で出しているSDKのうち、Javaはシンタックスが独特で、Pythonは対応している機能が限定的であるため、今回はメインでScalaを使っていこうとチームでなりました。
このSDKの使い方については、また別の記事で紹介するかもしれません。
パイプラインの構築
パイプラインの構成要素
Apache Beam Programming Guideによれば、パイプラインは次の要素で構成されています。
- Pipeline : データの処理を行うパイプライン全体を管理し、実行オプションを設定することで、そのパイプラインをどのように実行するかを指定することができる。
- PCollection : Apache Beamのデータパイプラインにおけるデータセット。パイプラインにおける各処理のStepで、入出力を表現するもの。
- PTransform : 処理のオペレーション。PCollectionをInputとして受け取って、処理を行ってからPCollectionをOutputする。様々な外部のStorageサービスからデータを読み書きすることができる
パイプライン作成の流れ
典型的なパイプラインの処理の書き方のフローとしては、以下のようになります。
1. Create a Pipeline:Pipeline ObjectをRunnerのオプションなどを指定して作成します
2. Create a initial PCollection:外部のデータソースを指定したりすることで、PCollectionを作成します
3. Apply PTransforms:PTransformを各PCollectionに対して適用していきます。PTransformで、フィルターや分析などの加工処理をPCollectionに対して施していきます
4. Run the Pipeline:作成したパイプラインをRunnerで実行します
このような流れで処理を作成します。処理の指定の仕方などは、AirflowやLuigiのようなフレームワークとほぼ一緒なので、あとは独自の仕様などに慣れるだけで、使えそうです。
今回は、Apache Beamについて調べたことをまとめてみました。実装については、別の記事で書こうかなと思います。それでは。
参考
*1:実装は別の記事でやる予定