AWSでembulkを試したメモ（S3からRDSへロード）

Treasure Data社製のバルクデータローダーOSS 『embulk』 を試したメモ。
v0.8.13

S３の指定バケットに格納した複数csvファイルを、RDS（Postgresql）にLOADする。
AWSの構成は、S3のバケット、embulk実行用EC2(Amazon Linux)、RDS(Postgresql)で、事前に準備する。

ドキュメント）
http://www.embulk.org/docs/index.html
https://github.com/embulk/embulk

参考）
http://dev.classmethod.jp/tool/embulk-ataglance/
http://dev.classmethod.jp/tool/embulk-guess-01/
http://qiita.com/t-yotsu/items/48b9154db94f85726777


#embulkインストール

以下スクリプトを実行。基本的にダウンロードして配置するのみ。
※Javaもインストールする必要あり。

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


#embulkのプラグインインストール

embulkはINPUT(入力)、FILTER（加工）、OUTPUT(出力)の３要素で構成され、それぞれプラグインが提供されている。（独自に追加も可能）
今回はS3入力、Postgresql出力なので、それぞれのプラグインをインストールする。

```
embulk gem install embulk-input-s3
embulk gem install embulk-output-postgresql
```


#設定ファイル(yaml)を作成

今回はサンプルデータとして以下のようなCSVファイルを準備し、S3に格納しておく。

```
“No”,”Class","Sex","Age","Survived","Freq"
"1","1st","Male","Child","No",0
"2","2nd","Male","Child","No",0
"3","3rd","Male","Child","No",35
"4","Crew","Male","Child","No",0
"5","1st","Female","Child","No",0
"6","2nd","Female","Child","No",0
"7","3rd","Female","Child","No",17
"8","Crew","Female","Child","No",0
 ：
```

S3のtestバケットに、20160101というディレクトリを掘り、その配下に上記の Titanic.csvを格納した。

以下がembulk用の設定yamlファイル例。
s3://test/20160101 配下のファイルを、RDS上のtitanicテーブルにINSERTするという意味。

test.yaml

```
in:
  type: s3
  bucket: test
  path_prefix: 20160101
  endpoint: s3-ap-northeast-1.amazonaws.com
  access_key_id: [AWSアクセスキー]
  secret_access_key: [AWSシークレットアクセスキー]  
out:
  type: postgresql
  host: XXX.ap-northeast-1.rds.amazonaws.com
  user: [DBユーザ]
  password: [DBパスワード]
  database: [DB名]
  table: titanic
  mode: insert
```

embulkでは、入力ファイルをもとにデータ定義を推測(guess)し、CREATE文とINSERT文を自動生成してくれるGuess機能がある。

#Guess機能で設定ファイル(yaml)を作成


```
embulk guess ./test.yaml -o guessed.yaml
```

すると、以下のように、推測により補完されたyamlが生成される。

```
in:
  type: s3
  bucket: test
  path_prefix: 20160101
  endpoint: s3-ap-northeast-1.amazonaws.com
  access_key_id: XXXXX
  secret_access_key: XXXXX
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: No, type: long}
    - {name: Class, type: string}
    - {name: Sex, type: string}
    - {name: Age, type: string}
    - {name: Survived, type: boolean}
    - {name: Freq, type: long}
out: {type: postgresql, host: XXXXX.ap-northeast-1.rds.amazonaws.com,
  user: XXX, password: XXX, database: postgres, table: titanic, mode: insert}
```

実際のデータを参照し、データ項目、型を予測していることがわかる。
誤りがあればここで手動で修正しておく。


#embulkによるロード実行

```
embulk run guessed.yaml
```

RDS上にpublic.titanicというテーブルが自動生成され、INSERTされた。
今回S3上に複数ファイルを格納したが、全てINSERTされていた。

自動生成されたtitanicテーブル。
列名は元データの１行目ヘッダーから自動的に認識(guess)され、型も元データの値から自動で定義してくれている。

```
postgres=> \d titanic
  テーブル "public.titanic"
    列    |   型    | 修飾語 
----------+---------+--------
 No       | bigint  | 
 Class    | text    | 
 Sex      | text    | 
 Age      | text    | 
 Survived | boolean | 
 Freq     | bigint  | 
```

DB側のテーブル定義（SQL）を作成するのは結構面倒なので、guess機能で補完してくれると結構便利。