概要
前回 embulk のクイックスタートを試してみました
今回はちょっと実践編ということで AWS の S3 と連携させてみました
環境
- CentOS 6.6 64bit
- embulk 0.7.4
- Java OpenJDK 1.8.0_45
- embulk-input-s3 0.2.2
インストール
基本的なインストールは前回の記事を参考にインストールしてください
embulk-input-s3 のインストール
プラグインをインストールします
- embulk gem install embulk-input-s3
設定ファイルの編集
S3 と連携する専用の設定ファイルを作成します
とりあえず設定ファイルの全貌は以下の通りです
- vim config_s3.yml
in:
type: s3
bucket: my-service-bucket
path_prefix: logs/csv-
endpoint: s3-ap-northeast-1.amazonaws.com
access_key_id: xxxxxxxxxx
secret_access_key: yyyyyyyyyy
parser:
charset: UTF-8
newline: CRLF
type: csv
delimiter: ','
quote: '"'
trim_if_not_quoted: false
skip_header_lines: 0
allow_extra_columns: false
allow_optional_columns: false
columns:
- {name: id, type: long}
- {name: name, type: string}
- {name: lang, type: string}
- {name: level, type: long}
out:
type: command
command: "cat -> task.$INDEX.$SEQID.csv.gz"
encoders:
- {type: gzip}
formatter:
type: csv
処理の流れとしては S3 にアップロードした CSV ファイルを読み込んでサーバ上に圧縮した CSV として保存します
各種パラメータについて
簡単に説明します
in:
でインストールしたプラグインを使用します
type: s3
と指定することで S3 にあるデータを参照することができます
指定が必要なパラメータは以下の通りです
- bucket・・・参照先のバケットを指定します
- path_prefix・・・バケット配下に存在する解析対象のファイルのプレフィックスを指定します
- endpoint・・・バケットが存在するエンドポイント (リージョン) を指定します
- access_key_id・・・S3 にアクセスするためのアクセスキーを記載します
- secret_access_key・・・S3 にアクセスするためのシークレットキーを記載します
各自の環境に合わせて適当な値を入力すればOKです
parser:
も設定が必須になっています
ここの設定は 前回 の CSV ファイルの解析を元にしています
若干違うのは skip_header_lines
, columns
の部分です
あと、今回は圧縮していない平文の CSV ファイルを対象にするので decoders:
の定義も削除しています
今回解析する CSV ファイルのサンプルは以下の通りです
- csv-user-skills
1,kaka,java,10
2,kiki,ruby,5
3,keke,lisp,6
ファイル名は設定ファイルに記載したプレフィックスで始まるようにしてください
実際に試す際はどんな内容の CSV でも OK ですが、設定ファイルの columns:
の数とカラム数は合わせる必要があるので注意してください
CSV ファイルを指定したバケット配下に配置する
配置は UI からでも API からでも何でもOKです
設定ファイルに記載したバケット配下のパスプレフィックスにアップロードしてください
実行する
ここまでくればあとは実行するだけです
- embulk preview config_s3.yml
で S3 に配置した CSV の情報が出力されることを確認します
- embulk preview config_s3.yml
で out:
に記載されている命令が実行され embulk-output-command を使って圧縮済みの CSV ファイルが実行したサーバ上に作成されていることが確認できると思います
S3 に 1 つだけ CSV をアップロードした場合は「task.0.0.csv.gz」という名前の CSV ファイルが 1 つだけ作成されます
S3 上に複数の CSV ファイルをアップロードした場合はアップロードした CSV の数だけ「task.1.0.csv.gz」みたいな感じで、前の数字がインクリメントされたファイルが作成されます
最後に
今回は小さい 1 つの CSV ファイルを対象にしましたが、これが大量の CSV でかつサイズが大きい場合などは、どれくらいの負荷になるのかが気になりました
ファイルの命名規則だけ気をつけて、あとはバケットにアップロードして実行すれば一気に解析してくれるのが便利なポイントだと思いました
定期的に実行する場合とかを考えると、一度解析したファイルは別のバケットに移動したり削除したりしなければいけないのかな?そうなるとちょっと処理を挟まないとダメですね
その辺りもプラグインがあるのだろうか