Google Cloud Skill BoostのData Engineer Learning Pathを一通り受講完了したので、その中で特に分量の多かった「08Serverless Data Processing with Dataflow: Develop Pipelines」について自分なりに理解した内容をまとめます。Perplexityなども活用しながら書いております。間違い等あればご指摘ください。
Dataflowとは
Dataflowとは、Google Cloudのサービスの一つで、サーバレスでフルマネージドのETLサービスです。特徴としてはApache Beamをベースとして作られています。そのため、バッチ処理とストリーミング処理の両方に対応できます。
Apache Beamとは
Apache Beamとは上述したDataflowのベースとして使用されており、バッチ処理とストリーミング処理の両方に対応したオープンソースのデータ処理フレームワークです。特徴としては、多言語対応でJava、Python、Goなどの言語SDKが使用できます。また、ポータビリティ性があり、Dataflow上だけでなく、複数の実行エンジンで実行可能です。(Apache Flink、Apache Sparkなど)
Apache Beamの基本概念
- Pipeline(パイプライン):
データ処理の全体的な流れを表します。入力データの読み取りから変換、出力データの書き込みまでの一覧の処理をカプセル化したものです。 - PCollection(Pコレクション):
パイプライン内のデータセットを表す抽象的なオブジェクトです。バッチデータやストリーミングデータを含むことができます。 - PTransform(P変換):
PCollectionに対する変換操作を定義します。データの変換、フィルタリング、集約などの処理を行います。
参考:https://beam.apache.org/documentation/transforms/java/overview/ - Runers(ランナー):
ジョブの実行環境で前述したDataflowやApache Flink、Apache Sparkの他にローカル環境での実行をするDirect Runnerを指定することができます。 - IOコネクタ:
外部ソースからの読み込みや、外部シンクへのデータ書き込みを行うための変換操作です。
以上のPipeline、Pcollection、PTransform、Runners、IOコネクタを用いた簡単なデータフロー処理の例です。
https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/wordcount.py
Dataflowで実行するには、Pythonの仮想環境を構築し、下記コマンドを実行します。
python3 -m apache_beam.examples.wordcount --region us-central1 --input gs://dataflow-samples/shakespeare/kinglear.txt --output gs://dataflow-apache-quickstart_test-431906/results/output --runner DataflowRunner --project test--431906 --temp_location gs://dataflow-apache-quickstart_test-431906/temp/
上記のソースのPTransform中に記述されている、ParDo、DoFnという概念は下記の通りです。
-
ParDo:
PCollectionの各要素に対して並列処理を適用するための汎用的な処理関数です。入力のPCollectionの各要素に対して、ユーザ定義の処理を適用し、新しいPCollectionを生成します。
ParDoは、DoFnのインスタンスを受け取り、それをPCollectionの各要素に適用します。 -
DoFn:
ParDoで実行される具体的な処理を定義するためのクラスです。beam.DoFnを継承して作成します。DoFnはParDoによって実行される具体的な処理を定義します。
ストリーミング処理の際に必要な概念
・イベント時間(Event Time)と処理時間(Processing Time)
イベント時間とは、イベントが実際に発生した時刻を指し、データ自体に含まれるタイムスタンプに基づきます。
一方で処理時間とは、システムがイベントを処理する時刻を指し、システムの現在時刻に基づきます。
・ウィンドウ(Window)
ストリーミングデータのようなUnboundedデータ(終わりがないデータ)の場合に、ウィンドウと呼ばれる時間ベースでデータをグループ化する機能を使って、有限サイズに分割して変換処理や集計処理を実行させます。
・ウォータマーク(Watermark)
ウォータマークはシステムが自動的に計算し、データが到着する度に再計算され、継続的に更新されます。
ウォータマークによりデータが早着か遅延が決定され、ウォータマークより前に到着すれば早着データ、あとならば遅延データとみなされます。
ウォータマークは、あるウィンドウにあるすべてのデータがいつ到着するかを推測するものです。
・トリガー(Trigger)
各ウィンドウの結果を集計するタイミングを開発者が決定するためのものです。
以上のWindow、Watermark、Triggerを用いた簡単なデータフロー処理の例です。
https://github.com/GoogleCloudPlatform/training-data-analyst/blob/master/quests/dataflow_python/7_Advanced_Streaming_Analytics/solution/streaming_minute_traffic_pipeline.py
Apache Beamのコンセプトについては下記のDataflowの資料とApache Beamの資料が大変参考になり、正確かと思われます。
https://cloud.google.com/dataflow/docs/concepts/beam-programming-model?hl=ja
https://beam.apache.org/documentation/basics/