Embulk

Embulk, an open-source plugin-based parallel bulk data loader
バルクデータの転送用ソフトウェア。
データの読み込みとパースができる。
入出力先に応じたプラグインを使うことができる柔軟な構造。
データ処理自体もプラグインとして後から追加できる。

最終的にプラグインの開発までを行うところ、今回はとりあえずクイックスタートでEmbulkを試しに動かしてみるところまでやってみる。

環境

$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
$

今回はLinuxだけど、Windowsでもできるぞ!

クイックスタート

クイックスタートに従っていきます。

Javaのインストール

EmbulkはJavaアプリケーションなので、まずはJavaを入れておく必要がある。

$ java -version
java version "1.7.0_91"
OpenJDK Runtime Environment (rhel-2.6.2.1.el7_1-x86_64 u91-b00)
OpenJDK 64-Bit Server VM (build 24.91-b01, mixed mode)
$

今回はすでに入っていた。

Embulkのダウンロードとパスの追加

マニュアル通りだぞ!

curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"  

ホームディレクトリに.embulk/ができる。

chmod +x ~/.embulk/bin/embulk
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc  

パスを追加。

$ embulk
Embulk v0.7.10
usage: <command> [--options]

~~略~~
$   

とりあえずembulkを叩くと返ってくる。
バージョンは0.7.10ですね

動かしてみる。

マニュアル通りだぞ! “embulk example” という便利なコマンドがある。

$ embulk example ./try1
2015-12-03 09:57:57.160 +0900: Embulk v0.7.10
Creating ./try1 directory...
  Creating ./try1/
  Creating ./try1/csv/
  Creating ./try1/csv/sample_01.csv.gz
  Creating ./try1/example.yml

Run following subcommands to try embulk:

   1. embulk guess ./try1/example.yml -o config.yml
   2. embulk preview config.yml
   3. embulk run config.yml

$  

カレントディレクトリにtry1なるディレクトリができる。

$ ls -R
.:
try1

./try1:
csv  example.yml

./try1/csv:
sample_01.csv.gz
$   

出力の通りの内容。

次に使うのは”embulk guess” コマンドだけれど、これは読み込んだファイルからデータの定義を推測して定義ファイルを生成してくれる機能。
自力で定義ファイルを書くこともできる。

$ embulk guess   ./try1/example.yml -o config.yml  


$ ls -R
.:
config.yml  try1

./try1:
csv  example.yml

./try1/csv:
sample_01.csv.gz
$  

直下にconfig.ymlができた。

 $ cat try1/example.yml
 in:
   type: file
   path_prefix: "/home/[USER_NAME]/try1/csv/sample_"
 out:
   type: stdout
  $
  $ cat config.yml
  in:
    type: file
    path_prefix: /home/[USER_NAME]/try1/csv/sample_
    decoders:
    - {type: gzip}
    parser:
      charset: UTF-8
      newline: CRLF
      type: csv
      delimiter: ','
      quote: '"'
      trim_if_not_quoted: false
      skip_header_lines: 1
      allow_extra_columns: false
      allow_optional_columns: false
      columns:
      - {name: id, type: long}
      - {name: account, type: long}
      - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
      - {name: purchase, type: timestamp, format: '%Y%m%d'}
      - {name: comment, type: string}
  out: {type: stdout}
  $  

すごい補完してくれてる。 [USER_NAME]のところは実際のユーザネームが入ってるよ。

ちなみに、example.ymlとconfig.ymlに書いてある通り、今回は入力を”try1/csv/sample_*“という名前のファイルとし、出力を標準出力としている。
guessコマンドが、try1/csv/sample_01.csv.gzというファイルを解釈し、Embulkの実行の際にはgzipでデコードし、さらに文字コードやデータの形式…という定義を補完していることがわかる。

previewオプションで、実行した際の出力を確認することができる。

  $ embulk preview config.yml
  2015-12-03 10:30:37.375 +0900: Embulk v0.7.10
  2015-12-03 10:30:38.801 +0900 [INFO] (preview): Listing local files at directory '/home/[USER_NAME]/try1/csv' filtering filename by prefix 'sample_'
  2015-12-03 10:30:38.806 +0900 [INFO] (preview): Loading files [/home/[USER_NAME]/try1/csv/sample_01.csv.gz]
  +---------+--------------+-------------------------+-------------------------+----------------------------+
  | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
  +---------+--------------+-------------------------+-------------------------+----------------------------+
  |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
  |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
  |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
  |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
  +---------+--------------+-------------------------+-------------------------+----------------------------+
  $

runオプションで、実際に実行する。

    $ embulk run     config.yml
    2015-12-03 10:33:32.393 +0900: Embulk v0.7.10
    2015-12-03 10:33:35.954 +0900 [INFO] (transaction): Listing local files at directory '/home/[USER_NAME]/try1/csv' filtering filename by prefix 'sample_'
    2015-12-03 10:33:35.983 +0900 [INFO] (transaction): Loading files [/home/[USER_NAME]/try1/csv/sample_01.csv.gz]
    2015-12-03 10:33:36.084 +0900 [INFO] (transaction): {done:  0 / 1, running: 0}
    1,32864,2015-01-27 19:23:49,20150127,embulk
    2,14824,2015-01-27 19:01:23,20150127,embulk jruby
    3,27559,2015-01-28 02:20:02,20150128,Embulk "csv" parser plugin
    4,11270,2015-01-29 11:54:36,20150129,NULL
    2015-12-03 10:33:36.427 +0900 [INFO] (transaction): {done:  1 / 1, running: 0}
    2015-12-03 10:33:36.431 +0900 [INFO] (main): Committed.
    2015-12-03 10:33:36.431 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"/home/[USER_NAME]/try1/csv/sample_01.csv.gz"},"out":{}}
    $  

真ん中の部分で出力できている。

今回はここまで。
次はプラグインを追加して使ってみる。