EmbulkとDigdagとデータ分析基盤と
- 2. WHO AM I ?
• Toru Takahashi (@nora96o)
• Treasure Data, Inc.
• Support Engineering Manager
• メールにチャットに、ブログ書いたり、コードを書いたり、
• http://qiita.com/toru-takahashi
• 気づくと、社会人4年目に突入・・・
2
- 3. 質問です!
• Treasure Data を 知っている人は ?
• Fluentd を 知っている人は ?
• Embulkを知っている人は?
• Digdagを聞いたことがある人は?
• インフラ / 分析基盤 を普段から運用や開発をしている人は?
• iOS / Android / Unity / フロントエンドの人は?
3
- 26. バルクデータ転送の例(1/3)
指定された 10GB CSV file をPostgreSQLにロード
1. コマンド叩いてみる → 失敗
2. データを正規化するスクリプトを作成
”20150127T190500Z” → “2015-01-27 19:05:00 UTC”に
“null” → “N”に変換
元データを見ながら気付く限り…
3. 再度チャレンジ → 取り込まれたが元データと合わない
“Inf” → “Infinity”に変換
4. ひたすら繰り返す
5. うっかりレコードが重複して取り込まれた...
26
- 27. バルクデータ転送の例(2/3)
指定された 10GB CSV file をPostgreSQLにロード
6. スクリプトが完成
7. cronに登録して毎日バルクデータロードするよう登録
8. ある日、別の原因でエラーに…
不正なUTF-8 byte sequenceをU+FFFDに変換
27
- 28. バルクデータ転送の例(3/3)
過去の日次 10GB CSV file を 730個 を取り込む(2年分)
1. たいていのスクリプトは遅い
最適化している暇がない
1ファイル1時間、エラーが発生しなくても1ヶ月必要
2. 並列データロードするようにスクリプト変更
3. ある日、ディスクフル / ネットワークエラーで失敗
どこまで読み込まれた?
4. 障害後に再開し易いよう、データロード単位を調整
5. 安全な再開機能をスクリプトに追加
28
- 29. システム構築の頭痛の種
様々な転送データ、データストレージ
• CSV, TSV, JSON, XML, MessagePack,
SequenceFile, RCFile
• AWS S3, Salesforce.com, Google Cloud Storage,
Elasticsearch
• MySQL, PostgreSQL, Oracle, MS SQL Server, Amazon Redshift,
Redis, MongoDB, BigQuery
29
- 35. プラグインアーキテクチャ
• フレームワークによる恩恵
• 並列処理、繰り返し実行、エラー処理、リカバリ
• RubyGemとして配布(http://www.embulk.org/plugins/)
• DB
• Oracle, MySQL, PostgreSQL, Amazon Redshift, …
• SaaS
• Salesforce.com, Amazon S3, Google Cloud Storage, Google BigQuery, …
• File Format
• CSV, TSV, JSON, XML, …
• gzip, bzip2, zip, tar, …
35
- 36. DEMO - Embulk
Local の CSV file を PostgreSQL にロード
(ネットワークに問題があると悲しい気持ちになるので、ローカルで全て済ませてます。)
1. guessとpreview
2. 実行
3. 繰り返し実行
36
- 45. Workflow Automation Systemに求められる機能
• 基本機能
• タスクの順次実行
• 定期的な実行
• イベントに反応して実行
• エラー処理
• 失敗したらリトライ
• 失敗したらアラート
• 実行時間が長ければアラート
• 途中からリジューム
• 冪等なリトライ
• 状態監視
• タスクの依存関係の可視化
• タスクの実行ログの収集
45
• 高速化
• タスクの並列実行
• 複数サーバの分散実行
• 同時実行数の制限 / フェアスケジューラ / プリエンプション
• ワークフロー開発
• GUIベースのワークフロー定義
• ソースコードベースのワークフロー定義
• ワークフローのバージョン管理
• 多数のシステムを制御する為のプラグイン / ライブラリシステ
ム
• どこでも同じ動作をする再現性・仮想環境内でのタスク実行
- 46. 既存のWorkflow Automation System
• OSS
• Makefile
• Jenkins
• Luigi
• Airflow
• Rundeck
• Azkaban
• …
• 商用
• JP1 / AJS3
• …
46
• ETLツールも類似のツール
• Talend
• DataSpidar
• …
- 47. Digdagとは?
Digdag is a simple tool that helps you to build, run, schedule, and monitor
complex pipelines of tasks. It handles dependency resolution so that tasks
run in order or in parallel.
Digdag fits simple replacement of cron, IT operations automation, data
analytics batch jobs, machine learning pipelines, and many more by using
Directed Acyclic Graphs (DAG) as the infrastructure.
47
http://www.digdag.io/index.html
- 48. ワークフローエンジンに求められる機能
= Digdagでユーザがシンプルに実現できるようにしたい機能
• 基本機能
• タスクの順次実行
• 定期的な実行
• イベントに反応して実行
• エラー処理
• 失敗したらリトライ
• 失敗したらアラート
• 実行時間が長ければアラート
• 途中からリジューム
• 冪等なリトライ
• 状態監視
• タスクの依存関係の可視化
• タスクの実行ログの収集
48
• 高速化
• タスクの並列実行
• 複数サーバの分散実行
• 同時実行数の制限 / フェアスケジューラ / プリエンプション
• ワークフロー開発
• GUIベースのワークフロー定義
• ソースコードベースのワークフロー定義
• ワークフローのバージョン管理
• 多数のシステムを制御する為のプラグイン / ライブラリシステ
ム
• どこでも同じ動作をする再現性・仮想環境内でのタスク実行
- 49. DEMO: DIGDAG (LOCAL MODE)
Local の CSV file を PostgreSQL にロードし、
SQLで集計した結果をslackで通知。
(+ローカルでスケジューリング)
49
Digdag *画像はイメージです
- 53. Operators
• call>: Calls another workflow
• require>: Depends on another workflow
• py>: Python scripts
• rb>: Ruby scripts
• sh>: Shell scripts
• loop>: Repeat tasks
• for_each>: Repeat tasks
• if>: Conditional execution
• fail>: make the workflow failed
• mail>: Sending email
• embulk>: Embulk data transfer
53
• td>: Treasure Data queries
• td_run>: Treasure Data saved queries
• td_load>: Treasure Data bulk loading
• td_ddl>: Treasure Data operations
• td_table_export>: Treasure Data table export to S3
- 54. Commands and Mode
• Local-mode commands
• new
• run
• check
• scheduler
• selfupdate
54
• Server-mode commands
• server
• Client-mode commands
• start
• retry
• log
• kill
• workflows
• schedules
• backfill
• reschedule
• sessions
• attempts
• tasks
• push
Editor's Notes
- Demo:
$ embulk guess embulk-example/seed.yml -o config.yml
$ embulk preview config.yml
$ embulk run config.yml -c config_diff.yml
- $ digdag run
$ digdag —rerun
$ digdag check
$ digdag scheduler --project .
$ digdag schedules -e http://127.0.0.1:65432