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

Stream Data Pipeline for Microservices in Merpay

Ryo Okubo
October 31, 2018

Stream Data Pipeline for Microservices in Merpay

Merpay Stream Data Pipeline insides.

Ryo Okubo

October 31, 2018
Tweet

More Decks by Ryo Okubo

Other Decks in Technology

Transcript

  1. 3 マイクロサービスとデータのユースケース 01 Agenda 02 • アプリケーションとデータの分離 • メルペイにおけるデータのユースケース Merpay

    DataPipeline 概要 • steam のデータ転送のサポート • 技術スタック Copyright © Merpay, Inc. All Rights Reserved. 03 Production Ready Stream DataPipeline • 初期段階でのパイプライン設計とその思想 • Dataflow jobs の開発と運用
  2. Microservices in Merpay ServiceA ServiceB ServiceC App App App 1.

    分離されたアプリケーション 2. 分離された DB (無い場合もある) 3. 独立したマイクロサービスチーム
  3. Data sources vs usecases D-service B-service A-service C-service KPI Analytics

    Fraud Detection Credit Scoring Funnel Analytics ML system Customer Support
  4. 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
  5. 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 から受け取り
  6. 使用技術 • ETL: Cloud Dataflow ◦ ニアリアルタイムデータ処理のため • Message Queue:

    Cloud Pub/Sub ◦ ニアリアルタイムデータ転送のため • Data Lake: GCS ◦ Pipeline に流れてきた生データをひたすら蓄積 • Data Warehouse: GCS, BigQuery ◦ 分析などの用途のためパースして GCS, BigQuery に書き出す • Log Schema IDL: Protocol Buffer ◦ gRPC でのメッセージ・メソッドの定義での利用実績アリ!
  7. 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
  8. Background • Data Pipeline はプロダクトのローンチ前にあって欲しい ◦ ローンチ時からログを収集するため ◦ 早い段階に PDCA

    を回すため • Stream Data Pipeline はプロトタイプがうまくワークした ◦ 細かい要改善点はあるが、全体設計は良さそう Stream Data Pipeline の本番環境構築に着手
  9. Principles • 受け付けるデータに柔軟性を持たせる ◦ DataLake ▪ 流れてきた任意のバイナリに手を加えず保存 ◦ Data WareHouse

    ▪ 流れてきた既知のスキーマに従うデータをパースして保存 • ETL 処理を分割する(各々、1つのことをうまくやる!) ◦ パース処理の有無 / データの格納先に応じてジョブを分割する ◦ ジョブに応じて Message Queue のリソースも分割する
  10. 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
  11. Dataflow job development • Java & Scala で実装 ◦ Beam

    SDK wrapper として spotify/scio を一部利用 ◦ Protocol Buffer ライブラリとして ScalaPB を利用 • BigQuery / GCS への書き出しは DynamicDestination で ◦ 様々なスキーマ、出力先パスorテーブルに書き出せる
  12. Dataflow job testing • ユニットテストをひたすら書く ◦ JUnit / ScalaTest を利用

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

    Dataflow job は drain で安全に止める • DataDog によるモニタリング ◦ モニタリング対象のメトリクス(一例です!) ▪ Cloud Pub/Sub の滞留しているメッセージ量 ▪ Dataflow job の system lag の値 ▪ Dataflow job の exception 発生数
  14. Dataflow job 開発との現実問題とのバトル(1/3) • drain でジョブが止まらない例がある ◦ exception が出るパスで無限に? retry

    されてしまう ▪ 地道に潰す & バックアップ的な経路を作成する & … ◦ GroupByKey が重くて詰まる ▪ GroupByKey はキーを全部メモリに置こうとするので GC 起こりがち... ▪ GroupByKey の無駄な利用を避ける & キーを分散する & … retryしまくって exception count が増え続ける例 shuffle 処理はやはり重い
  15. Dataflow job 開発との現実問題とのバトル(2/3) • scio のメモリリーク問題にハマる ◦ scio 0.5.x で発生

    ◦ Dataflow の ‘--dumpHeapOnOOM’, ‘--saveHeapDumpsToGcsPath’ のよう な隠し?オプションでデバッグするなどした Stackdriver Error Reporting の出力 OOM時のheap dump解析結果。99%使ってるやつが!
  16. Dataflow job 開発との現実問題とのバトル(3/3) • スキーマを解釈してパースするのはやはり難しい ◦ BigQuery の書き出しの際は BigQuery の型に変換する必要も

    ◦ 自動的なテーブルスキーマ更新ロジックを実装した ▪ が、全てに対応できるわけではない、、、 • ScalaPB のエッジケース的なバグを踏む ◦ WeakReference と GC の兼ね合わせで race が起きる ◦ 問題の再現と修正が簡単に出来たので patch を投げた ▪ https://github.com/scalapb/ScalaPB/pull/508
  17. Summary • Merpay DataPlatform Team の設立とその経緯 ◦ マイクロサービスの世界で発生した課題 ◦ Merpay

    DataPipeline 構想 • Stream DataPipeline について ◦ Production ready な状態に持っていくまでの基本思想 ◦ Dataflow job の開発と運用の実際
  18. We are hiring!!! Merpay DataPlatform Team ではプロダクト開発に寄り添えるデータ収集基盤を構築して います。 全体構成や組織としての課題、 GCP

    ベースのコンポーネントの実装、セキュリティなど など挑戦的な取り組みが多々あります! 少しでも興味を持って頂けたなら、Merpay 採用ページもしくは Twitter で @syu_cream まで!
  19. Q&A