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

Merpay Tech Fest 2021_Dataflow Templateを活用した宣言的なデータパイプライン / Declarative data pipeline using Dataflow Template

Merpay Tech Fest 2021_Dataflow Templateを活用した宣言的なデータパイプライン / Declarative data pipeline using Dataflow Template

Merpay Tech Fest 2021は5日間のオンライン技術カンファレンスです。

IT企業で働くソフトウェアエンジニアおよびメルペイの技術スタックに興味がある方々を対象に2021年7月26日(月)から7月30日(金)までの5日間、開催します。 Merpay Tech Festは事業との関わりから技術への興味を深め、プロダクトやサービスを支えるエンジニアリングを知れるお祭りです。 セッションでは事業を支える組織・技術・課題などへの試行錯誤やアプローチを紹介予定です。お楽しみに!

■イベント関連情報
- 公式ウェブサイト:https://events.merpay.com/techfest-2021/
- 申し込みページ:https://mercari.connpass.com/event/215035/
- Twitterハッシュタグ: #MerpayTechFest

■リンク集
- メルカリ・メルペイイベント一覧:https://mercari.connpass.com/
- メルカリキャリアサイト:https://careers.mercari.com/
- メルカリエンジニアリングブログ:https://engineering.mercari.com/blog/
- メルカリエンジニア向けTwitterアカウント:https://twitter.com/mercaridevjp
- 株式会社メルペイ:https://jp.merpay.com/

mercari

July 28, 2021
Tweet

More Decks by mercari

Other Decks in Technology

Transcript

  1. #MerpayTechFest 株式会社メルペイ Solutions Team Yoichi Nagai メーカー系SI企業に勤めるかたわら個人開発で作ったWebサービスが人 気になりスケーラビリティに苦慮していたところAppEngineに出会い Google Cloudを使い始める。

    そ 後趣味が高じてGCP専業 システム会社に転職。 2018年にメルペイに入社してSolutionsチームとして社内共用 ソリュー ションを提供。 現在 色々なデータパイプラインを作っています。
  2. #MerpayTechFest 似たようなデータ処理を別々に開発してしまいがち BigQueryへ クエリ結果を Spannerに保存して使いたい (そ 逆も) Cloud Storage にあるCSVを

    Spannerに取り込みたい (そ 逆も) Spanner テーブル 一部を別 Spannerに取り込みたい データソース、シンクが違う 同じようなデータ処理内容だけどスキーマが違う データ処理内容がちょっとだけ違う … etc マイクロサービスごとにちょっとずつ違うモジュールが作られてしまう
  3. #MerpayTechFest マイクロサービスを跨いだ処理が面倒 Microservice A Application DB Cloud Spanner Microservice B

    Application DB Cloud SQL Microservice C Data files Cloud Storage 別々 マイクロサービスに点在する、 異なるデータソースからデータを集めて結合したい Ex: ユーザごとに直近 アクティビティを集計したい 購買履歴 ユーザ属性 アクセスログ それぞれデータを読み出して数千万単位 ユーザごとに集計する処理を作る必要 Batchに加えてStreaming対応だと さらに難易度が上がる ?
  4. #MerpayTechFest Mercari Dataflow Template と コードを書かずモジュールを組み合わせてデータ処理を定義 Cloud Dataflow Job として手軽に実行できるツール

    Spanner クエリA BigQuery クエリC Spanner テーブルD Spanner テーブルE データ処理 SQL データ処理内容を 設定ファイルとして定義 Cloud Dataflow Job として実行される Spanner クエリB ※OSSとして公開しています
  5. #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を省いたり連結する 定義も可能
  6. #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で 手元 ファイルから直指定も可能 ) コマンドラインで手軽に起動
  7. #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
  8. #MerpayTechFest Mercari Dataflow Template ~Beam SQL 処理内容をSQL形式で定義できる Apache Beam モジュール

    ... ... 複数 データを 指定したSQLでJOIN ... ストリームデータ に対してSQLで 加工・結合も可 ... SQL形式で処理を定義できる でビジネスユーザでも利用できる
  9. #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で処理を定義
  10. #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分ごとに集計する 一定期間内にアクセス 多い ページを上位に置くなど 施策 ?
  11. #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によるニアリアルタイム結合 一定期間内に特定 アクションを 取ったユーザに対してクーポンを送 るなど アクションを定義 ?
  12. #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回アクセスを検知
  13. #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 により大規模データでも気にせず処理 ストリーム処理もバッチと同じ流れで利用できる
  14. #MerpayTechFest Mercari Dataflow Template 仕組み Cloud Dataflow Flex Template として実装

    実行時に処理内容を差し替えられる TemplateとしてパイプラインをGCSに登 録 実行時に処理内容をパラメータとし て指定してTemplateからDataflow Jobを開始 BigQuery 加工 Spanner クエリ テーブル Mercari Dataflow Template 利用者 (SA含む) Flex Template 機能によってプログラマー以外 人でも 手軽にCloud Dataflow ジョブを実行できる 実行
  15. #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 こんな感じ 処理を自動で組み立てる
  16. #MerpayTechFest Mercari Dataflow Template 仕組み Beam SQL など一部 処理で スキーマが必要になるため、

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

    & useLegacySql: false とすることでスキーマだけ取得可 任意 クエリ結果 スキーマ取得 任意 クエリ結果 スキーマ取得 PLANモードでanalyzeQueryを実行してスキーマ取得 Cloud Storage 上 AvroやParquet ファイルからスキーマ部分を読み込む PubSubやCloud Datastoreなど、スキーマを特定できないソース 場合 ユーザが直接指定
  18. #MerpayTechFest Mercari Dataflow Template 仕組み 様々なGCPデータソース/シンクを扱うため各スキーマ間で変換処理を実装 右側を目指したも Serialize Overheadが 思い

    ほか大きく 結局 左側で実装... 苦労 跡: https://github.com/mercari/DataflowTemplate/tree/master/src/main/java/com/mercari/solution/util/converter
  19. #MerpayTechFest Mercari Dataflow Template 開発予定 • 新モジュール
 ◦ ource /

    ink
 ▪ Dummy: 指定したスキーマでダミーデータを生成(Batch/ tream)
 ▪ Firestore: Cloud Firestoreからデータ取得
 ◦ ransform
 ▪ E : 流れるデータからリクエスト・結果を付与
 ▪ X: Xファイルを読み込んで流れるデータに推論結果を付与
 ▪ Auto / AI latform
 • ローカル実行
 ◦ 手元 Docker上で試せるように