LoginSignup
11
13

More than 1 year has passed since last update.

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

Last updated at Posted at 2016-10-01

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機能で補完してくれると結構便利。

11
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13