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

2016年1月13日水曜日

Embulkの設定ファイルをLiquidに対応させて、環境変数を参照させる

1月も中旬に入り、少し遅くなりましたが、明けましておめでとうございます。
私個人は新年早々、生もので当たるハメになりましたが、A-AUTO 50は元気ですので、今年もよろしくお願いいたします。


2016年の1回目は、前年末から引き続きEmbulkの話になります。
ただし、以前とは少し毛色が違い、特定のプラグインではなく、設定ファイル自体について書いていきます。

Embulkに限らず、システムを利用・運用するうえで、"環境の違い"という問題に遭遇することは少なくないと思います。
OSやアーキテクチャのように決められているものから、意図して設定している環境設定など、その種類はさまざまですが、多くの場合、問題が発生するたび、その環境に対応させるためにシステムの設定を変更することになります。

Embulkの場合も、読み込むデータの場所や、データの形式、またデータによってはアクセスの情報などを設定ファイル内に記載するため、基本的に環境が変われば、その都度設定ファイルの情報を更新することになります。

この問題の解決方法の1つとして、Embulkのバージョン0.7から設定ファイルに"Liquid"が使えるようになりました。
今回、"Liquid"の詳細は記載しませんが、重要なのは"環境変数が設定ファイル内で参照できる"ことです。


なお、今回も基となるデータはexampleコマンド⇒guessコマンドによって生成されるデータ(sample_01.csv.gz)・ymlファイル(confing.yml)です。

使用データ
id,account,time,purchase,comment
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


設定ファイル内で環境変数を使うための手順


①設定ファイルの拡張子を".yml"から".yml.liquid"に変更する
まず、設定ファイルの拡張子を変更します。拡張子を変更に伴って、設定ファイル内を編集する必要はないので、単純に設定ファイルをリネーム or コピーすればいいだけです。

previewコマンド実行結果(拡張子変更前)
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

拡張子変更(コピー)
[ec2-user@ip-172-31-9-9 lib]$ cp config.yml config.yml.liquid

previewコマンド実行結果(拡張子変更後)
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

念のため、previewコマンドで実行結果を確認しましたが、特に問題なく、同じ結果となりました。


②環境変数を使いたい箇所を書き換える
ここで設定ファイル内を書き換えて、環境変数を参照するように設定します。
例として、読み込むデータを指定する"path_prefix"の値を、環境変数"embulk_source_path"を参照させてみます。

まずは環境変数"embulk_source_path"に元々"path_prefix"で設定されている値と同じ値で設定します。

環境変数設定&確認
[ec2-user@ip-172-31-9-9 lib]$ export embulk_source_path=/opt/embulk/lib/try1/csv/sample_
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_source_path

/opt/embulk/lib/try1/csv/sample_


後は設定ファイル内で"{{ env.環境変数名 }}"と指定すれば、設定されている環境変数を参照するようになります。
"embulk_source_path"を設定したので、"path_prefix"の値を"{{ env.embulk_source_path }}"と指定します。

config.yml.liquid(緑字を変更)
in:
  type: file
  path_prefix: {{ env.embulk_source_path }}
  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: stdout}

previewコマンド実行結果
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+


環境変数を参照するようになりましたが、読み込むデータ自体は以前と変わらないので、実行結果も以前と変わりません。

では、今度は環境変数を書き換えて、違うデータを読み込むように設定してみます。

[ec2-user@ip-172-31-9-9 lib]$ export embulk_source_path=/opt/embulk/lib/sample_
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_source_path

/opt/embulk/lib/sample_

読み込むデータ(/opt/embulk/lib/sample_01.csv.gz)
id,account,time,purchase,comment
11,11111,2015-01-01 19:23:49,20150101,embulk
12,22222,2015-01-02 19:01:23,20150102,embulk jruby
13,33333,2015-01-03 02:20:02,20150103,"Embulk ""csv"" parser plugin"
14,44444,2015-01-04 11:54:36,20150104,NULL

previewコマンド実行結果
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|      11 |       11,111 | 2015-01-01 19:23:49 UTC | 2015-01-01 00:00:00 UTC |                     embulk |
|      12 |       22,222 | 2015-01-02 19:01:23 UTC | 2015-01-02 00:00:00 UTC |               embulk jruby |
|      13 |       33,333 | 2015-01-03 02:20:02 UTC | 2015-01-03 00:00:00 UTC | Embulk "csv" parser plugin |
|      14 |       44,444 | 2015-01-04 11:54:36 UTC | 2015-01-04 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+


以前の実行結果とは異なり、書き換えた環境変数のファイルを読み込んでいます。

これで環境ごとに必要な環境変数を設定するだけで、読み込むデータを指定できるようにできました。


プラグインで環境変数を参照させる

基本設定の"path_prefix"で環境変数を参照させられましたが、同様にプラグインにおいても環境変数を参照させることができます。

例として前回ご紹介した"embulk-filter-insert"プラグインを利用して、環境変数の値を新しいカラムとして追加してみます。

まずは環境変数"embulk_insert_env"に固定文字列"env"を設定します。

環境変数設定&確認
[ec2-user@ip-172-31-9-9 lib]$ export embulk_insert_env=env
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_insert_env

env


後は"path_prefix"を環境変数で参照させたときと同様に、追加するカラムの値に"{{ env.embulk_insert_env }}"と指定します。

config.yml.liquid(緑字を変更)
in:
  type: file
  path_prefix: /opt/embulk/lib/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}
filters:
  - { type: insert, column: { env: {{ env.embulk_insert_env }} }, at: top }
out: {type: stdout}

previewコマンド実行結果
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|        env |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|        env |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|        env |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|        env |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+

しっかり環境変数で設定した後が、新しいカラムとして追加されています。


なお、embulkコマンドをsudoで実行している場合、通常のsudoでは環境変数は引き継がないため、オプションにより環境変数を引き継いで実行する必要があります。

previewコマンドを例にすると、次のようになります。

通常のsudo(環境変数を引き継がない)
[ec2-user@ip-172-31-9-9 lib]$ sudo embulk preview 設定ファイル

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|            |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|            |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|            |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|            |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+

-Eオプション付きsudo(環境変数を引き継ぐ)
[ec2-user@ip-172-31-9-9 lib]$ sudo -E embulk preview 設定ファイル

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|        env |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|        env |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|        env |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|        env |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+


このように環境変数を上手く利用することで、異なる環境においても設定ファイルを直接更新せずに実行させられようになり、Embulkの汎用性を高めることができます。

2015年12月15日火曜日

EmbulkのFILTER系プラグインを使ってみた(embulk-filter-insert,embulk-filter-split)

こんにちは、井下です。

前回に引き続き、EmbulkのFILTER系プラグインを使ってみるということで、"embulk-filter-insert"と"embulk-filter-split"を使ってみます。

なお、今回も基となるデータはexampleコマンド⇒guessコマンドによって生成されるデータ・ymlファイルです。

使用データ
id,account,time,purchase,comment
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

デフォルトでのpreviewコマンド実行結果
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+


1.embulk-filter-insert

"insert"とありますが、このプラグインはカラムのインサートを行います。
単純にカラムをインサートするだけではなく、"どこ"にインサートするのか、"どの型"でインサートするのかを設定することができます。
特に"どこ"にインサートするのかの設定方法は多く用意されており、最初のカラムや最後のカラムといった指定から、何カラム目かの指定、◯◯カラムの前or後の指定ができるようになっています。

GitHub上のExampleの通り、最初のカラムとして"host_name"カラムを追加してみます。

Embulkの読み込み用ymlファイル(緑字を追記)
in:
  type: file
  path_prefix: ~/lib/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}
filters:
  - { type: insert, column: { host_name: host01 }, at: top }
out: {type: stdout}

デフォルトでのpreviewコマンド実行結果
+------------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| host_name:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|           host01 |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|           host01 |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|           host01 |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|           host01 |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+------------------+---------+--------------+-------------------------+-------------------------+----------------------------+

最初のカラムにhost_nameカラムが追加されました。同様に"at"パラメータに"bottom"を指定すれば、最後のカラムとして追加されるようになりますし、数値を指定すれば、指定したカラムとして追加されるようになります。("2"を指定すれば、2カラム目として追加)
※なお、"at"パラメータには他に"head"、"tail"も指定できますが、実行してみた限りでは、"head"は"top"と同じ、"tail"は"bottom"と同じ動作をしていました。

また、"at"パラメータの代わりに"before"もしくは"after"パラメータの設定でカラム名を指定すると、指定したカラムの"前"or"後"にカラムをインサートすることができます。

2015年12月3日木曜日

EmbulkのFILTER系プラグインを使ってみた(embulk-filter-column,embulk-filter-row)

こんにちは、井下です。

しばらく触れられていませんでしたが、久しぶりにEmbulkについて書いていきます。
タイトル通り、2つのFILTER系プラグインを使ってみて、どのようにデータをいじれるのかを検証してみます。
なお、検証のために使うデータ・ymlファイルのベースは、Embulkのexampleコマンド⇒guessコマンドによって生成されるデータ・ymlファイルです。


ちなみに以前書いたEmbulkの内容は以下の通りです。

1.embulk-filter-column

2015年12月現在、FILTER系では一番ダウンロードされている(GitHubから)プラグイン、embulk-filter-columnです。
主にできることは"カラムの絞り込み"と"カラムの追加"です。

GitHub上のREADMEではExampleとして"columns"、"add_columns"、"drop_columns"の説明があります。
"add_columns"は"カラムの追加"、"drop_columns"は"カラムの絞り込み"、"columns"は"カラムの絞り込みとカラムの追加の両方"に対応しています。

1-1.add_columnsの例

add_columnsでは2通りのカラムの追加方法があります。

1つ目は、追加するカラムのデフォルト値を用意する方法。
2つ目は、元々存在しているカラムの値をコピーし、新しいカラムとする方法。

例として、1つ目の方法として"add_time"カラムを追加し、2つ目の方法として"copy_id"カラムを追加します。

データ(guessコマンドの自動生成のまま。特筆しない限り以降も同じデータです)
id,account,time,purchase,comment
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

Embulkの読み込み用ymlファイル(緑字を追記)
in:
  type: file
  path_prefix: ~/lib/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}
filters:
  - type: column
    add_columns:
      - {name: add_time, type: timestamp, default: '20151201', format: "%Y%m%d" }
      - {name: copy_id, src: id}
out: {type: stdout}

なお、デフォルト値は"default"キーに指定します。上記のymlファイルでは"20151201"を指定しました。
コピー元のカラムは"src"キーに指定します。上記のymlファイルでは"id"を指定しました。

実行結果(preview)
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |      add_time:timestamp | copy_id:long |
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk | 2015-12-01 00:00:00 UTC |            1 |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby | 2015-12-01 00:00:00 UTC |            2 |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin | 2015-12-01 00:00:00 UTC |            3 |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL | 2015-12-01 00:00:00 UTC |            4 |
+---------+--------------+-------------------------+-------------------------+----------------------------+-------------------------+--------------+

実行結果を見ると、ymlファイル内で定義した通りの値で、"add_time"カラムと"copy_id"カラムが追加されていることが分かります。
※カラム名を分かりやすくするため、previewの実行結果を表示しています。timestamp型のデータにタイムゾーンが表示されているのはそのためです。
 なお、runの場合、"add_time"の値は"2015-12-01 00:00:00.000000 +0000"と表示されていました


2015年6月25日木曜日

Embulkを使ってWordPressのデータを出力してみる

はじめに

こんにちは、井下です。

今までに何度かEmbulkについて書いてきましたが、プラグインの使い方が主な内容だったので、今回はEmbulkを使って何をするかに焦点を当ててみようと思います。

そこでタイトルの通り、Embulkを使い、ウェブサイトやブログの構築によく利用されているWordPressからデータを出力してみます。

WordPressは元々エクスポート機能を備えていますが、定期的に出力しているようなケースであれば、Embulkを使うことで作業の効率化を見込めます。

例えば、毎日のユーザ登録数の推移を見てみたい、という場合、毎日管理画面にログインしてデータをエクスポートするより、自動でデータがファイルにまとめられていて、そのファイルを見るだけになっている方が楽ですよね。

そういったちょっとした手間を省けるようになります。

※過去の関連ブログ
データ転送のOSS「Embulk」を使って、MysqlからデータをCsvに落としてみる
embulk-filter-evalでどんなデータ変換ができるのか試してみる

Embulkの準備

Embulkをまだインストールしていないのであれば、下記のクイックスタートを参考にして、Embulkが利用できるように準備します。
https://github.com/embulk/embulk#quick-start

Embulkについての情報を集めたいのであれば、下記のまとめを利用しましょう。
http://qiita.com/hiroysato/items/397f36c4838a0a93e352

Embulkはデータのインプット・アウトプット先をプラグインによって拡張する仕組みになっています。WordPressは各データの管理をMySQLで行っているため、MySQLをインプット先にできるように、embulk-input-mysqlプラグインをインストールしておきます。
https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql

embulk-input-mysqlプラグインはEmbulkをインストールした後、下記のコマンドによってインストールできます。

C:\~>embulk gem install embulk-input-mysql

WordPressのテーブル設計について

Embulkの準備が完了した後は、WordPressからどんなデータを取得するのかを決めておきます。
下記のWordPressの標準インストールで作成されるテーブル一覧を参考にして、欲しいデータがどのテーブルのどのカラムにあるのかを確認します。
http://wpdocs.osdn.jp/データベース構造#.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB.E4.B8.80.E8.A6.A7

なお、プラグイン等の拡張によって追加された機能は、別途テーブルを作成しているので、その場合は機能ごとに対応したテーブルを調べる必要があります。

今回は例として、標準インストールで作成されるusersテーブルのID、user_login、user_registeredの3カラムを出力対象として話を進めていきます。

Embulkの実行

Embulkの実行は基本として、下記のコマンドで行います。

C:\~>embulk run config.yml

"config.yml"を入力パラメータとするような形式です。この"config.yml"にインプット・アウトプット先などを定義します。("config.yml"は固定名ではなく、任意の名前に変更しても大丈夫です。)

サンプルとして、usersテーブルのID、user_login、user_registeredをcsvファイルに出力する設定のymlファイルを記載します。

2015年6月10日水曜日

embulk-filter-evalでどんなデータ変換ができるのか試してみる

こんにちは、井下です。

少し前のブログで、OSSのEmbulkについて書いてみましたが、MysqlからCsvへの変換という無難な内容だったので、今回はあまり使用例がアップされていないプラグインにフォーカスしてみます。

フォーカスするプラグインは、データの変換をRubyのコードで定義できる"embulk-filter-eval"です。

embulk-filter-evalの概要

embulk-filter-evalは"FILTER"に分類されるプラグインで、"INPUT"でデータを読み込んだ後、"OUTPUT"にデータを渡す前に、データに変換処理を加えられます。
また、出力するカラムを選択できるので、不要なカラムを切り捨てることもできます。

データの転送に際して、ちょっとしたデータの加工をしたい場合や、決まったフォーマットへの変換処理に使えそうですね。

データの変換内容はRubyのコードで定義できるそうですが、具体的にどんなことができるのか、使ってみて分かったことを書いていきます。
なお、出力カラムの選択に関しては、下記の資料を見ればすぐに分かる設定ですので、今回は特に触れません。

インストール方法、ymlファイルの書式、出力カラムの選択方法などは下記のGitHubにアップされている資料をご参照ください。
https://github.com/mgi166/embulk-filter-eval


embulk-filter-evalの利用例

ここから具体的なデータ変換パターンについて、実際に試してみます。
 インプットのデータは"embulk example"で作成されるサンプルデータとし、ymlを編集する都度、"embulk preview config.yml"コマンドでどんな変換がされるのか確認していきます。
※どんな変換が行えるかの確認が目的なので、以降の利用例では計算の中身に深い意味は持たせていません

補足として、変換なしの"embulk preview config.yml"の結果は下記の通りです。
以降、embulk-filter-evalによる変換後の出力との比較として参考にしてください。
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

数値の計算

GitHubにアップされている資料内にもありますが、手始めに数値計算から。
ymlファイルを次のように書き換えて、再度実行します。

filters: 
  - type: eval 
    eval_columns: 
      - id: value * 2
      - account: value / 3
      - time: value
      - purchase: value
      - comment: value

期待するデータの変換内容は
  • idカラムの値が2倍になる
  • accountカラムの値が3分の1になる

実行結果は次のようになりました。
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       2 |       10,954 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       4 |        4,941 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       6 |        9,186 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       8 |        3,756 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

idカラムは期待通り2倍になっていますが、accountカラムは3分の1になったうえで小数点以下が切り捨てられてますね。整数同士の除算は整数になるRubyの仕様上、そうなっているのでしょうか。

Rubyの除算の仕様が原因だとすれば、除算している値のどちらかをfloatとして明示すれば、小数点以下も表示されるはずです。
そこで、ymlファイルを次のように書き換えてみます。

filters:
  - type: eval
    eval_columns:
      - id: value * 2
      - account: value / 3.to_f
      - time: value
      - purchase: value
      - comment: value

accountカラムの除算する数値を、floatとして明示しています。

ですが、結果は変わらず小数点が出ないまま…。
その後、色々試してみて分かりましたが、accountカラムの型がlong(整数)である以上、小数点以下は出ないようです。(accountカラムをdoubleにすると、最初のymlファイルでも小数点以下が表示されました)

embulk-filter-evalはデータ変換はするものの、根本的な型を変えたり、制約を越えられないようです。


2015年6月2日火曜日

AWSのリソース使用状況レポートを自動生成しインスタンスタイプの最適化を図る【メトリクスデータ収集・整形編】

こんにちは、井下です。

スマフォのカバーをつけてから2ヵ月ほど、既に傷だらけになっているので、そろそろ買い換えようかなと思っているところです。
スマフォ自体も劣化してる部分があるのですが、デザインは気に入っているので、中身だけ取り換えたいと思っています。あまりスペックのこだわりはないのですが、そういうところ考えもあってAraには期待しています。(Araで気に入るデザインが出てからの話になりますが)

はじめに

さて、前回はカスタムメトリクスのデータを送信するバッチ・シェルについて説明しました。
今回は標準メトリクス・カスタムメトリクスからデータを収集するバッチ(バッチ2)と、データを整形するバッチ(バッチ3)について説明します。

おさらいになりますが、用意する全バッチは下表の通りです。

バッチ名 処理内容 実行周期
バッチ1インスタンス内でデータを取得し、カスタムメトリクスとしてCloudWatchへ送信します。1分ごと
シェル1バッチ1のシェル版です。Linuxのカスタムメトリクスを取得・送信したい場合は、こちらを利用します。1分ごと
バッチ2 前日分の標準メトリクス・カスタムメトリクスのデータを取得します。 日次
バッチ3 バッチ2で取得したデータをまとめ、OSSのEmbulkを利用して整形します。 月次
バッチ4 バッチ3で整形されたデータから、レポートとしてExcelのグラフを作成します。 月次


バッチ2(メトリクスデータ収集)


処理概要

バッチ実行日の前日分のメトリクスデータを収集します。
なお、収集するメトリクスのデータは下記の7つです。
  • CPU使用率(%)
  • 空メモリー容量(MByte)
  • メモリー使用率(%)
  • ロードアベレージ(個)
  • 仮想メモリー使用率(%)
  • ネットワーク受信バイト数(Byte)
  • ネットワーク送信バイト数(Byte)

パラメータ

第1パラメータ (必須):リージョンコード
第2パラメータ (必須):インスタンスID
第3パラメータ (任意):ave:平均値(省略時デフォルト)
               max:最大値

※CloudWatchでは、収集するメトリクスデータは平均値、最大値、最小値などから選択することができます。本バッチでは、maxかaveを指定します。

リターンコード

0 : 正常終了しました
1 : データが0件のメトリクスがありました
4 : パラメータの指定が不正
8 : メトリクスデータ収集に失敗しました
12: 収集したデータ出力に失敗しました

サンプルバッチ

2015年5月13日水曜日

データ転送のOSS「Embulk」を使って、MysqlからデータをCsvに落としてみる

こんにちは、井下です。

ゴールデンウィーク中はほぼ毎日出かけてましたが、おかげで財布が寒いことになってしまいました。もうクールビズ期間になるくらい、気温は上がっているというのに…。


さて、今回はOSSについて取り上げてみようと思います。
メジャーなOSSだけでも、サーバ監視のZabbix、メールサーバのPostfix、クラウド環境を構築できるOpenStack、A-AUTO 50サイトでも利用しているCMSのWordPressなど今や膨大な数になっています。

新しいOSSも次々とリリースされているので、1年もすればメジャーなOSSの数が倍くらいになっているかもしれません。また、消えていくものもたくさんあるので、OSSの選択は重要ですね。

そこで、今回は新しいOSSに着目し、2015/1/27にリリースされたデータ転送のOSS、Embulk(エンバルク)についての紹介と、実際に利用してみます。


Embulkとは

Embulkとは、先に書いたようにデータ転送のOSSですが、特徴としてデータのインプット・アウトプットや、データの加工をプラグインとして拡張することができます。
既に一般的なDBからのインプット・アウトプットのプラグインや、Amazon S3からのインプット・アウトプとのプラグインが利用できるようになっています。

プラグイン一覧:http://www.embulk.org/plugins/


ご存知の方も多いと思いますが、同様の特徴を持つfluentdというOSSがあります。
Embulkはfluentdのバッチ版として位置づけられ、サーバに常駐してリアルタイムでログを送信するfluentdに対し、Embulkは定期実行や一度だけの実行に利用するものとされています。

例えばDBからcsvファイルとしてデータを落としたいものの、日次で取得できれば十分な場合などに使えそうですね。


とりあえず試してみたい方は下記のテスト実行手順を参考にしてみてください。サンプルデータの作成コマンドが用意されているので、試してみる敷居は低くなっています。
https://github.com/embulk/embulk#trying-the-example


ここからは、実際にDB(より具体的に言うとMysql)から、csvファイルとしてデータを落としてみます。
ちなみに今回はEmbulkの仕組みや、設定に関して詳しい説明はしません。(分かりやすい解説サイトもたくさんありますので…)
Embulkを使ってみて、こんなことができるだなという感じを掴んでもらればいいなと思っています。


実際にやってみる

特徴として挙げたように、Embulkはプラグインによってインプットやアウトプットの幅を広げることができます。
まず、WordPressのDBとして利用されているMySQLからデータを抜き出せるように、"embulk-input-mysql"をインストールします。

[embulk]# embulk gem install embulk-input-mysql
2015-05-11 02:32:29.417 -0400: Embulk v0.6.2
Fetching: embulk-input-mysql-0.4.0.gem (100%)
Successfully installed embulk-input-mysql-0.4.0
1 gem installed

これでEmbulkを使ってMysqlのデータを取り出すことができるようになりました。

次にymlファイルを編集します。
ymlファイルとは、Embulk実行時にインプットにするいわば設計図にあたるファイルで、これによってインプットの種類や内容、同様にアウトプットの種類や内容、データの加工方法について記載します。