Upgrade to Pro — share decks privately, control downloads, hide ads and more …

第104回 雲勉【オンライン】Dataflowを使ってストリーミングデータパイプラインを作成し...

第104回 雲勉【オンライン】Dataflowを使ってストリーミングデータパイプラインを作成してみよう

下記、勉強会での資料です。
https://youtu.be/8ow8sJNdJJ4

iret.kumoben

May 26, 2023
Tweet

More Decks by iret.kumoben

Other Decks in Technology

Transcript

  1. 2 • 野崎 ⾼弘(のざき たかひろ) • アイレット株式会社 クラウドインテグレーション事業部 プロジェクト企画推進セクション インフラ技術

    • インフラ構築・保守やSOCセキュリティアナリストをやってました • 現在は技術検証やドキュメント作業が主 • 趣味︓資格取得、⽝の散歩、ドラマ鑑賞、巨⼈ファン • 現在、AWSは全冠、GCPは9冠 3 ⾃⼰紹介
  2. 本セッションの内容 3 Dataflow を使⽤してリアルタイム ダッシュボード⽤のストリーミング データ パイプラインを作成する ニューヨーク市のタクシー⾞両を多数所有しているものと仮定して、リアルタイムでビジネスの状況をモニ タリングします。 タクシーの売り上げ、乗客数、乗⾞状況などを把握し、その結果を管理ダッシュボードで視覚化するための

    ストリーミング データ パイプラインを構築します。 • Google Cloudのデータ分析系サービスであるPub/Sub、BigQuery、Dataflow、Looker Studioについて 学びます。 • 内容的には、Google Cloud Professional Cloud Data Engineer 試験の内容に近いです。 (参考)A Streaming Data Pipeline for a Real-Time Dashboard with Google Cloud Dataflow
  3. 条件と対象者 4 条件 • データセットを作成するには、bigquery.datasets.create IAM 権限が必要です。 • Dataflowジョブを作成・実⾏・確認するには、roles/dataflow.admin や

    roles/dataflow.worker ロール が必要です。 • BigQuery サブスクリプションを作成するには、Pub/Sub サービス アカウントに、特定の BigQuery テーブルへの書き込みと、テーブルのメタデータの読み取りを⾏う権限が必要です。 • BigQueryでジョブ(クエリ)を発⾏するには、roles/bigquery.jobUserロールが必要です。 • Lookerを選択・データの内容を表⽰するには、access_data 及び see_looks 権限が必要となります。同 様に、ダッシュボードを選択・データの内容を表⽰するには、access_data 及び see_user_dashboards 権限が必要です。 対象者 • 普段GCPを触っている中級者向け • GCPでデータ分析をしたい • パイプラインのストリーミングから分析、視覚化までしてみたい • Google Cloud Professional Cloud Data Engineer 試験の対策も兼ねたい
  4. 事前知識︓ストリーミングパイプラインとは 6 ストリームパイプラインの具体的なデータの流れは、次のよ うになります。 1. データはデータレイク(Pub/Sub)に保存されて、メッ セージキューを通して、データの流れ(Dataflow)が制 御されます。 2. エンキューされたデータは、サブスクライバーやトピック

    によってデキューされ、その後ETL処理に渡されます。 3. ETL処理済みデータはジョブフローに乗り、それぞれが必 要なデータストア(BigQuery)へと運ばれていきます。 4. データストアに保存されたデータは随時、最新状態に更新 され、APIやBatchのインプットとなったり、あるいは機 械学習の学習時のデータセットに⽤いられたり、分析ツー ルのコンソールなどから直接SQLで参照されたりします。 ⽔ ⇨ データ ダム ⇨ データレイク 導⽔施設 ⇨ メッセージキュー 浄化 ⇨ ETL処理 配⽔池 ⇨ データストア 配⽔管 ⇨ ジョブフロー 蛇⼝ ⇨ API、Batch、分析ツール IUUQTDEOBLGTUIBUFOBDPNJNBHFTGPUPMJGFMMPOHHJG
  5. 事前知識︓Dataflow① 8 Dataflowとは、⾃動スケーリングとバッチ処理を介して、レイテンシ、処理時間、コストを最⼩限に抑える フルマネージド ストリーミング分析サービスです。 • ⼤枠ではHadoop、Sparkとかの仲間と考えればよい • イベントストリームの取り込み・処理・分析をリアルタイムで⾏う •

    サーバーレスかつレイテンシを抑えた⾼速 • 統合されたストリームデータ処理とバッチデータ処理 • 信頼性の⾼い⼀貫した1回限りの処理 • リソースの⾃動スケーリングと動的作業再調整 • Apache Beam とは、バッチとストリーミングの両⽅のデータの 並列処理パイプラインを定義するオープンソースの統合モデルです。 Apache Beam SDK を使⽤して、パイプラインを定義するプログラ ムを構築します。次いで、Dataflow などの Apache Beamがサポ ートする分散処理バックエンドの1つがパイプラインを実⾏します。
  6. 事前知識︓Dataflow② 9 Dataflowテンプレートというジョブの処理内容を定義し たものをあらかじめ登録しておき、テンプレートを指定 してジョブの実⾏を⾏います。 例えば、「Pub/Sub Topic to BigQuery」テンプレート は、Pub/SubトピックからJSON形式のメッセージを読

    み取り、それらをBigQueryテーブルに書き込むスト リーミングパイプラインです。 ⾃動スケーリングのジョブを実⾏するために必要なワー カーインスタンスの数を⾃動的に選択します。ワーカー インスタンス数は、ジョブの要件に応じて時間とともに 変化する可能性があります。
  7. 事前知識︓BigQuery① 10 BigQueryとは、機械学習、地理空間分析、ビジネスインテリジェンスなどの組み込み機能を使⽤してデータ の管理と分析を⽀援する、フルマネージドでサーバーレスのエンタープライズデータ ウェアハウスです。 • SQLクエリを使⽤して、サーバーレスによりインフラストラクチャ管理なしで課題に対応 • スケーラブルな分散型分析エンジンを使⽤すると、数TB、数PBのデータに対し、数秒もしくは数分でクエ リを完了

    • データを分析するコンピューティング エンジンとストレージの選択肢を分けることで、柔軟性を最⼤化 • BigQuery内のテーブルは、データセット(テーブルとビューへのアクセスを整理して制御するもの)に編 成される 今回はPub/Subに送信されたメッセージを集約し、 BigQueryに保存します。
  8. 事前知識︓BigQuery② 11 Googleでは、いくつかのパブリックPub/Subストリーミング データトピックを、このような検証向けに公開 しています。今回は NYC Taxi & Limousine Commission

    の公開データセット を使⽤します。このOpen Dataは、ニューヨーク市の機関やその他のパートナーによって公開されている無料の公開データです。 https://www.reddit.com/r/bigquery/wiki/datasets/#wiki_new_york_taxis_.28130_gb.2B.29 ⼀般公開データセットは、BigQueryに保存され、Google Cloud⼀般公開データセットプログラムを通じて⼀ 般提供されているデータセットです。
  9. 事前知識︓Looker Studio 12 Looker Studio(旧称データポータル)とは、データを読み取りや共有が容易で柔軟にカスタマイズできる便 利なダッシュボードとレポートに落とし込むことができるセルフサービス ビジネス インテリジェンスツール です。 •

    データの可視化をより簡単にし、洗練されたデータダッシュボードを作成するための直感的なインター フェースを提供 • 600種類以上のパートナーコネクタを通じて、豊富な データソースにアクセス • レポートテンプレートの堅牢なライブラリを利⽤して、 データを数分で可視化可能 今回は、複合グラフを使⽤したリアルタイムダッシュボード を作成して、データを可視化します。
  10. 事前知識︓Looker Studio(Looker との違いは︖) 13 Looker StudioがLookerのデータ可視化およびダッシュボード作成機能を強化したモジュールであるのに対 し、Lookerはデータ分析およびビジネスインテリジェンスの包括的なデータプラットフォーム製品 選定基準 Looker Looker

    Studio データ活⽤基盤を構築 ◎ ◯ すぐに⼿軽にデータ分析を始めたい ◯ ◎ 組織全体でデータ分析 ◎ ◯ 組織外にも共有 ◎ ◯ 既存のワークフローを活⽤ ◎ ◯ メンテナンスを効率化 ◯ △ コスト △ ◎(基本無料)
  11. 作業⼿順概要 15 No 作業内容 1 テンプレートからDataflowジョブを作成する 2 Pub/Subトピックをサブスクライブする 3 DataflowパイプラインをBigQueryにストリーミングする

    4 BigQueryでDataflowパイプラインをモニタリングする 5 SQLで結果を分析する 6 Looker Studioで主要指標を視覚化する Pub/Sub を使⽤してタクシーからストリーミング データ メッセージを収集し、Dataflow パイプラ インを介して BigQuery にフィードします。
  12. 1. Pub/SubトピックをソースとしてBigQueryデータセットを作成 17 Google Cloud コンソールで Pub/Sub トピックに適したスキーマを使⽤して、BigQuery のデータセットと テーブルを作成します。

    ここで、データセットの名前は「taxirides」、テーブルの名前は「realtime」です。このデータセットと テーブルを作成するには、以下の⼿順を⾏います。
  13. 1. Pub/SubトピックをソースとしてBigQueryデータセットを作成 18 1. BigQueryのプロジェクトIDの右横に表⽰される から、[データセットを作成] をクリック 2. [データセットID] に「taxirides」と⼊⼒

    3. [ロケーションタイプ] で [us-central1 (アイオワ)] をクリックし、[データセットを作成] をクリック 4. [エクスプローラ] ペインで をクリックして新しい taxirides データセットを表⽰ 5. taxirides データセットの右横の から、[テーブルを作成] をクリック 6. [テーブル] に「realtime」と⼊⼒ 7. [スキーマ] で [テキストとして編集] をクリックし、以下のスキーマを貼り付け 8. [パーティションとクラスタの設定] で [timestamp] を選択 9. [テーブルを作成] をクリック SJEF@JETUSJOH  QPJOU@JEYJOUFHFS  MBUJUVEFGMPBU  MPOHJUVEFGMPBU  UJNFTUBNQUJNFTUBNQ  NFUFS@SFBEJOHGMPBU  NFUFS@JODSFNFOUGMPBU  SJEF@TUBUVTTUSJOH  QBTTFOHFS@DPVOUJOUFHFS
  14. (おまけ)BigQueryアップデート(Preview) Dataform 19 このデータセットの作成作業を、2023.5.4にGAされたDataformで実現できます。 Dataformとは、SQLライクな拡張⾔語SQLXでテーブルやビュー作成クエリを記述することで、テーブル間 の依存関係を管理しながらDWHにSQLを実⾏できるデータモデリングツールです。 • DWH内でデータパイプラインを構築する ELT の

    T(変換)に特化 • SQLだけを使って、データアナリストとデータエンジニアが協⼒して、継続的に更新・ドキュメンテー ション・テストされるテーブルを使⽤し、データモデル (データの信頼できる唯⼀のソース) を構築可能 • BigQueryで、キュレートされた最新の信頼できる⽂書化されたテーブルを開発する • 依存関係を持った変換処理をバッチとして実⾏ • GitHub および GitLab と統合 • BigQuery にロードしたファイルデータに対して SQL を 実⾏して、ビューを作成するようなユースケース • 無料︕ https://cloud.google.com/dataform/docs/release-notes
  15. 2. Dataflow パイプラインを設定 20 Pub/Subからセンサーデータを読み取り、BigQueryに書き込むDataflowストリーミングデータパイプライ ンを設定します。 1. Dataflowのメニューバーの [テンプレートからジョブを作成] をクリック

    2. Dataflowジョブのジョブ名として「streaming-taxi-pipeline」と⼊⼒ 3. [リージョンエンドポイント] で、[us-central1 (アイオワ)] を選択 4. [Dataflowテンプレート] で、[Pub/Sub Topic to BigQuery] テンプレートを選択 5. [Input Pub/Sub topic]で、「projects/pubsub-public-data/topics/taxirides-realtime」と⼊⼒し、 [トピックを⼿動で⼊⼒]をクリック 6. [BigQuery output table] に参照から「realtime」を選択 7. [⼀時的な場所] で[参照]をクリックし、プロジェクトIDのバケットで[⼦リソースを表⽰] をクリック 8. [新しいフォルダを作成] をクリックして、名前に「tmp」と⼊⼒ 9. [作成]をクリックし、[選択]をクリック 10.([オプション パラメータを表⽰]をクリック) 11.(「最⼤ワーカー数」に2と⼊⼒) 12.(「ワーカーの数」に1と⼊⼒) 13. 最後に[ジョブを実⾏]をクリック
  16. 2. Dataflow パイプラインを設定 21 Google が提供する「Pub/Sub Topic to BigQuery」テンプレートを使⽤して、ストリーミングパイプライン を実⾏しました。パイプラインは⼊⼒トピックから受信データを取得します。

    これで新しいストリーミングジョブが開始され、データパイプラインが視覚的に表⽰されるようになりまし た。 データが BigQuery に移動し始めるまでに3分くらいかかります。
  17. (参考)BigQuery サブスクリプション 22 Pub/Sub から BigQuery への直接書き込み: Pub/Sub サブス クリプションを使⽤して、Pub/Sub

    から BigQuery にデータを シームレスに統合できるようになりました。 昨年7⽉末まで、データを適切なスキーマで BigQuery に取り込む前に、中間のDataflowジョブを作成する 必要がありました。Dataflow パイプラインは、BigQuery にエクスポートする変換なしの⽣データを単に必 要とするユースケースでは、不要になる場合があります。 Pub/Sub から BigQuery に直接書き込む BigQuery サブスクリプションと呼ばれる新しいタイプの Pub/Sub サブスクリプションが導⼊されました。BigQuery サブスクリプションは、メッセージを受信する と、既存の BigQuery テーブルにメッセージを書き込みます。サブスクライバー クライアントを個別に構成 する必要はありません。さらに、BigQuery へのデータ取り込みに料⾦を⽀払う必要がなくなり、使⽤した Pub/Sub に対してのみ⽀払えばよくなります。 BigQuery サブスクリプション No pipelines needed. Stream data with Pub/Sub direct to BigQuery
  18. (参考)練習問題 23 ユーザー アクティビティ データを BigQuery にリアルタイムで取り込むには︖ • データを BigQuery

    に取り込むように Pub/Sub と Dataflow ストリーミング ジョブを設定する。 ではなく • データを BigQuery にストリーミングするように Pub/Sub を設定する。 がよりベターな選択肢
  19. (おまけ1)BigQuery の料⾦体系の変更 25 2023年4⽉からBigQueryの料⾦体系が以下のように変わりました︕ • BigQueryの新価格体系がBigQuery Editions • BigQuery Editionsには2つの機能(Autoscaling、Compressed

    ストレージ)がある • Autoscalingは定額とオンデマンドのいいとこ取りで、柔軟な管理 が可能 • Compressedストレージで圧縮サイズでの課⾦が可能 詳細は弊社公開ブログをご覧ください。 「BigQueryに⼤幅アップデート︕コスト最適化の可能性あり」 Compressedストレージ
  20. 4. レポート⽤にストリームで集計を実⾏ 27 レポート⽤にストリームで集計を計算します。 1. 引き続きクエリエディターで次のように⼊⼒し、[実⾏]をクリック WITH streaming_data AS (

    SELECT timestamp, TIMESTAMP_TRUNC(timestamp, HOUR) AS `時`, TIMESTAMP_TRUNC(timestamp, MINUTE) AS `分`, TIMESTAMP_TRUNC(timestamp, SECOND) AS `秒`, ride_id, latitude, longitude, meter_reading, ride_status, passenger_count FROM taxirides.realtime ORDER BY timestamp DESC LIMIT 1000 ) # calculate aggregations on stream for reporting: SELECT ROW_NUMBER() OVER() AS `ダッシュボード_ ソート`, `分`, COUNT(DISTINCT ride_id) AS `乗⾞合計`, SUM(meter_reading) AS `収益合計`, SUM(passenger_count) AS `乗客合計` FROM streaming_data GROUP BY `分`, timestamp
  21. 4. レポート⽤にストリームで集計を実⾏ 28 最初のWITH句でサブクエリを実⾏し、以下のような情報を抽出 このテーブルを「streaming_data」とし、分ごとに meter_reading を合計(収益合計)、 passenger_count も合計(乗客合計)することで、タクシーの降⾞ごとに分単位で主要な指標が表⽰されま す。

    ちなみに TIMESTAMP_TRUNC(timestamp_expression, date_time_part[, time_zone])関数は、時刻の 切り捨てを⾏います。例えば、HOURであれば「2023-03-15 03:00:00」、MINUTEであれば「2023-03- 15 03:25:00」、SECONDであれば「2023-03-15 03:25:04」といった具合に切り詰めます。 timestamp 時 分 秒 ride_id latitude longitude meter_reading ride_status passenger_count 2023-03-15 03:25:04.40960 0 UTC 2023-03-15 03:00:00.00000 0 UTC 2023-03-15 03:25:00.00000 0 UTC 2023-03-15 03:25:04.00000 0 UTC 7f747431-196d-4098- b790-8649dbffbb7d 40.73435 -73.83607 30.914001enroute 2
  22. 6. リアルタイム ダッシュボードを作成 31 リアルタイム ダッシュボードを作成してデータを視覚化します。 1. BigQueryのエクスプローラーペインで、プロジェクトIDを展開 2. [保存したクエリ]を展開し、「My

    Saved Query」をクリック 3. クエリがクエリエディターに読み込まれるので、[実⾏]をクリック 4. [データを探索] > [Looker Studioで調べる]をクリック 5. Looker Studio が開くので、Looker Studio ウィンドウで、棒グラフをクリック 6. [グラフの追加]をクリックし、折れ線の[複合グラフ]を選択 7. [設定]ウィンドウの[期間のディメンション]で、[minute(⽇付)]にカーソルを合わせ、[X]をクリックして 削除 8. [データ]ペインで「dashboard_sort」をクリックし、[設定] > [期間のディメンション] > [ディメン ションの追加]にドラッグ 9. [設定] > [ディメンション]で、[minute]をクリックし、[dashboard_sort]を選択
  23. 6. リアルタイム ダッシュボードを作成 32 Looker Studio ではタイムスタンプとして分レベルの粒度でデータを視覚化することはサポートされていま せん。このため、独⾃の dashboard_sort ディメンションを作成しました。

    ディメンションとは、データをグループ化できる未集計の数値のセットで、どの範囲でデータを区切るかを 指定します。 10. [設定] > [指標]で「dashboard_sort」をクリックし、[total_rides]を選択 11. [設定] > [指標]で[指標を追加]をクリックし、[total_passengers]を選択 12. [設定] > [指標]で[Record Count]をクリックし、[total_revenue]を選択 13. [設定] > [並べ替え]で[total_rides]をクリックし、[dashboard_sort]を選択 14. [設定] > [並べ替え]で[昇順]をクリック 15. 最後に[スタイル]の「軸タイトルを表⽰」にチェックして仕上げる 16. [保存して共有]をクリックして、このデータソースを保存 17. [レポートに追加]をクリック
  24. 7. 時系列ダッシュボードを作成 33 1. Looker Studioで、[ + ] 空⽩のレポートテンプレートをクリック 2.

    Google Connectors のリストから、BigQueryを選択 3. [カスタムクエリ]をクリックし、プロジェクトIDを選択 4. [カスタムクエリを⼊⼒]に、次のクエリを貼り付け ⇨ 5. [データ]ペインで[フィールドの追加]をクリック 6. 左隅にある[すべてのフィールド]をクリック 7. timestampフィールドタイプを[⽇時]から[⽇付と時刻] > [⽇付、時、分] に変更 8. 上部のメニューで[グラフを追加]をクリックし、時系列グラフ を選択 9. [設定] > [ディメンション]で、[timestamp(⽇付)]をクリックし、[timestamp]を選択 10. カレンダー部分を選択し、[タイプ]で[⽇付と時刻] > [⽇付、時、分]を選択 11. [設定] > [指標]で、[Record Count]をクリックし、[meter_reading]を選択 (時系列グラフは、Pub/Subから読み込まれたデータの量とレートによって異なります) 4&-&$5  '30. UBYJSJEFTSFBMUJNF 8)&3& SJEF@TUBUVTESPQPGG
  25. (参考模擬試験問題) 34 スクーターシェアリング会社は、位置、バッテリー残量、速度など、保有するスクーターに関する情報を収 集しています。このデータはリアルタイムで可視化されます。断続的な接続を防ぐため、各スクーターは短 い間隔で特定のメッセージを繰り返し送信します。時折、データエラーも⾒受けられます。メッセージは、 Pub/Sub で受信されて BigQuery に保存されます。 データに重複がなく、空⽩フィールドのある異常なデータが拒否されるようにするには、どうすればよいで

    すか︖ A. データを BigQuery に保存して、異常なデータと重複データのクエリ削除を実⾏する。 B. Dataflow を使⽤して Pub/Sub にサブスクライブし、データを処理して BigQuery に保存する。 C. Kubernetes を使⽤して、重複データと異常データを削除できるマイクロサービス アプリケーションを 作成し、データを BigQuery に挿⼊する。 D. マネージド インスタンス グループで Compute Engine に重複データと異常データを削除できるアプリ ケーションを作成し、データを BigQuery に挿⼊する。
  26. (参考模擬試験問題解答) 35 A. データを BigQuery に保存して、異常なデータと重複データのクエリ削除を実⾏する。 B. Dataflow を使⽤して Pub/Sub

    にサブスクライブし、データを処理して BigQuery に保存する。 C. Kubernetes を使⽤して、重複データと異常データを削除できるマイクロサービス アプリケーションを作 成し、データを BigQuery に挿⼊する。⾮常に⼿間がかかり、推奨されない D. マネージド インスタンス グループで Compute Engine に重複データと異常データを削除できるアプリ ケーションを作成し、データを BigQuery に挿⼊する。⾮常に⼿間がかかり、推奨されない Dataflow は、ストリーミング データのための推奨データ処理プロダクトです。 Dataflow をプログラミングして重複を削除し、空⽩フィールドを削除して、他のカスタムデータ処理を実⾏ できます。
  27. 感想・まとめ 36 • Google Cloudのデータ分析系4サービス(Pub/Sub、BigQuery、Dataflow、Looker Studio)につい て同時に触れられるため、効率の良いスキルアップラボ • Dataflowを使⽤してストリーミングデータパイプラインを構築するための基礎的なスキルを習得できた •

    ストリームパイプラインの設定を⼿動ですることで、ストリームパイプラインのイメージができるように なった • 処理したストリーミングデータをBigQueryに格納し、可視化する⽅法を学べた • このようなダッシュボードを作成することで、ストリーミングデータの状況をリアルタイムで確認し、問 題やチャンスを素早く把握、ビジネス上の意思決定に活⽤できそう • Google Cloud Professional Cloud Data Engineer 試験対策にもなる