【Embulk】Vagrantで環境構築

## 概要
業務でEmbulkの設定変更を行う機会があったので、仮想環境で環境構築を行い、<br>プラグインなどの挙動を確認したのでメモ
※本記事はEmbulkの最低限の環境構築手順と動作確認のみしか記載しておりません

## 環境

|OS|バージョン|
|:-:|:-:|
|CentOS|6.7|

## 手順
### 1. vagrant環境構築

- vagrant初期化

```
$ vagrnat init centos6.7
$ vagrant up
```

- vagrantにsshログイン

```
$ vagrant ssh
```

### 2. Javaインストール

- javaインストール

```
$ sudo yum install -y java-1.8.0-openjdk
```

- 確認

```
$ java -version
openjdk version "1.8.0_144"
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)
```


### 3. Embulkインストール

- Embulkインストール ＆ パスを通す

```
$ curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
$ chmod +x ~/.embulk/bin/embulk
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
```
- 確認

```
$ embulk --version
embulk 0.8.35
```

### 4. mkbundleでgemを管理できるようにする

- `embulk mkbundle`すると、`Gemfile`やプラグインの雛形が作られる

```
$ embulk mkbundle {ディレクトリ名}
```
下記のようなディレクトリ及び、ファイルが作成される。

```
{ディレクトリ名}/
   ├── Gemfile
   └── embulk
       ├── filter
       │   └── example.rb
       ├── input
       │   └── example.rb
       └── output
           └── example.rb
```
<font color="red">※追加したい外部プラグインはGemfileに追記する</font>

例: embulk-filter-evalの追加

```diff:Gemfile
source 'https://rubygems.org/'
gem 'embulk', '~> 0.8.0'
+ gem 'embulk-filter-eval'
```

Gemfileの書き方は[こちら](http://blog.yuhiisk.com/archive/2017/04/24/specify-the-version-of-gemfile.html)を参考にすると良いです


- `Gemfile`を更新した場合には、ディレクトリに移って、`embulk bundle`する。

```
$ cd bundle_dir
$ embulk bundle
```

### 5. サンプルファイル作成

- `embulk example {任意のディレクトリ名}`でサンプルプロジェクト?を作成する
    - サンプルのCSVや設定が作成される

```
$ embulk example {任意のディレクトリ名}
```

- ディレクトリ構成

```
{任意のディレクトリ名}./
    ├── csv
    │   └── sample_01.csv.gz
    └── seed.yml
```

### 6. 設定ファイルの雛形を作成
- embulkの設定を1から作成するのもいいが、元となるCSVがあれば、`embulk guess`コマンドで大体の設定を行ったファイルを作成してくれる

- 例えば今回だと`csv/sample_01.csv.gz`を元に`config.yml`を作成するとすると下記のようなコマンドとなる。

```
$ embulk guess ./dev_dir/seed.yml -o config.yml
```

- 作成された`config.yml`

```yml:config.yml
in:
  type: file
  path_prefix: /home/vagrant/./dev_dir/csv/sample_
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: LF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    null_string: 'NULL'
    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}
```

- デファルトの設定では、path_prefixで指定したcsvファイルの中身を標準出力する設定になっている。

### 7. 実行する

```
$ embulk run config.yml
2017-10-18 09:25:22.512 +0100: Embulk v0.8.35
2017-10-18 09:25:28.922 +0100 [INFO] (0001:transaction): Listing local files at directory '/home/vagrant/dev_dir/csv' filtering filename by prefix 'sample_'
2017-10-18 09:25:28.926 +0100 [INFO] (0001:transaction): "follow_symlinks" is set false. Note that symbolic links to directories are skipped.
2017-10-18 09:25:28.932 +0100 [INFO] (0001:transaction): Loading files [/home/vagrant/dev_dir/csv/sample_01.csv.gz]
2017-10-18 09:25:29.003 +0100 [INFO] (0001:transaction): Using local thread executor with max_threads=4 / output tasks 2 = input tasks 1 * 2
2017-10-18 09:25:29.020 +0100 [INFO] (0001: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,
2017-10-18 09:25:29.284 +0100 [INFO] (0001:transaction): {done:  1 / 1, running: 0}
2017-10-18 09:25:29.290 +0100 [INFO] (main): Committed.
2017-10-18 09:25:29.290 +0100 [INFO] (main): Next config diff: {"in":{"last_path":"/home/vagrant/dev_dir/csv/sample_01.csv.gz"},"out":{}}
```

- わかりにくいが、抜粋すると下記のようにcsvファイルの中身が出力されている

```
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,
```
- sample_01.csv.gzの中身を確認して比較してみる

```
$ zcat dev_dir/csv/sample_01.csv.gz
id,account,time,purchase,comment
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
```

ヘッダーを除いて、csvファイルの中身が出力されていることがわかる

# おわり