Treasure Data社製のバルクデータローダーOSS 『embulk』 を試したメモ。
v0.8.13
S3の指定バケットに格納した複数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(出力)の3要素で構成され、それぞれプラグインが提供されている。(独自に追加も可能)
今回は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テーブル。
列名は元データの1行目ヘッダーから自動的に認識(guess)され、型も元データの値から自動で定義してくれている。
postgres=> \d titanic
テーブル "public.titanic"
列 | 型 | 修飾語
----------+---------+--------
No | bigint |
Class | text |
Sex | text |
Age | text |
Survived | boolean |
Freq | bigint |
DB側のテーブル定義(SQL)を作成するのは結構面倒なので、guess機能で補完してくれると結構便利。