2015年9月24日木曜日

embulk 試してみた

概要

embulk の QuickStart を試してみました
何事も試して感覚をつかむ

環境

  • CentOS 6.6 64bit
  • embulk 0.7.4
  • Java OpenJDK 1.8.0_45

インストール

以下 root で作業しています
Javaが必要なのでインストールしていない場合は事前にインストールしてください

  • curl –create-dirs -o ~/.embulk/bin/embulk -L “http://dl.embulk.org/embulk-latest.jar
  • chmod +x ~/.embulk/bin/embulk
  • echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
  • source ~/.bashrc

特に考える必要はないと思います
ダウンロードして権限を変えて PATH に通してあげているだけです

Quick Start

インストールしたらサンプルデータで試します

  • mkdir ~/work
  • cd ~/work
  • embulk example ./try1
  • embulk guess ./try1/example.yml -o config.yml
  • embulk preview config.yml
  • embulk run config.yml

exampleでサンプルデータを作成して
guessで設定ファイルを自動生成して
previewで読み込んだデータがちゃんとパースされるかテストして
runで実際に実行させます

だいぶ省略したサブコマンドの説明なので詳細は公式等みてください
とりあえずこれを実行するとexampleで生成された CSV データを読み込んで標準出力にその内容を出力してくれます

2015-09-24 14:00:29.248 +0900: Embulk v0.7.4
2015-09-24 14:00:31.432 +0900 [INFO] (transaction): Listing local files at directory ‘/root/work/embulk/try1/csv’ filtering filename by prefix ‘sample_’
2015-09-24 14:00:31.438 +0900 [INFO] (transaction): Loading files [/root/work/embulk/try1/csv/sample_01.csv.gz]
2015-09-24 14:00:31.524 +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-09-24 14:00:31.815 +0900 [INFO] (transaction): {done: 1 / 1, running: 0}
2015-09-24 14:00:31.822 +0900 [INFO] (main): Committed.
2015-09-24 14:00:31.823 +0900 [INFO] (main): Next config diff: {“in”:{“last_path”:”/root/work/embulk/try1/csv/sample_01.csv.gz”},”out”:{}}

プラグインを試す

プラグインの使い方まで試します
今回使用するプラグインは embulk-output-command です

  • embulk gem install embulk-output-command
  • vim config_try_plugin.yml
in:
  type: file
  path_prefix: /root/work/embulk/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: command
  command: "cat -> task.$INDEX.$SEQID.csv.gz"
  encoders:
  - {type: gzip}
  formatter:
    type: csv

config_try_plugin.ymlはデフォルトで生成されるconfig.ymlを元にするといいです
変わっているのはout:の部分でここでインストールしたプラグインを使っています

これをインストールするとtype: commandが使えるようになりcommand:に指定したコマンドを実行することができます
サンプルの場合in:で読み込んだ CSV ファイルを名前のフォーマットを変更して再度 CSV に出力しています

$INDEX$SEQID について

command:内で変数を使っています

簡単に説明すると $INDEX は読み込んだファイルの数だけインクリメントしてくれる変数です
例えばサンプルで使用した try1/csv/sample_01.csv.gz ともう一つ try1/csv/sample_02.csv.gz というファイルを作成すると $INDEX をインクリメントしてくれます

$SEQID は formatter の数に依存します
formatter が複数あった場合、0 から順番にインクリメントしてくれます

最後に

公式の Quick Start をやっただけなので特に躓くこともなく簡単に使うことができました

実行してみるとわかりますが、embulk は並列実行なので、複数のファイルを in: で読み込んだ場合は 1 つ目のファイルが終わってから 2 つ目のファイルを実行するわけではなく、一気に 2 つのファイルの処理がはじまります

本当に試しただけなので、まだ現場レベルでの有効な使い道は思い浮かびませんが機会があれば使いたいかなと

0 件のコメント:

コメントを投稿