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

Embulkを利用したデータ統合SaaSの構築と運用

 Embulkを利用したデータ統合SaaSの構築と運用

2020/07/09 Embulk & Digdag Online Meetup 2020

Kenta Suzuki

July 09, 2020
Tweet

More Decks by Kenta Suzuki

Other Decks in Technology

Transcript

  1. ©2020 primeNumber Inc. 自己紹介 執行役員CTO 鈴木 健太(Kenta Suzuki) - 2013年

    (株) リブセンス にエンジニアとして新卒入社 - 2017年 (株) primeNumberに入社 twitter: @kekekenta Ruby / Kubernetes / ジム通い / Beer ♂
  2. ©2020 primeNumber Inc. primeNumber 14名 目黒駅 1.48億円(準備金含む) 社員数: 所在地: 資本金:

    株式会社primeNumber 社名: 2015年11月 設立: - to B のデータ領域のサービスを展開 - 2018年末「trocco®」リリース - 2019年7月シリーズAラウンド資金調達 Data Engineering Study #1 2020/07/15(水) 19:30〜 ForkewllさんとprimeNumberの共催
  3. ©2020 primeNumber Inc. trocco ≒ WEB UI + managed Embulk

    troccoジョブ設定画面 Embulk config.yml
  4. ©2020 primeNumber Inc. trocco ≒ WEB UI + managed Embulk

    • 設定作成の際に、接続テストを実施 • Embulkのエラーになれていない方に も使いやすい設計
  5. ©2020 primeNumber Inc. trocco ≒ WEB UI + managed Embulk

    転送実行時に個別のコンテナを立ち上げる 1. Embulk configの生成 2. embulk runコマンドの実行 3. 転送完了後に各種検証や通知
  6. ©2020 primeNumber Inc. データ基盤運用で必要となる周辺機能をサポート • Slack通知 ◦ 成功/失敗/レコード数条件/実行時間条件 • 設定への変数埋め込み

    ◦ 実行開始時間を利用可能 例) s3://bucket/$date$/ • スケジュール実行 • 並列度制御 • データマート生成 ◦ DWH上にサマリーテーブルの生成 • データチェック・バリデーション ◦ 任意のクエリ結果を元にバリデーション • ワークフロー ◦ データ転送→データマート生成→バリデーションなどの組み合わせが可能 • 権限管理 ◦ グループ内での設定共有 • CDC(Change Data Capture) ◦ MySQLのbinlogを読み込み、DELETE含めてBigQueryに同期
  7. ©2020 primeNumber Inc. 現在のシステム要件 • ジョブ実行数 ◦ 〜10,000/日 • ジョブごとの実行時間

    ◦ min: 5s 〜 max: 12h • ジョブ起動タイミングの偏り ◦ 数時間ごとにスパイク • ジョブごとに、リソースを変更したい ◦ CPUやメモリを調整
  8. ©2020 primeNumber Inc. Kubernetes(EKS) 上に構築 EKS SQS UI Dispatcher Dispatcher

    K8s Job create K8s job ECS Dispatcher App 転送実行 スケーラブルで安定的なジョブ基盤をシンプルに実現するため、K8sを採用 trocco
  9. ©2020 primeNumber Inc. ジョブの立ち上げをK8sに任せられる - create jobリクエストさえ成功すれば、nodeのリソース状況を見てK8s がJob(コンテナ)を立ち上げてくれる - K8s側でキューイングしてくれている

    - 必要なリソースからnodeの空き状況を元にJobを順次立ち上げ - Cluster Autoscalerにより、Jobを立ち上げるnodeリソースが無いときに はnodeのスケールアウトをやってくれる - nodeが空いているときはスケールインも - node上に起動中のJobがある場合、Jobの完了を待ってからスケー ルインしてくれる
  10. ©2020 primeNumber Inc. Fan-Out or Dispatcher SQS Container Container SQS

    Container Container Fan-Out方式 Dispatcher方式 Dispatcher App Dispatcherがキューをpollingし、ジョ ブ単位で都度コンテナを立ち上げる 各コンテナがSQSをpollingし、ジョブを 実行。実行が完了したら再度polling し、次のジョブを実行。 or もともとはECSサービスを利用したFan-Out方式を採用していた EKSによるDispatcher方式に移行
  11. ©2020 primeNumber Inc. Dispatcher方式を採用した理由 • デプロイのシンプルさ ◦ リリース当初はFan-Out方式を採用していた ◦ 実行に長時間かかる転送ジョブがある

    ◦ デプロイのタイミングで実行中のジョブを終了さ せたくないため、デプロイ完了はジョブの終了を 待ってから ▪ 何時間もデプロイが完了しない・・ ◦ Dispatcher方式であれば、コンテナのイメージタ グを差し替えるだけでデプロイ完了 ▪ 実行中のジョブは影響を受けない Container Container Dispatcher Container Jobが参照するのコンテ ナタグを変更する 新しく立ち上がるコンテナは 別のタグを参照 既存のコンテナは影響を受け ない TAG 1 TAG 2 TAG 1 TAG 1 TAG 2
  12. ©2020 primeNumber Inc. Dispatcher方式を採用した理由 - 環境の隔離 - troccoは様々なお客様のデータを転送している - 転送のたびに都度コンテナを立ち上げ、完了後に破棄することでセ

    キュリティを担保 - リソース設定の柔軟さ - 特定の転送のみCPUやメモリ割当を増やしたいという要件 - コンテナ立ち上げ時にCPUやメモリを指定可能
  13. ©2020 primeNumber Inc. なぜEKS(K8s)?ECSタスクではないのか? - ECSタスク on Fargate - 起動時間が遅い。デフォルト以上のボリュームを割当ることができない

    ※2019年2月時点 - ECSタスク on EC2 - EC2リソースに余裕がない場合、ECSタスク(コンテナ)が起動できない - ECSタスクを確実に起動できるように、タスク起動の成功失敗監視とリ トライの仕組みが必要 ※2019年2月時点 - 開発環境と本番環境にズレができる - 開発環境では素のDockerコンテナを立ち上げ、本番環境ではECSタスク を立ち上げることに - EKS(K8s) Job on EC2 - コンテナの立ち上げはK8sに任せることが出来る - EC2リソース監視とスケール、コンテナの立ち上げはk8s側の仕事 - 開発環境と本番環境を揃えて開発できる
  14. - ジョブの立ち上げはK8s側で良しなにやってくれる - nodeスケール、ジョブの起動はK8s側の責務に - 並列実行などの観点で、どのジョブをcreate jobするべきかを考えるだけで良 いのでシンプルに - Dispatcher方式を採用できることで、デプロイもシンプルに

    - イメージタグの付替 - 実行中のジョブが影響を受けずにデプロイが完了 - 開発環境と本番環境を揃えることが出来、開発・実装がシンプルに ©2020 primeNumber Inc. K8sによるシンプルなジョブ基盤
  15. ©2020 primeNumber Inc. その他の安定運用を支える仕組み - リリース前確認 - staging環境にて、様々な組み合わせの 転送ジョブを作成 -

    リリース前にすべてPASSすることを 確認 - CSチームのサポート体制 - 分析基盤やEmbulkを熟知したメンバー がサポートを実施 - 顧客のデータ統合を安定へと導く
  16. who am i Software Eengineer 高際 兼一(Ken Takagiwa) github: @giwa twitter:

    @gi_world fb: @giwacchi futsal(代々木公園の個サルによくいます)/ drink
  17. embulk-output-bigquery plugin Brief History of this plugin v0.1.0 is Java

    Output File base and developed by Treasure Data(sakama .et al) on Mar 2015 v0.3.0.pre1 is JRuby Output base and developed by Sonots on Mar 2016 embulk-output-bigquery_java is Java Output base, is compatible with JRuby version base, and developed by trocco from Feb 2020 Our motivation 1. hit the limit of transfer time for customer requirement using JRuby 2. minimizing transfer time reduces our infrastructure cost. most of customers use BigQuery as DWH
  18. Other issues Embulk itself prioritize Java since 0.10 JRuby plugin

    problem(https://twitter.com/hiroysato/status/1269822234454982656) google-api-client incompatibility JRuby and JRE related problem (https://github.com/embulk/embulk-output-bigquery/issues/122) Sometime error: output plugin bigquery not found embulk/embulk#1214 Sometimes failed to run(can not copy embedded jar to temp directory) embulk/embulk#1148 Occasionally failed by "JRuby runtime is not loaded successfully" error embulk/embulk#978
  19. Performance EC2: m5ad.large (2 core, 8GB) transfer: local_file -> BigQuery

    embulk: 0.9.23 embulk-output-bigquery(v0.6.4) embulk-output-bigquery_java (0.0.14) speedometer を使ったスループットを計測 in: type: file path_prefix: /home/ec2-user/bq_rb/data.csv parser: charset: UTF-8 newline: LF type: csv delimiter: ',' quote: '"' escape: '"' trim_if_not_quoted: false skip_header_lines: 1 allow_extra_columns: false allow_optional_columns: false columns: - {name: c1, type: long} - {name: c2, type: string} - {name: c3, type: long} - {name: c4, type: double} - {name: c5, type: string} out: type: bigquery_java auth_method: service_account json_keyfile: *** dataset: **** table: bq_performance_java auto_create_dataset: false auto_create_table: true mode: replace location: US open_timeout_sec: 300 timeout_sec: 300 send_timeout_sec: 300 read_timeout_sec: 300 retries: 5 allow_quoted_newlines: true source_format: NEWLINE_DELIMITED_JSON compression: GZIP path_prefix: "/home/ec2-user/bq_java/"
  20. Current status of output-bigquery_java Java output plugin config coverage of

    JRuby around 40% not implemented major function: GCS config diff with JRuby: before_load, column_options.description
  21. Road map embulk/embulk-output-bigquery: keep JRuby version and fix bugs trocco-io/embulk-output-bigquery_java:

    replace embulk/embulk-output-bigquery and release 0.7.0 in embulk/embulk-output-bigquery at Spring 2021 drop some options related JRuby performance issues: e.g. payload_column_index number of contributor: 1 only me, the more contributors joins this project, the faster we can achieve milestone in road map :)