Slide 1

Slide 1 text

Merpay DataPlatform @syucream Stream Data Pipeline for Microservices

Slide 2

Slide 2 text

2 whoami Copyright © Merpay, Inc. All Rights Reserved. @syucream DataPlatform team at Merpay

Slide 3

Slide 3 text

3 マイクロサービスとデータのユースケース 01 Agenda 02 ● アプリケーションとデータの分離 ● メルペイにおけるデータのユースケース Merpay DataPipeline 概要 ● steam のデータ転送のサポート ● 技術スタック Copyright © Merpay, Inc. All Rights Reserved. 03 Production Ready Stream DataPipeline ● 初期段階でのパイプライン設計とその思想 ● Dataflow jobs の開発と運用

Slide 4

Slide 4 text

マイクロサービスと データのユースケース

Slide 5

Slide 5 text

Microservices in Merpay ServiceA ServiceB ServiceC App App App

Slide 6

Slide 6 text

Microservices in Merpay ServiceA ServiceB ServiceC App App App 1. 分離されたアプリケーション 2. 分離された DB (無い場合もある) 3. 独立したマイクロサービスチーム

Slide 7

Slide 7 text

Data sources vs usecases D-service B-service A-service C-service KPI Analytics Fraud Detection Credit Scoring Funnel Analytics ML system Customer Support

Slide 8

Slide 8 text

Merpay DataPipeline 概要

Slide 9

Slide 9 text

microservice -A microservice -B microservice -C Data Pipeline datauser -A datauser-B BigQuery BigQuery Event Log Event Log Event Log DB DB DB batch transfer stream transfer batch transfer batch transfer stream transfer stream transfer BqLoad Tool Cloud Storage ToGCS Tool? Cloud Dataflow BqLoad Tool Publish message Subscribe message Merpay DataPipeline

Slide 10

Slide 10 text

microservice -A microservice -B microservice -C Data Pipeline datauser -A datauser-B BigQuery BigQuery Event Log Event Log Event Log DB DB DB batch transfer stream transfer batch transfer batch transfer stream transfer stream transfer BqLoad Tool Cloud Storage ToGCS Tool? Cloud Dataflow BqLoad Tool Publish message Subscribe message Merpay DataPipeline 1. マイクロサービスは DataPipeline へ配送 2. データ利用者は DataPipeline から受け取り

Slide 11

Slide 11 text

使用技術 ● ETL: Cloud Dataflow ○ ニアリアルタイムデータ処理のため ● Message Queue: Cloud Pub/Sub ○ ニアリアルタイムデータ転送のため ● Data Lake: GCS ○ Pipeline に流れてきた生データをひたすら蓄積 ● Data Warehouse: GCS, BigQuery ○ 分析などの用途のためパースして GCS, BigQuery に書き出す ● Log Schema IDL: Protocol Buffer ○ gRPC でのメッセージ・メソッドの定義での利用実績アリ!

Slide 12

Slide 12 text

Stream DataPipeline Overview Microservice platform team Kubernetes cluster A-service B-service merpay-dataplatform Logging Cloud Pub/Sub Cloud Dataflow BigQuery stdout via logging library Sink to Pub/Sub Subscribe Data User - A BigQuery DWH Streaming Insert

Slide 13

Slide 13 text

Production Ready Stream DataPipeline

Slide 14

Slide 14 text

Background ● Data Pipeline はプロダクトのローンチ前にあって欲しい ○ ローンチ時からログを収集するため ○ 早い段階に PDCA を回すため ● Stream Data Pipeline はプロトタイプがうまくワークした ○ 細かい要改善点はあるが、全体設計は良さそう Stream Data Pipeline の本番環境構築に着手

Slide 15

Slide 15 text

Principles ● 受け付けるデータに柔軟性を持たせる ○ DataLake ■ 流れてきた任意のバイナリに手を加えず保存 ○ Data WareHouse ■ 流れてきた既知のスキーマに従うデータをパースして保存 ● ETL 処理を分割する(各々、1つのことをうまくやる!) ○ パース処理の有無 / データの格納先に応じてジョブを分割する ○ ジョブに応じて Message Queue のリソースも分割する

Slide 16

Slide 16 text

Kubernetes cluster A-service B-service merpay-dataplatform-jp Logging Cloud Pub/Sub Cloud Dataflow BigQuery stdout w/ encoding Sink to Pub/Sub Stackdriver2Ramp BigQuery DWH Cloud Pub/Sub Cloud Dataflow Cloud Pub/Sub Cloud Dataflow Cloud Dataflow Cloud Dataflow Ramp2DataHub Cloud Storage Cloud Storage DataHub2BigQuery DataHub2GCSDataLake DataHub2GCSStructured DataLake DHW on GCS DataHub Ramp SD Intermediator Temporary pipeline to use SD Shared designs w/ Mercari DataPlatform Stream DataPipeline Overview @ Oct 2018

Slide 17

Slide 17 text

Dataflow job development ● Java & Scala で実装 ○ Beam SDK wrapper として spotify/scio を一部利用 ○ Protocol Buffer ライブラリとして ScalaPB を利用 ● BigQuery / GCS への書き出しは DynamicDestination で ○ 様々なスキーマ、出力先パスorテーブルに書き出せる

Slide 18

Slide 18 text

Dataflow job testing ● ユニットテストをひたすら書く ○ JUnit / ScalaTest を利用 ○ カバレッジ 80+ % ● ETL の “T” の部分は spotify/scio の PipelineSpec を利用 ○ input に対して期待する output が得られるか Matcher で確認 ● カバーできない箇所は Cloud Dataflow 上で動作確認 ○ まだいい感じの結合テスト環境が作れていない...これからや! ● 負荷テストのコードを Locust で実装 ○ k8s 上でクライアント数を増減可能にしている ○ 現在は Pub/Sub にひたすら Publish することで負荷を発生させている

Slide 19

Slide 19 text

Dataflow job operation ● CircleCI によるデプロイ ○ 人手を介さずデプロイ可能にしている ○ 古い Dataflow job は drain で安全に止める ● DataDog によるモニタリング ○ モニタリング対象のメトリクス(一例です!) ■ Cloud Pub/Sub の滞留しているメッセージ量 ■ Dataflow job の system lag の値 ■ Dataflow job の exception 発生数

Slide 20

Slide 20 text

Dataflow job 開発との現実問題とのバトル(1/3) ● drain でジョブが止まらない例がある ○ exception が出るパスで無限に? retry されてしまう ■ 地道に潰す & バックアップ的な経路を作成する & … ○ GroupByKey が重くて詰まる ■ GroupByKey はキーを全部メモリに置こうとするので GC 起こりがち... ■ GroupByKey の無駄な利用を避ける & キーを分散する & … retryしまくって exception count が増え続ける例 shuffle 処理はやはり重い

Slide 21

Slide 21 text

Dataflow job 開発との現実問題とのバトル(2/3) ● scio のメモリリーク問題にハマる ○ scio 0.5.x で発生 ○ Dataflow の ‘--dumpHeapOnOOM’, ‘--saveHeapDumpsToGcsPath’ のよう な隠し?オプションでデバッグするなどした Stackdriver Error Reporting の出力 OOM時のheap dump解析結果。99%使ってるやつが!

Slide 22

Slide 22 text

Dataflow job 開発との現実問題とのバトル(3/3) ● スキーマを解釈してパースするのはやはり難しい ○ BigQuery の書き出しの際は BigQuery の型に変換する必要も ○ 自動的なテーブルスキーマ更新ロジックを実装した ■ が、全てに対応できるわけではない、、、 ● ScalaPB のエッジケース的なバグを踏む ○ WeakReference と GC の兼ね合わせで race が起きる ○ 問題の再現と修正が簡単に出来たので patch を投げた ■ https://github.com/scalapb/ScalaPB/pull/508

Slide 23

Slide 23 text

まとめ

Slide 24

Slide 24 text

Summary ● Merpay DataPlatform Team の設立とその経緯 ○ マイクロサービスの世界で発生した課題 ○ Merpay DataPipeline 構想 ● Stream DataPipeline について ○ Production ready な状態に持っていくまでの基本思想 ○ Dataflow job の開発と運用の実際

Slide 25

Slide 25 text

We are hiring!!! Merpay DataPlatform Team ではプロダクト開発に寄り添えるデータ収集基盤を構築して います。 全体構成や組織としての課題、 GCP ベースのコンポーネントの実装、セキュリティなど など挑戦的な取り組みが多々あります! 少しでも興味を持って頂けたなら、Merpay 採用ページもしくは Twitter で @syu_cream まで!

Slide 26

Slide 26 text

Q&A