サービスを選ぶ

データ処理と分析

データの流れを、取り込み、加工、分析、順序の管理の 4 段に分けて、段ごとにサービスを選びます。イベントの取り込みは Pub/Sub、新しく書く加工は Dataflow、既存の Spark や Hadoop の処理は Managed Service for Apache Spark (旧 Dataproc)、分析は BigQuery が基本です。

データ処理の問題は、データの出どころから分析までを 1 本の流れとして描けるかを問います。流れを取り込み、加工、分析、順序の管理の 4 段に分け、段ごとにサービスを 1 つ当てはめます。

取り込み加工分析Pub/SubイベントStorage TransferファイルDataflow新しく作るSpark既存のジョブBigQueryManaged Service for Apache Airflow順序、待ち合わせ、再実行
新しく作るなら上の段 (Pub/Sub、Dataflow)、既存の Spark や Hadoop を移すなら下の段を通ります。どちらも分析は BigQuery に集め、全体の順序は Airflow が管理します。

バッチかストリーミングか

最初に、データが途切れなく届くストリーミングか、まとまって届くバッチかを決めます。問題文に「リアルタイム」「数秒以内に検知」とあればストリーミング、「毎晩」「日次」「既存のバッチジョブ」とあればバッチです。Dataflow は同じコードでどちらも扱えるので、両方が混ざる要件でも選べます。

段新しく作るとき既存の資産を活かすとき
取り込み (イベント)Pub/SubPub/Sub (Kafka などからの置き換え)
取り込み (ファイル)Storage Transfer Service、Transfer Appliance同左
加工DataflowManaged Service for Apache Spark
分析BigQueryBigQuery
順序と依存の管理Managed Service for Apache Airflow同左 (既存の DAG をそのまま使える)

加工で迷ったら、既存の Spark や Hadoop のジョブがあるかで決めます。なければ Dataflow です。ゼロから作るパイプラインに Spark のクラスタを立てる構成は選びません。

Pub/Sub: サブスクリプションごとに全件届く

Pub/Sub では、送り手 (パブリッシャー) がトピックにメッセージを送り、受け手 (サブスクライバー) はトピックに付けたサブスクリプションから受け取ります。受け手が止まっても負荷が急増しても、送り手には影響しません。

送り手トピックsub-asub-b受け手 A受け手 B写し写しack 済みack なし: 再配信
サブスクリプションが 2 つなら、同じメッセージが 2 通り届きます。確認応答 (ack) が期限までに返らないと、そのサブスクリプションにだけ再配信されます。

試すPub/Sub の配信と再配信

10 秒

トピック orders経過 0 秒

サブスクリプションはまだない。

トピック orders だけがある。サブスクリプションを作ってからメッセージを送ると、そのサブスクリプションに届く。

サブスクリプションの設定では、確認応答の期限は既定 10 秒、最長 600 秒です。期限を過ぎたメッセージはもう一度配信されるので、受け手は同じメッセージが 2 回届いても困らないように作ります。確認応答されなかったメッセージは保持期間 (既定 7 日、最長 31 日) のあいだ残ります。順序キーを付けて順序指定を有効にすると、同じリージョンで送られた同じキーのメッセージは送った順に届きます。

加工せずに BigQuery の表へ入れるだけなら、BigQuery サブスクリプションで Dataflow なしに直接書き込めます。時間の窓ごとに集計するなら Dataflow を挟みます。

加工は Dataflow か Managed Service for Apache Spark

Dataflow は Apache Beam で書いたパイプラインを実行するマネージドなサービスで、ワーカーの台数を処理量に合わせて自動で増減します。Beam はバッチとストリーミングを同じモデルで書けます。5 分ごとの売上のような窓の集計と、遅れて届いたデータの扱いも Beam の機能にあり、Pub/Sub から BigQuery へ流す典型的な処理は Google のテンプレートから始められます。

Managed Service for Apache Spark は、Spark、Hadoop、Hive などをマネージドで動かすサービスです。公式ドキュメントでは、以前の Dataproc (クラスタの形) と Serverless for Apache Spark (サーバーレスの形) がこの名前にまとめられています。古い教材の Dataproc は同じサービスです。オンプレミスの Spark のジョブを、コードをほぼ変えずに移すときに選びます。ジョブのときだけクラスタを作って終われば消し、データは HDFS ではなく Cloud Storage に置くと、クラスタを消してもデータが残ります。

分析は BigQuery、順序は Airflow

BigQuery は SQL で大量のデータを分析するデータウェアハウスです。先に BigQuery に入れて SQL で加工する ELT も、Cloud Storage のファイルを外部テーブルとして直接クエリすることもできます。行単位で頻繁に更新するアプリの DB には使いません (ストレージとデータベースの選び方)。機械学習のモデル作りはAI と機械学習のサービスで扱います。

Managed Service for Apache Airflow は Apache Airflow のマネージドサービスで、Cloud Composer がこの名前へ移行していると告知されています。Python で書いた DAG で、「ファイルの到着を待つ、Spark を動かす、BigQuery で集計する、失敗したら通知する」のような複数サービスにまたがる順序と依存を管理します。Airflow はデータを加工せず、ほかのサービスに順番に仕事をさせる道具です。処理が Pub/Sub から BigQuery への 1 本だけなら要りません。

大量のデータを移す手段は日数で決める

Storage Transfer Service は、Amazon S3、Azure Blob Storage、オンプレミスのファイルシステム、HDFS などから Cloud Storage へネットワーク経由で移します。オンプレミスからは手元にエージェントを置き、他のクラウドからはエージェントなしで転送します。Transfer Appliance は、Google から届く機器にデータを書き込んで送り返す方法です。

回線 100 Mbps約 9 か月Appliance書き込み 25 日 + 取り込み約 10 営業日300 TB を Cloud Storage へ
公式ドキュメントの例です。データ量を帯域で割って 1 週間を超えるなら Transfer Appliance を選びます。

1 週間以内に終わるなら Storage Transfer Service、終わらないなら Transfer Appliance です。回線を太くする選択肢はオンプレミス・マルチクラウドとの接続で扱います。

試してみる

Cloud Shell で Pub/Sub のメッセージを送って受け取り、BigQuery の一般公開データセットに SQL を投げます。無料枠の範囲で終わります。

gcloud services enable pubsub.googleapis.com bigquery.googleapis.com

gcloud pubsub topics create orders
gcloud pubsub subscriptions create orders-sub --topic=orders

gcloud pubsub topics publish orders --message='{"order_id": 1, "amount": 1200}'
gcloud pubsub topics publish orders --message='{"order_id": 2, "amount": 800}'

gcloud pubsub subscriptions pull orders-sub --auto-ack --limit=10

もう一度 pull すると、確認済みのメッセージは返ってきません。

bq query --use_legacy_sql=false \
  'SELECT name, SUM(number) AS total
   FROM `bigquery-public-data.usa_names.usa_1910_2013`
   GROUP BY name ORDER BY total DESC LIMIT 10'

終わったらサブスクリプションとトピックを削除します。

gcloud pubsub subscriptions delete orders-sub
gcloud pubsub topics delete orders

試験で問われる判断

以下は、このカリキュラム用に作った例です。

「注文イベントを受け、5 分ごとの売上をダッシュボードに出す。セールの日の急増も取りこぼしたくない」。答えは Pub/Sub で受け、Dataflow で 5 分の窓ごとに集計し、BigQuery に書く構成です。

「オンプレミスの Hadoop で数百本の Spark のジョブが動いている。改修を最小にして移したい」。答えは Managed Service for Apache Spark で、データは Cloud Storage に移します。Dataflow は Beam への書き直しが要ります。

「500 TB をオンプレミスから移す。回線は 1 Gbps で、業務にも使っている」。答えは Transfer Appliance です。回線を使い切っても 40 日以上かかります。

「毎晩 3 つのシステムからファイルが届くのを待ち、Spark で結合し、BigQuery に読み込み、失敗したら通知する」。答えは Managed Service for Apache Airflow の DAG です。

次のページでは、ここまでのサービスをつなぐネットワークを VPC の設計で扱います。

理解度チェック

答えを開く前に、自分で考えてください。結果はこのブラウザにだけ残り、間違えた問題は復習のページでまとめて解き直せます。

思い出す

Pub/Sub の 1 つのトピックにサブスクリプションを 2 つ付けてメッセージを 1 件送ると、どう届きますか。受け手が確認応答 (ack) を期限までに返さないと、どうなりますか。

状況で選ぶ

オンプレミスの Hadoop クラスタで、Spark のバッチジョブが 200 本、毎晩動いています。開発チームは Spark に慣れていて、移行の期限が近いのでコードはほぼ変えたくありません。結果は BigQuery で分析します。加工はどこで動かしますか。

説明する

オンプレミスから Cloud Storage へ大量のデータを移すとき、Storage Transfer Service と Transfer Appliance のどちらを選ぶかを、どう決めますか。300 TB を 100 Mbps の回線で移す場合を例に説明してください。