はじめまして。2017年度新入社員の増田です。現在WEBサービス開発グループでOJT中です。ちなみに読み方は”ますた“ですのでよろしくお願いします。
今回私が書くのは、環境変数を使ってembulkをより便利に使っていこうというお話です。
embulkとは、Treasure Dataによって開発されたオープンソースのバルクデータローダーです。よくfluentdのバッチ版と称されてますね。embulkは、fluentdと同様にプラグインが充実しており、インプット側とアウトプット側のプラグインを組み合わせれば様々な処理を行うことができます。例えば、csvファイルをRDBに入れたり、RDBからElasticsearchにデータを交換したりなどといった処理が簡単に行えます。また、フィルタープラグインを利用すればインプットしたデータを加工して投入することも可能です。
前述したとおり、embulkはバッチ処理であるので、基本的にはcronなどに仕込んで利用します。もちろん、シェルスクリプトに内包することも可能で、活用すればよりembulkを使う幅が広がるのではないでしょうか。今回はテストを通して、皆さんに便利さをわかっていただければと思います。
今回のテスト概要
MySQLに入っているデータをElasticsearchにデータを格納するというテストをしてみます。取り込むデータは現在時刻からちょうど24時間前のデータから5分前のデータまでを取り込みます。
インストール
まずはembulkをインストールしてみましょう。公式ドキュメントから引用させていただきます。embulkを利用するユーザに切り替えて以下のコマンドを叩きましょう。
1 2 3 4 |
curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar" chmod +x ~/.embulk/bin/embulk echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc source ~/.bashrc |
次に、データソースに接続するためのプラグインをインストールしますが、embulkのプラグインのインストールは非常にシンプルです。
1 |
embulk gem install XXXXX |
このコマンドを叩くだけで簡単にプラグインのインストールができます。
今回は、インプットのプラグインとしてembulk-input-jdbc
アウトプットのプラグインとしてembulk-output-elasticsearch を利用します。
configファイルの作成
これで準備は整いました。早速configファイルを作成していきましょう。configファイルとはembulkを動かすときに読み込むファイルで、このファイルの情報を基にembulkは動作します。configファイルはymlで記述しますが、環境変数を利用するためにはファイル名の拡張子を.yml.liquidにする必要があります。そして、configファイル内では{{ env.XXX}}と記述すれば環境変数を読み出すことができます。
そんなことを踏まえてこんな感じに作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
in: type: mysql host: localhost user: {{ env.USER_NAME}} password: {{env.PASSWORD}} database: {{ env.DATABASE}} table: {{ env.TABLE }} select: "col1, col2, col3" where: "time > '{{ env.FROM_TIME }}' and time < '{{ env.TO_TIME }}'" out: type: elasticsearch nodes: - {host: {{ env.ELASTIC_HOST_NAME }} , port: 9200} index: {{ env.INDEX_NAME }} index_type: {{ env.INDEX_TYPE }} bulk_actions: 1000 mode: insert |
こうやってユーザ名やパスワード、向き先のホスト名、MySQLに投げるSQLなどを直接configファイルに記述するのではなく、環境変数で後からセットするような仕様にすることでembulkを柔軟に動作させることができます。次は、embulkを起動するメインスクリプトを記述していきます。
スクリプトファイルの作成
では、embulkを起動させるメインスクリプトを記述していきます。embulkを起動させるためにはこのコマンドを叩きます。
1 |
embulk run {configファイル} |
また、オプションとして”-J-Xmx”を記述してあげると最大のヒープサイズを指定することができます。他にも指定できるオプションはたくさんあります。(参考: http://qiita.com/hiroysato/items/86ad1cdfb1754440eed5)
そんなことを踏まえてこんな感じに作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#!/bin/bash #embulkのbin EMBULK_BIN="/home/embulk/.embulk/bin/embulk" # CONFIGホーム CONFIG_HOME="/home/embulk/config" # 実行CONFIGファイル CONFIG_FILE_NAME="masutatest.yml.liquid" # CONFIG PATH CONFIG_PATH=${BATCH_HOME}/${CONFIG_FILE_NAME} #Elasticsearchのホスト名 ELASTIC_HOST_NAME="localhost" export ELASTIC_HOST_NAME #MYSQLのユーザ名とパスワードとデータベースとテーブルの取得 USER_NAME=`sed -n 1p /home/embulk/shell/mysqluser` export USER_NAME USER_PASS=`sed -n 2p /home/embulk/shell/mysqluser` export USER_PASS DATABASE=`sed -n 3p /home/embulk/shell/mysqluser` export DATABASE TABLE=`sed -n 4p /home/embulk/shell/mysqluser` export TABLE #検索時刻の設定(1日前~5分前のデータを検索) FROM_DATE=`date -d '1 days ago' '+%Y-%m-%d %H:%M:%S'` export FROM_DATE TO_DATE=`date -d '5 minutes ago' '+%Y-%m-%d %H:%M:%S'` export TO_DATE INDEX_NAME="masutatest" export INDEX_NAME INDEX_TYPE="test" export INDEX_TYPE #embulkの実行 $EMBULK_BIN -J-Xmx1024m run ${CONFIG_PATH} #終了処理 exit 0 |
このような感じで変数に値を入れて、exportで環境変数化をしています。この環境変数が先ほど記述したconfigファイルを読み出すときに、読み込まれてembulkがそのように動作をしてくれるというわけです。更に複雑なスクリプトを組めばより、動的にembulkのconfigファイルの中身を変えることもできます。このように、configファイルに直接記述するのではなくシェルスクリプトを経由することで、embulkの柔軟性が高くなります。
実行
では、早速テストをしてみましょう。MySQLに格納されているデータの中から現在時刻の24時間前から5分前までのデータをElasticsearchに取り込みます。先ほど作成したシェルスクリプトを叩いてみます。
1 2 3 4 5 6 7 8 9 |
./shell/masutatest.sh ................ ................ ................ 2017-08-18 15:37:23.351 +0900 [INFO] (0025:task-0000): Inserted 133 records 2017-08-18 15:37:23.352 +0900 [INFO] (0001:transaction): {done: 1 / 1, running: 0} 2017-08-18 15:37:23.353 +0900 [INFO] (0001:transaction): Insert completed. 133 records |
というわけで実行してみると133件データを取り込んだそうです。実際にちゃんとElasticsearchに取り込まれたかKibanaで確認してみましょう。
きちんと133件格納されていることがわかります。
最後に
今回は環境変数を活用したembulkの利用方法について書きましたが、embulkはconfigファイルにもプログラムが書けるなど、まだまだやれることがたくさんあります。プラグインも自作でき、全世界のユーザが作成をしていますので今後の発展が楽しみですね。
新米エンジニアに最後までお付き合いいただきありがとうございました。
今後ともどうぞニフティものづくりブログをよろしくお願いいたします。