駒鳥です。
この記事では、オープンソースソフトウェアであるEmublkについて、わかりやすく解説します。
Embulkとは何か、どんなことができるのかや、実際の利用例についても紹介します。
Embulkとは
Embulkとは、Treasure Data社が主導する、大容量データのバルクロード(一括転送)を行うOSSです。
プラグインを利用することで多種多様なデータソースをインプット、アウトプットに指定することができ、柔軟なデータ転送を実現します。
Embulkの特徴
Embulkの特徴として、以下を挙げることができます。
- yml形式の設定ファイルだけでデータ転送を実現できるため、難易度が非常に低い
- 多種多様なInput,Outputプラグインによって、柔軟なデータ転送が可能
詳細については後述しますが、1つ目に挙げたように、ymlの設定ファイルを書くだけなのでとても簡単である、という点は重要です。
大量のデータ転送が、設定ファイル1つで簡単に実行でき
Embulkとfluentdとの違い
データ転送といえば、同じくTreasrue Data社がもともと開発していたfluentdもあります。
fluentdとの違いは、fluentdはログの集約ツールとして利用されるのに対して、Embulkはバッチ処理的にデータを大量転送するのに適しているという点です。
Embulkの利用に適したシーン
Embulkの利用に適したシーンとしては、以下のような場面が考えられます。
- システム間の大量データの受け渡し処理として利用するシーン
- ログファイルなどを定期的に取り込むシーン
- ETLとして活用するシーン
Embulkのインストール方法
ここからは、具体的にEmbulkをインストールするまでの手順をご説明します。
Mac、LinuxでのEmbulkのインストール方法
MacやLinuxでEmbulkでインストールするには、以下の順でコマンドを実行します。
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
WindowsでのEmbulkのインストール方法
Embulkは、Windows端末でも利用することができます。
Windows端末でEmbulkをインストールするためには、以下のコマンドを実行します。
PowerShell -Command "& {[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::TLS12; Invoke-WebRequest http://dl.embulk.org/embulk-latest.jar -OutFile embulk.bat}"
Embulkのインストール済みバージョンを確認する方法
インストールコマンドを実行したら、以下のコマンドを実行して、インストールできているバージョンを確認することができます。
$embulk -v
Embulk v0.9.23
バージョンの下にはヘルプが表示されます。
Embulkの使い方
ここでは、Embulkの使い方をご紹介します。
インストールが完了したら、実際に利用してみましょう!
embulk example でサンプルを作成する
Embulkの基本的な使い方を理解するために、サンプルの設定ファイルを自動で生成してくれるコマンドを使いましょう。
embulk exampleは次のような使い方をします。
embulk example {サンプルを生成するディレクトリ}
実際に実行すると、次のように、サンプルファイルが生成されます。
$ embulk example test 2020-11-03 11:19:40.780 +0900: Embulk v0.9.23 Creating test directory... Creating test/ Creating test/csv/ Creating test/csv/sample_01.csv.gz Creating test/seed.yml
ここで生成されたseed.ymlが、Embulkの基本的な設定ファイルです。
Embulkで利用するymlファイル
Embulkは大容量のデータ転送を行うソフトウェアですが、その転送をするためのインプットとアウトプットの設定は、ymlファイルに記載します。
上記のembulk exampleで生成されたseed.ymlをみてみましょう。
in: type: file path_prefix: '/Users/{ユーザー名}/Desktop/./test/csv/sample_' out: type: stdout
設定ファイルではこのように、「in」と「out」にそれぞれインプットとアウトプットの内容を記載します。
この例では、
ファイルを読み取って標準出力する
という設定になっています。
より実用的な例としては、inのtypeにmysqlを指定するなどです。(詳細例は後述)
embulk guessで実行ファイルを自動生成する
embulk exampleで作成したseed.ymlは、実は設定ファイルとしては未完成です。
seed.yml には、inputとoutputの種類は何か、くらいの情報しか記載されていません。
実際のembulk実行時には、カラムやその型など、より詳細な定義が必要です。
そこで、embulk guessコマンドを使って、抽象的な設定ファイルだったseed.ymlを、より具体的な設定を記述するconfig.ymlに変換します。
次のようなコマンドを実行します。
embulk guess {seed.ymlのパス} -o {出力されるconfig.ymlのパス}
慣れてきたら、この手順は省略することができます。
最初からconfig.ymlを作成することもできます。
inputやoutputに何を指定するかは決まっているけど、細かくどんな内容を設定すればいいかわからない、という時に、このembulk guressコマンドを活用しましょう。
config.ymlが生成されたら中身を確認して、必要に応じて設定を行いましょう。
embulk previewで実行をプレビューする
config.ymlが完成したら、embulk previewで実行をプレビューできます。
このコマンドを実行しても、データはアウトプットされず、outputとして出力されるデータの具体的な例を確認することができます。
filterやparserプラグインを利用している場合に、それらの処理が意図通りに行われているかの確認などに使うと良いでしょう。
embulk preview {config.ymlのパス}
embulk runでバルクロードを実行する
previewで確認ができたら、embulk runでいよいよ実行です
embulk run {config.ymlのパス}
Embulkのプラグインについて
Embulkには様々なプラグインが存在します。
input、outputの形式に対応するプラグインだけでなく、jsonをparseしたり、inputとして読み込んだデータを簡単なリネーム処理を挟むfilter pluginもあります。
ここでは、具体的にどのようなpluginが存在するのか、よく使われるpluginや、便利なプラグインを一部ご紹介します。
それぞれのpluginに対して、リンクを貼っているので、リンク先でそれぞれのpluginの設定項目が確認できます。
Input plugin
inで様々な形式のインプットを指定できますが、実際にデータを読み取るために、inputプラグインが必要です。
- mySQL:embulk-input-mysql
- oracleDB:embulk-input-oracle
- PostgreSQL:embulk-input-postgresql
- AWS S3:embulk-input-s3
- Treasure Data:embulk-input-td
- HTTP(URLを指定したinput):embulk-input-http
- Google Analitycs:embulk-input-google_analytics
mySQLのようなデータベースをinputとして指定する場合、SQLもymlファイル内に記載することができます。
ここで集計クエリを記載しておいて、集計結果をoutで指定した先に出力する、というやり方は便利です。
また、embulk-input-httpを利用すれば、xmlフィードやAPIへのリクエスト結果をinputとして扱うことができ、大変便利です。
ただし、後述するParser pluginと組み合わせて使うことが多いので、注意してください。
Output plugin
outで出力先を指定するときも、input同様に、outputプラグインが必要です。
同一のデータソースであっても、inputとoutputでそれぞれプラグインは別物なので注意してください。
- mySQL:embulk-output-mysql
- oracleDB:embulk-output-oracle
- PostgreSQL:embulk-output-postgresql
- AWS S3:embulk-output-s3
- Treasure Data:embulk-output-td
Filter plugin
Filter pluginは、inputしたデータに対して、一律で簡単な加工を加える、というようなフィルタリング操作を行えるプラグインです。
- カラムをコピーしたり減らしたり、フォーマットを指定するなどのカラム操作を行う:embulk-filter-column
- timeカラムを指定する(主にTreasureDataへoutputする時には使用):embulk-filter-add_time
- jsonをエンティティに展開する:embulk-filter-expand_json
- 重複を排除する:embulk-filter-distinct
Parser plugin
Parserプラグインは、inputしたデータをエンティティに展開したり、変換できるプラグイン群です。
必要なカラムだけを選んだりすることもできます。
Embulkのプラグイン一覧
Embulkのプラグイン一覧は、以下のページで確認できます。
このページで紹介している以外にも、様々なプラグインがあるのでぜひ確認してみてください。
Embulkのプラグインの検索方法
Embulkは、コマンドでプラグインを検索することができます。
embulk gem search {検索したい文字列}
実行例:
$ embulk gem search json 2020-11-08 18:32:55.151 +0900: Embulk v0.9.23 Gem plugin path is: /Users/XXXX/.embulk/lib/gems *** REMOTE GEMS *** abc_jsonapi (0.4.3) action_dispatch-test_response-json (5.2.3.1) active_json (0.0.2) active_json_cli (0.1.4) (~以下省略~)
Embulkのプラグインのインストール方法
Embulkのプラグインをインストールするには、次のコマンドを使用します。
embulk gem install {インストールしたいプラグインの名前}
次の例では、embulk-output-mysqlプラグインをインストールしてみます。
$ embulk gem install embulk-output-mysql 2020-11-08 18:41:13.630 +0900: Embulk v0.9.23 Gem plugin path is: /Users/XXXX/.embulk/lib/gems Fetching: embulk-output-mysql-0.9.0-java.gem (100%) Successfully installed embulk-output-mysql-0.9.0-java 1 gem installed
Embulkの活用例
次に、Embulkの具体的な活用例をご紹介します。
どういったときにEmbulkが有効に活用できるか、そのイメージを掴むために参考にしてください。
利用例① httpでxmlを取得し、mySQLのデータとして投入する
xmlで配信されるフィードに、httpでアクセスし、取得したxmlから任意の要素を選んで、mySQLにデータとして登録します。
xmlを扱うにはparserプラグインが必要です。inputやoutputのプラグインと組み合わせて利用します。
利用するプラグインは、以下の通りです。
- embulk-input-http
- embulk-parser-xml
- embulk-output-mysql
利用例② TreasureDataにクエリを発行し、実行結果をcsvとして出力する
EmbulkはもともとTreasure Data社が開発したOSSです。
そのため、Treasure Dataをinputやoutputとして指定することもできます。
まとめ
Embulkは、非常に多くのデータソースを扱うことのできるOSSです。
inputとoutputを自由に選択し、大規模なデータ転送がymlファイル1つでできる優れものです。
ETLの構築だけでなく、ちょっとしたバッチ処理としても有効に活用できるでしょう。