Slide 1

Slide 1 text

#MerpayTechFest Session Title Dataflow Templateを利用した 宣言的なデータパイプライン Yoichi Nagai 株式会社メルペイ Solutions Team

Slide 2

Slide 2 text

#MerpayTechFest 株式会社メルペイ Solutions Team Yoichi Nagai メーカー系SI企業に勤めるかたわら個人開発で作ったWebサービスが人 気になりスケーラビリティに苦慮していたところAppEngineに出会い Google Cloudを使い始める。 そ 後趣味が高じてGCP専業 システム会社に転職。 2018年にメルペイに入社してSolutionsチームとして社内共用 ソリュー ションを提供。 現在 色々なデータパイプラインを作っています。

Slide 3

Slide 3 text

#MerpayTechFest アジェンダ マイクロサービスにおけるデータ処理 課題 Mercari Dataflow Template 紹介 Mercari Dataflow Template 仕組み 02 03 01

Slide 4

Slide 4 text

#MerpayTechFest マイクロサービスにおける データ処理 課題

Slide 5

Slide 5 text

#MerpayTechFest マイクロサービスにおけるデータ処理 課題 似たようなデータ処理を別々に開発してしまいがち 01 簡単な設定で動かせる再利用可能なデータパイプラインが欲しい マイクロサービスを跨いだデータ処理が面倒 02 別々に読み込んだ様々なデータを統合的に処理する仕組みが欲しい

Slide 6

Slide 6 text

#MerpayTechFest 似たようなデータ処理を別々に開発してしまいがち BigQueryへ クエリ結果を Spannerに保存して使いたい (そ 逆も) Cloud Storage にあるCSVを Spannerに取り込みたい (そ 逆も) Spanner テーブル 一部を別 Spannerに取り込みたい データソース、シンクが違う 同じようなデータ処理内容だけどスキーマが違う データ処理内容がちょっとだけ違う … etc マイクロサービスごとにちょっとずつ違うモジュールが作られてしまう

Slide 7

Slide 7 text

#MerpayTechFest マイクロサービスを跨いだ処理が面倒 Microservice A Application DB Cloud Spanner Microservice B Application DB Cloud SQL Microservice C Data files Cloud Storage 別々 マイクロサービスに点在する、 異なるデータソースからデータを集めて結合したい Ex: ユーザごとに直近 アクティビティを集計したい 購買履歴 ユーザ属性 アクセスログ それぞれデータを読み出して数千万単位 ユーザごとに集計する処理を作る必要 Batchに加えてStreaming対応だと さらに難易度が上がる ?

Slide 8

Slide 8 text

#MerpayTechFest Mercari Dataflow Template 紹介

Slide 9

Slide 9 text

#MerpayTechFest Mercari Dataflow Template と コードを書かずモジュールを組み合わせてデータ処理を定義 Cloud Dataflow Job として手軽に実行できるツール Spanner クエリA BigQuery クエリC Spanner テーブルD Spanner テーブルE データ処理 SQL データ処理内容を 設定ファイルとして定義 Cloud Dataflow Job として実行される Spanner クエリB ※OSSとして公開しています

Slide 10

Slide 10 text

#MerpayTechFest Mercari Dataflow Template 使い方 ● データ処理内容をJSON形式で定義 ○ Sources, Transforms, Sinks 3種類を組み合わせ ● Source -> Transform -> Sink で処理を定義 { "sources": [{ "name": "bigqueryInput", "module": "bigquery", "parameters": {...} }], "transforms": [{ "name": "beamsqlTrans", "module": "beamsql", "inputs": ["bigqueryInput"], "parameters": {...} }], "sinks": [{ "name": "spannerOutput", "module": "spanner", "input": "beamsqlTrans", "parameters": {...} }] } 各Module 入力対象 nameをinputで指定 source1 sink1 transform1 source2 sink2 transform2 一つ Module 出力を 複数モジュールが利用したり Transformを省いたり連結する 定義も可能

Slide 11

Slide 11 text

#MerpayTechFest Mercari Dataflow Template 使い方 { "sources": [{ "name": "bigqueryInput", "module": "bigquery", "parameters": { "query": "SELECT …." } }], "sinks": [{ "name": "spannerOutput", "module": "spanner", "input": "bigqueryInput", "parameters": { "projectId": "….", "instanceId": "….", "databaseId": "….", "table": "…." } }] } gcloud dataflow flex-template run jobname \ --project=myproject \ --gcs-location=gs://example-bucket/mytemplate \ --parameters=config=gs://example-bucket/config.json gcloudコマンドで実行 事前にデプロイした Mercari Dataflow Template 設定ファイルをGCSに置いてパスを指定 (REST APIで 手元 ファイルから直指定も可能 ) コマンドラインで手軽に起動

Slide 12

Slide 12 text

#MerpayTechFest Mercari Dataflow Template モジュール ource / ink
 ● torage (avro, parquet, json, csv)
 ● Big uery
 ● panner
 ● Datastore
 ● JDBC
 ● Bigtable
 ● ub ub
 ransform
 ● Beam 
 ● GroupBy
 ● Window
 ● Java cript
 ● rotobuf
 ● ...そ 他随時追加
 AWS S3にも対応 https://github.com/mercari/DataflowTemplate/tree/master/docs/config/module

Slide 13

Slide 13 text

#MerpayTechFest Mercari Dataflow Template ~Beam SQL 処理内容をSQL形式で定義できる Apache Beam モジュール ... ... 複数 データを 指定したSQLでJOIN ... ストリームデータ に対してSQLで 加工・結合も可 ... SQL形式で処理を定義できる でビジネスユーザでも利用できる

Slide 14

Slide 14 text

#MerpayTechFest Mercari Dataflow Template 利用例(Batch) それぞれ異なるマイクロサービスにある 2つ Spannerテーブルへ クエリと BigQueryへ クエリ結果をJOINして加工. 各数千万件オーダー データを30分で処理 SELECT BigQueryInput.UserID AS UserID, IF(BigQueryInput.Count IS NULL, SpannerInput1.Count, BigQueryInput.Count) AS Count, IF(BigQueryInput.Sales IS NULL, SpannerInput2.Sales, BigQueryInput.Sales) AS Sales FROM BigQueryInput LEFT JOIN SpannerInput1 ON BigQueryInput.UserID = SpannerInput1.UserID LEFT JOIN SpannerInput2 ON BigQueryInput.UserID = SpannerInput2.UserID SQLで処理を定義

Slide 15

Slide 15 text

#MerpayTechFest Mercari Dataflow Template 利用例(Streaming) SQLを指定してストリーミング処理実行 SELECT url, COUNT(user_id) AS view_count FROM access_events WHERE action = "view" GROUP BY url, TUMBLE(created_at, 'INTERVAL 1 MINUTE') HAVING view_count >= 5 created_at 値で 1分ごとに集計する 一定期間内にアクセス 多い ページを上位に置くなど 施策 ?

Slide 16

Slide 16 text

#MerpayTechFest Mercari Dataflow Template 利用例(Streaming) SELECT user_id, SUM(A.view_num) AS view_count, SUM(B.sales) AS sales_sum FROM access_events AS A LEFT JOIN buy_events AS B ON A.user_id = B.user_id GROUP BY user_id, SESSION(event_timestamp, 'INTERVAL 5 MINUTE') created_at 値で 5分間レコードが無けれ そ 時点で集計 複数 データソース SQLによるニアリアルタイム結合 一定期間内に特定 アクションを 取ったユーザに対してクーポンを送 るなど アクションを定義 ?

Slide 17

Slide 17 text

#MerpayTechFest Mercari Dataflow Template 利用例(Streaming) 固定とストリームでデータ 併用 WITH whitelist AS ( SELECT user_id FROM bigquery_whitelist_table ), events AS ( SELECT user_id, SUM(view) AS view_count FROM pubsub_event_topic GROUP BY TUMBLE(event_timestamp, 'INTERVAL 1 MINUTE') HAVING view_count > 5 ) SELECT A.user_id FROM events AS E INNER JOIN whitelist AS W ON E.user_id = W.user_id 固定的なBQクエリ結果と ストリームなPubSubメッセージを結合 固定データ 起動時に全部読み込み 留まり続けてWindowごとにJOINされる ホワイトリストユーザが 1分間に5回アクセスを検知

Slide 18

Slide 18 text

#MerpayTechFest Mercari Dataflow Template 利用例(Micro Batch) BQやSpannerに定期的にクエリを実行してストリーム処理 指定した間隔で クエリを実行 間隔を合わせることで別々 DB データをニアリアルタイムに結合するこ とも クエリ フィルタ条件も間隔ごとに埋め 込まれる

Slide 19

Slide 19 text

#MerpayTechFest Mercari Dataflow Template 仕組み

Slide 20

Slide 20 text

#MerpayTechFest Mercari Dataflow Template 仕組み Cloud Dataproc Cloud Dataflow On-Premises Hadoop Cluster Local Compute Local Compute …. 分散処理 フレームワーク 計算リソース Batch&Streaming 統合フレームワーク …. Apache Beam Compute Engine Cloud Dataflow Flex Template として実装 - 分散実行&インフラ管理 - フルマネージド - オートスケール - 動的リバランシング プログラミングモデル - バッチ処理とストリーム処理を統合 - 複数実行環境対応: Spark, Flink等 - 対応言語: Java, Python, Go Cloud Dataflow により大規模データでも気にせず処理 ストリーム処理もバッチと同じ流れで利用できる

Slide 21

Slide 21 text

#MerpayTechFest Mercari Dataflow Template 仕組み Cloud Dataflow Flex Template として実装 実行時に処理内容を差し替えられる TemplateとしてパイプラインをGCSに登 録 実行時に処理内容をパラメータとし て指定してTemplateからDataflow Jobを開始 BigQuery 加工 Spanner クエリ テーブル Mercari Dataflow Template 利用者 (SA含む) Flex Template 機能によってプログラマー以外 人でも 手軽にCloud Dataflow ジョブを実行できる 実行

Slide 22

Slide 22 text

#MerpayTechFest Mercari Dataflow Template 仕組み { "sources": [{ "name": "bigqueryInput", "module": "bigquery", "parameters": {...} }], "transforms": [{ "name": "beamsqlTrans", "module": "beamsql", "inputs": ["bigqueryInput"], "parameters": {...} }], "sinks": [{ "name": "spannerOutput", "module": "spanner", "input": "beamsqlTrans", "parameters": {...} }] } 実行時にJSONファイルをパースして Beam 処理を組み立ててDataflowにJobをSubmit こんな感じ 処理を自動で組み立てる

Slide 23

Slide 23 text

#MerpayTechFest Mercari Dataflow Template 仕組み Beam SQL など一部 処理で スキーマが必要になるため、 処理に沿ってスキーマを伝搬させる仕組みを用意 source1 sink1 transform 1 source2 sink2 transform 2 必ずBeam 処理を組み立てる際に データソースからスキーマを取得。 後段に伝搬(処理に応じて 加工)させる スキーマを伝搬させることで、 スキーマが必要な処理/保存形式へ 対応や 宛先テーブルがない場合に自動生成が可能に

Slide 24

Slide 24 text

#MerpayTechFest Mercari Dataflow Template 仕組み 様々なGCPデータソースからデータ取得時にスキーマも取得/推定する Jobs.insert API で dryRun & useLegacySql: false とすることでスキーマだけ取得可 任意 クエリ結果 スキーマ取得 任意 クエリ結果 スキーマ取得 PLANモードでanalyzeQueryを実行してスキーマ取得 Cloud Storage 上 AvroやParquet ファイルからスキーマ部分を読み込む PubSubやCloud Datastoreなど、スキーマを特定できないソース 場合 ユーザが直接指定

Slide 25

Slide 25 text

#MerpayTechFest Mercari Dataflow Template 仕組み 様々なGCPデータソース/シンクを扱うため各スキーマ間で変換処理を実装 右側を目指したも Serialize Overheadが 思い ほか大きく 結局 左側で実装... 苦労 跡: https://github.com/mercari/DataflowTemplate/tree/master/src/main/java/com/mercari/solution/util/converter

Slide 26

Slide 26 text

#MerpayTechFest おわりに

Slide 27

Slide 27 text

#MerpayTechFest Mercari Dataflow Template 開発予定 ● 新モジュール
 ○ ource / ink
 ■ Dummy: 指定したスキーマでダミーデータを生成(Batch/ tream)
 ■ Firestore: Cloud Firestoreからデータ取得
 ○ ransform
 ■ E : 流れるデータからリクエスト・結果を付与
 ■ X: Xファイルを読み込んで流れるデータに推論結果を付与
 ■ Auto / AI latform
 ● ローカル実行
 ○ 手元 Docker上で試せるように


Slide 28

Slide 28 text

#MerpayTechFest Mercari Dataflow Template 開発予定 OSSとして公開している で興味ある方 触ってみてください! PRやフィードバック、要望など 気軽にもらえるとうれしいです! https://github.com/mercari/DataflowTemplate