データバルクローダ「Embulk」つかってみた

embulk-logo

Embulkとは

様々なDB,File,Service間の大量データ転送をしてくれるイカしたやつです。
詳しい説明は、メインコミッターのスライドに譲ります。
https://www.slideshare.net/frsyuki/embuk-making-data-integration-works-relaxed

準備

Dockerで環境を立ち上げます。サンプルでmysqlからpostgresへのデータ転送を行うため、mysqlとpostgresのコンテナも立ち上げます。
mysqlにはサンプルのデータが入った状態で立ち上がります。

git clone https://github.com/shinji19/docker-embulk.git
cd docker-embulk
docker-compose build
docker-compose up -d # サンプルで利用するmysqlとpostgresを立ち上げる
docker exec -it docker-embulk_embulk_1 bash # 以降の作業はembulkコンテナ内
embulk gem install embulk-input-mysql embulk-output-postgresql # サンプルで利用するプラグインを導入

サンプル

mysqlからpostgresqlへデータを転送してみましょう。
sample.yamlを作成します。

in:
  type: mysql # プラグインの名前
  host: mysql
  port: 3306
  user: mysql
  password: mysql
  database: sample
  table: data
out:
  type: postgresql # プラグインの名前
  host: postgres
  port: 5432
  user: postgres
  password: postgres
  database: sample
  table: data
  mode: insert

作成したsample.yamlを実行します。

embulk preview sample.yaml # 入力から得られた結果が出力されます。
embulk run sample.yaml # 実際にデータを転送します。

postgresコンテナ内を覗くとデータが入っていることが確認できると思います。
簡単ですね。

応用

SQLを記述できるプラグイン(embulk-input-mysqlのような)の場合、そこに集計SQLを書けば、Embulkを集計システムの基盤として使えます。

sample2.yamlを作成します。

in:
  type: mysql # プラグインの名前
  host: mysql
  port: 3306
  user: mysql
  password: mysql
  database: sample
  query: |
    SELECT action, count(1) AS cnt FROM data
    GROUP BY action
out:
  type: postgresql # プラグインの名前
  host: postgres
  port: 5432
  user: postgres
  database: sample
  table: summary
  mode: insert

作成したsample.yamlを実行します。

embulk preview sample2.yaml # 入力から得られた結果が出力されます。
embulk run sample2.yaml # 実際にデータを転送します。

まとめ

色々な集計を業務ですることがあると思いますが、あとで見返すとよくわからないこともあると思います。
そんな時、Embulkを使っていれば、集計の肝がyamlに集約されるため、わかりやすいです。ぜひ、使っていきましょう!

ジョブスケジューラとEmbulkを組み合わせることで集計システムの基盤として使えます。
enishのデータ分析チームでは、試験的にJenkinsとEmbulkを組み合わせています。集計の登録がGUIで完結するため、エンジニアでなくとも定期集計を仕掛けることができます。

Embulk(プラグイン)にはここで紹介していない便利機能が色々ありますので、気になる方はお試しください。
・設定ファイルに環境変数をはめ込む
・並列実行して実行時間を短縮
・べき等なデータ転送
などなど