GCPのデータ処理・ETL系サービスの使い分け

本記事は [Classi Advent Calendar 2020](https://qiita.com/advent-calendar/2020/classi) 15日目の記事です。

こんにちは。データAI部でデータエンジニアをしている@tomoyanamekawaです。

GCPにはデータ処理関連のサービスが複数あり、「Aにあるデータを加工してBに置きたい」といった処理（ETL処理）の実現方法がGCP内のサービスに限っても様々な選択肢があります。
また、`data*`といった似た名前のサービスが多く、初見だとわかりづらい部分があります。
そこでそれらサービスの使い分けの参考になればと思ってまとめます。

# GCPにあるETL処理関連のサービス紹介

ETL処理に関連するサービスだけでも下記のように複数あります。

- [Cloud Composer](https://cloud.google.com/composer)
[Apache Airflow](https://airflow.apache.org/)をベースにしたワークフロー管理サービス。
裏でGKEが立っていてユーザーからクラスターやインスタンスも見えて、少し管理が必要なのでフルマネージドサービスではない。

- [Dataflow](https://cloud.google.com/dataflow)
[Apache Beam](https://beam.apache.org/)をベースにしたデータ処理のフルマネージドサービス。
ストリーム処理とバッチ処理両方に対応しており、オートスケールにも対応しているので重い処理や複雑な処理に向いている。

- [Dataprep](https://cloud.google.com/dataprep)
GUIで操作できるデータ処理のフルマネージドサービス。
内部的にはDataflowになっていて、作成したjobはDataflowの画面でも管理できる。
データを可視化しながら加工処理ができるので、探索的に行う処理を決められる。

- [Dataproc](https://cloud.google.com/dataproc)
SparkやHadoopなどのクラスタを構築してくれるサービス。

- [Cloud Data Fusion](https://cloud.google.com/data-fusion)
GUIで操作できるDataproc。

また、BigQueryやGCSの中の機能でも、queryを定期実行してくれる[scheduled query](https://cloud.google.com/bigquery/docs/scheduling-queries)や、S3→GCS, GCS→BQなどデータ転送してくれる[Data Transfer Service](https://cloud.google.com/products/data-transfer)もあります。

さらに最近Dataformというサービスを買収したという[ニュース](https://cloud.google.com/blog/products/data-analytics/welcoming-dataform-to-bigquery)もあったので、サービスがさらに増えるかもしれません。

# いつどのサービス・機能を使えばいいのか
上記のように複数のサービスがあり、出番が被るものもありますがある程度の住み分けはあります。
そこで用途ごとにどのサービスが選択肢に入るか上げてみます。
（個人の意見です）

### データパイプライン全体の管理
- 候補になるGCPサービス・機能
    - Cloud Composer

複数のETL処理を依存関係含めてまとめて管理したい場合はワークフローエンジンの範囲なので、GCPのサービスではCloud Composer一択です。
ただCloud Composer（Airflow）はWebUI含め機能がリッチであったり、GKEを使っているためGCEなどに比べ少しお高いといった面があります。
そのためケースによっては[Digdag](https://www.digdag.io/)などの他のワークフローエンジンをGCE等のVM上で簡易に利用したほうがコスパがいいこともあります。
また、[trocco](https://trocco.io/lp/index.html)などのSaaSを利用するといった選択肢もあります。

### ストリーム処理や複雑・重いETL処理をする
- 候補になるGCPサービス・機能
    - Dataflow
    - Dataproc

この二つはできることが似ているので、よく「Dataflow vs Dataproc」といった記事を見かけます。
個人的にはすでにSparkやHadoopの資産・知見があるという場合以外はDataflowでいいんじゃないかと思っています。
GCPの公式では下の画像で使い分けが説明されていました。
<img width="300" alt="flow-vs-proc-flowchart" src="https://cloud.google.com/dataflow/images/flow-vs-proc-flowchart.svg">
(https://cloud.google.com/dataflow/images/flow-vs-proc-flowchart.svg)

DataprepやCloud Data Fusionも選択肢に入りますが、GUIベースのサービスなので複雑な処理ではコードベースで管理できるサービスのほうが好まれるかと思います。


### サクッとETL処理を試しに組みたい
- 候補になるGCPサービス・機能
    - Dataprep
    - Cloud Data Fusion

普段コードをあまり書かないデータアナリストなどがPoCやお試しでETL処理をしたい場合にGUIベースで操作できるこのあたりのサービスが良さそうです。
データソースがBQかGCSならDataprepのがBIツールライクなのでおすすめです。

### BQ内でテーブルの加工を定期的にしたい
- 候補になるGCPサービス・機能
    - Cloud Composer
    - scheduled query

BQ内で完結するのであればqueryのみで加工処理が記述してあるほうがBQの処理能力を使えてかつ、シンプルなので好ましいです。
そのためqueryをどう管理・実行するかの問題になり、このあたりのサービス・機能が候補になります。

# どう組み合わせるか
実際にデータ基盤を構築する場合には複数のサービスを組み合わせることになります。
全体を管理するためにワークフローエンジンを使うことになると思いますが、Cloud Compsoerなどのワークフローエンジンはデータ処理がメインのツールではないため、重い処理には向きません。
（Cloud composerもGKEですが、オートスケールせずにworker数を固定で運用されます。）
そのため、Cloud composerでタスクを管理して、実際の処理はDataflowやBQなどに任せるといった構成になったりします。

# まとめ
GCPにはデータ周りのサービスがいろいろあって、ややこしいけどある程度住み分けはある。
それぞれの役割や類似サービスを理解して必要十分なデータパイプラインを構築しましょう！


明日は@willsmileさんです！