ラベル embulk の投稿を表示しています。 すべての投稿を表示
ラベル embulk の投稿を表示しています。 すべての投稿を表示

2015年9月25日金曜日

embulk-input-s3 を試してみた

概要

前回 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 でかつサイズが大きい場合などは、どれくらいの負荷になるのかが気になりました

ファイルの命名規則だけ気をつけて、あとはバケットにアップロードして実行すれば一気に解析してくれるのが便利なポイントだと思いました

定期的に実行する場合とかを考えると、一度解析したファイルは別のバケットに移動したり削除したりしなければいけないのかな?そうなるとちょっと処理を挟まないとダメですね
その辺りもプラグインがあるのだろうか

2015年9月24日木曜日

embulk 試してみた

概要

embulk の QuickStart を試してみました
何事も試して感覚をつかむ

環境

  • CentOS 6.6 64bit
  • embulk 0.7.4
  • Java OpenJDK 1.8.0_45

インストール

以下 root で作業しています
Javaが必要なのでインストールしていない場合は事前にインストールしてください

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

特に考える必要はないと思います
ダウンロードして権限を変えて PATH に通してあげているだけです

Quick Start

インストールしたらサンプルデータで試します

  • mkdir ~/work
  • cd ~/work
  • embulk example ./try1
  • embulk guess ./try1/example.yml -o config.yml
  • embulk preview config.yml
  • embulk run config.yml

exampleでサンプルデータを作成して
guessで設定ファイルを自動生成して
previewで読み込んだデータがちゃんとパースされるかテストして
runで実際に実行させます

だいぶ省略したサブコマンドの説明なので詳細は公式等みてください
とりあえずこれを実行するとexampleで生成された CSV データを読み込んで標準出力にその内容を出力してくれます

2015-09-24 14:00:29.248 +0900: Embulk v0.7.4
2015-09-24 14:00:31.432 +0900 [INFO] (transaction): Listing local files at directory ‘/root/work/embulk/try1/csv’ filtering filename by prefix ‘sample_’
2015-09-24 14:00:31.438 +0900 [INFO] (transaction): Loading files [/root/work/embulk/try1/csv/sample_01.csv.gz]
2015-09-24 14:00:31.524 +0900 [INFO] (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,NULL
2015-09-24 14:00:31.815 +0900 [INFO] (transaction): {done: 1 / 1, running: 0}
2015-09-24 14:00:31.822 +0900 [INFO] (main): Committed.
2015-09-24 14:00:31.823 +0900 [INFO] (main): Next config diff: {“in”:{“last_path”:”/root/work/embulk/try1/csv/sample_01.csv.gz”},”out”:{}}

プラグインを試す

プラグインの使い方まで試します
今回使用するプラグインは embulk-output-command です

  • embulk gem install embulk-output-command
  • vim config_try_plugin.yml
in:
  type: file
  path_prefix: /root/work/embulk/try1/csv/sample_
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    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: command
  command: "cat -> task.$INDEX.$SEQID.csv.gz"
  encoders:
  - {type: gzip}
  formatter:
    type: csv

config_try_plugin.ymlはデフォルトで生成されるconfig.ymlを元にするといいです
変わっているのはout:の部分でここでインストールしたプラグインを使っています

これをインストールするとtype: commandが使えるようになりcommand:に指定したコマンドを実行することができます
サンプルの場合in:で読み込んだ CSV ファイルを名前のフォーマットを変更して再度 CSV に出力しています

$INDEX$SEQID について

command:内で変数を使っています

簡単に説明すると $INDEX は読み込んだファイルの数だけインクリメントしてくれる変数です
例えばサンプルで使用した try1/csv/sample_01.csv.gz ともう一つ try1/csv/sample_02.csv.gz というファイルを作成すると $INDEX をインクリメントしてくれます

$SEQID は formatter の数に依存します
formatter が複数あった場合、0 から順番にインクリメントしてくれます

最後に

公式の Quick Start をやっただけなので特に躓くこともなく簡単に使うことができました

実行してみるとわかりますが、embulk は並列実行なので、複数のファイルを in: で読み込んだ場合は 1 つ目のファイルが終わってから 2 つ目のファイルを実行するわけではなく、一気に 2 つのファイルの処理がはじまります

本当に試しただけなので、まだ現場レベルでの有効な使い道は思い浮かびませんが機会があれば使いたいかなと