Embulkの
2015.04.24
#bq_sushi tokyo #1
Satoshi Akama
GCS
BigQuery
周りのプラグインについて
About Me
Software Engineer
https://github.com/sakama/
embulk-output-bigquery
embulk-input-gcs
S-cubism Technology Inc.
Satoshi Akama
iOS/WindowsタブレットでPOSを作ってる会社の
インフラを中心に担当
チェーン店の600台∼1000台のPOSを
丸ごと置き換える用途でも使われていたりします。
BigQueryはSaaS形態で提供しているサービスの裏側の解析で使用
@oreradio
3無数のデータフォーマット、ストレージ…
あらゆるデータフォーマット、RDBMS、
データストレージとの連携がプロジェクト毎に発生
EAIツール(データ連携ソフトウェア)を使えるケースばかりではない
I m tired.
CSV
CSV
JSON
CSV
1行目がコメント行
ヘッダファイルは別出力
タブ切り(TSV)
MS SQL Server
Mongo DB
MySQL
Amazon S3
JSON
XML
XML
CSV
Oracle
N ✕ M
development
エラーハンドリング
フォーマット変更
パフォーマンス
リトライ処理実装 etc
4並列バルクロードツール Embulk
Treasure Dataさんが出したOSSのバルクデータ転送ツール
・並列実行
・データバリデーション
・エラーリカバリー
・Input/Ouput pluginを
 自由に組み合わせられるプラガブルな設計
・分散処理が可能な設計
・冪等性
http://www.slideshare.net/HiroshiNakamura/embulk-20150411
http://www.slideshare.net/repeatedly/fluentd-and-embulk-game-server-4
http://www.slideshare.net/frsyuki/embuk-making-data-integration-works-relaxed/12
Fluentdのバッチ版
プラグインベースのバルクローダー
5Various Plugins
DB
Oracle
MySQL
PostgreSQL
Redshift
Elasticsearch
検索エンジン
クラウドサービス
Salesforce
Amazon S3
GCS、BigQuery
ファイルフォーマット
CSV、TSV、JSON、XML
pcap packet capture files
gzip、bzip2、zip、tar、cpio
http://www.embulk.org/plugins/
List of Embulk Plugins
Embulk on Hadoop
embulk-executor-mapreduce
NoSQL
Redis
in:
type: file
path_prefix: "/root/try1/csv/sample_"
out:
type: stdout
6入力データ正規化支援
guess
preview
in:
type: file
path_prefix: /root/try1/csv/sample_
decoders:
- {type: gzip}
parser:
charset: UTF-8
newline: CRLF
type: csv
delimiter: ','
quote: '"'
escape: ''
skip_header_lines: 1
columns:
- {name: id, type: long}
- {name: account, type: long}
- {name: time, type: timestamp, format: '%Y-%
- {name: purchase, type: timestamp, format:
- {name: comment, type: string}
exec: {}
out: {type: stdout}
元データの先頭を読んで
スキーマ定義作成等を自動生成する
embulk guess /path/to/config.yml -o out.yml
dry runの機能
7GCP界隈のEmbulkプラグイン
embulk-input-gcs
embulk-output-gcs
embulk-output-bigquery
Input plugin
Output plugin
他のInput/Output pluginとの組み合わせで
GCS→Elasticsearch
RDBMS→GCS
File→BigQuery等
embulk-output-google-spreadsheets
8BigQueryへのデータロード
Streaming Insert
bq command line tools(GCS/直接)
Bulk Insert(GCS経由/直接)
embulk-output-bigquery(直接)
fluent-plugin-bigquery
Google Cloud LoggingのBigQuery連携
job作成時にデータをPostで送信
9embulk-output-bigquery
シンプルにバルクロードを行いたい用途向け
数100GB∼TB/dayの量をロードする必要がある用途は
現状転送スループット的に辛い(後述)
オプション名/値は極力fluentd-plugin-bigqueryや
bq Command-Line toolに合わせています
EmbulkのjarファイルをDLしてPATH等を設定
embulk gemコマンドでプラグインをインストール
guess、previewを駆使しつつconfig.ymlを作成
embulk run
1
2
3
4
10embulk-output-bigquery
Direct Insert
Embulk
executor plugin
CSV jsonl
gzip
embulk-output-bigquery
FormatterPlugin
EncoderPlugin
FileOutputPlugin
Input
or
MySQL
PostgreSQL
File
…etc
1. FormatterPluginでCSV/JSONにフォーマット
2. EncoderPluginでgzip圧縮
3. ローカルに出力したファイルをBigQueryにDirect Insert
4. jobが実行完了するまでBigQueryのAPIをpolling
11BigQueryのQuota Policyの制約はそのまま
File Type 圧縮 非圧縮
CSV 4GB
データに改行を含む 4GB
データに改行を含まない 5TB
JSON 4GB 5TB
https://cloud.google.com/bigquery/quota-policy
1,000 load jobs/table/day
10,000 load jobs/project/day
プラグイン側で出力時のファイル分割は実装しようと思っているが、
InputがFileの場合は事前に分割する方がEmbulkで並列処理できるので効率は良い
(embulk-input-filesplitというプラグインがあります)
同時にrunningになれるjobは20まで
Output側で
1000 tasks実行すると上限に達する
4/16のアップデートで記述が消えた?
緩和されたなら並列実行に有利に
12機能 - 動的テーブル作成、認証
auto_create_table: true
schema_path: /path/to/schema.json
table: table_%Y_%m
動的テーブル作成機能
・設定ファイルへの記述
・Embulkのスキーマを受け取る
・fetch_schema(fluent-plugin-bigqueryにある)
認証
・サービスアカウントのp12形式秘密 による認証
・GCEインスタンスのaccess tokenによる認証
 →インスタンス作成の際に「BigQuery」の権限を付与すればOK
schema.jsonのpathを指定してテーブルを作成する
未対応
13機能 - 重複ロード防止機能
prevent_duplicate_insertオプション(default: off)
BigQueryの各プロジェクト内でjob IDはユニークである必要がある
(失敗したjobを含む)
同一データ/同一設定値での実行は必ず失敗
job ID = md5(md5(file) + table + schema + max_bad_records…)
ONにするとjob IDをファイルのhash値等から明示的に指定する
14Performance(TODO:改善)
GCE instance上での実行時間例
ファイル転送(3∼7MB/sec)がボトルネック。処理時間の約半分が転送時間。
今のところgsutil程のスループットは出ない。
us-central1-c → BigQuery(US)
n1-highcpu-4(vCPU✕4、メモリ 3.6GB)
SSD persistent disk✕2
I/Oについてはinputがファイルなら
output側出力先とはディスク別にすると若干速くなる
embulk v0.6.5
embulk-output-bigquery v0.1.6
input:CSVファイル
output:CSVフォーマットでBigQueryへ
データ:8カラム
1GB✕1並列 644秒(10分44秒)
1GB✕4並列 1028秒(17分8秒)
15TODO
・4GB単位(圧縮時)のファイル分割
改行位置を見てやる必要があるのでちょっと面倒
FileOutput Pluginの場合、行単位でのデータは取得できず…
Output Pluginに変えるとFormatter、Encoder Pluginが使えない…
・ファイル転送速度向上
・resume support
・エラーハンドリング
Embulk本体の実装も追いつつ…
イマドキの転送ツールとしては物足りない。
Google APIs Client Library for Javaがmultipart uploadに対応していなかったり
するので(APIではサポートされている)「普通に」使っていると難しそう。
16Contributing to Embulk project
・Pull-requests & issues on Github
・Posting blogs
 ・“I tried Embulk. here is how it worked”
 ・“I read Embulk code. Here is how it’s written”
 ・Embulk is good because…but bad because…
・Talking on Twitter with a word “embulk”
・Writing & releasing plugins
・Windows support
・Integration to other software
 ・ETL, Fluentd, Hadoop, Presto…
https://github.com/embulk/embulk

EmbulkのGCS/BigQuery周りのプラグインについて