
こんにちは、サイオステクノロジーの森谷です。
今回はAzure上で並列データ転送ツールのEmbulkを動かしてみたいと思います。
Embulkとは
EmbulkはTreasure Data社がオープンソースで公開している並列データ転送ツールです。
プラグイン型のアーキテクチャを採用しており様々なファイルフォーマットやストレージに対応可能な点、処理を複数のタスクに分割し並列実行する点などが特徴です。
リアルタイムに入出力を行うFluentdとは異なり、単体の実行、あるいは日次や1時間毎といったバッチ処理に特化しています。
要するに、Fluentdのバッチ処理版になります。
今回は、このEmbulkを用い、Azureのストレージ上のCSVファイルを取得し、内容をRDBに格納します。
以下にその大まかな構成を示します。
この記事では、以下の項目について解説します。
- Azure Blob Storageの作成
- MySQL データベースの作成
- Embulkのインストール
- Embulkの設定・実行
GitHub: https://github.com/embulk/embulk
Document: http://www.embulk.org/docs/
Azure Blob Storageの準備
データベースに入力するファイルの配置先として、今回はAzureのストレージサービスであるAzure Storageを利用します。
Azure Storageのサービスを利用するためにはストレージ アカウントが必要です。
今回は2種類あるストレージ アカウントの内、Blob ストレージ アカウントを選択します。
これは汎用ストレージ アカウントと異なり、Azure StorageのサービスのうちBlob Storageのみに特化したアカウントで、他のサービスは利用できません。
その反面、ホット/クールの2段階のアクセス レベルや耐久性など、汎用ストレージ アカウントに比べ高機能となっています。
ストレージ アカウントを作成する場合はAzure ポータルで「新規」>「Storage」>「ストレージ アカウント」と選択します。
表示された「ストレージ アカウントの作成」画面で、必要なパラメータを入力します。
このとき「アカウントの種類」で「BLOB ストレージ」を選択することを忘れないようにしましょう。
ストレージ アカウントを作成したら、次はストレージ内にコンテナーを新規作成します。
作成したストレージ アカウントを選択し、「概要」の上部に+マークと共にある「コンテナー」を選択し、必要なパラメータを入力します。
この時アクセスの種類をBLOBにすることで、外部から配置したファイルがアクセス可能になります。
最後に作成したコンテナーにファイルを配置します。
作成したコンテナーを選択し、上にあるアップロードを選択し、ファイルを選択しましょう。
今回は入力ファイルの例として、東京都港区オープンデータより施設情報を配置しました。
これで、Azureのストレージ アカウントを作成し、Azure Blob Storage上に入力ファイルを配置することができました。
MySQLサーバーの準備
データの出力先となるデータベースに、今回はMySQLを利用します。
Azure上でMySQLを利用する手段として、デプロイしたVM上に構築することなどが挙げられます。
簡易にMySQLを利用する手段として、今回はAzure Marketplace上でClearDB社が提供するマネージドなMySQLデータベースを利用してみます。
Azure ポータルで「新規」を選択して、「MySQL Database」で検索し、公開元が「ClearDB」、名称が「MySQL データベース」のサービスを見つけます。
あとは必要なパラメータを入力して「作成」を押せばすぐにMySQLが利用できます。
「MySQL Database」を利用する場合の注意点として、このサービスはAzure Marketplace上でサードパーティが提供するサービスです。
そのため、Azure クレジットが使用されずに代金が別途請求されます。
幸い「MySQL Database」には無料の価格レベル「水星」がありますので、Azureの無料枠で試す場合は、この設定を行うことを忘れないようにしてください。
MySQLのデータベースを作成したら、作成したデータベースを選択し、「設定」>「プロパティ」を参照しましょう。
ホスト、ポート、ユーザー名、パスワードなど、接続に必要な情報が確認できます。
これで、Embulkの出力先にMySQLデータベースを利用する用意ができました。
Embulkのインストール
Azure Blob StorageとMySQLをつなぐEmbulkを、Azure VM上にインストールします。
Azure VMはあらかじめ用意してある下記環境のものを利用します。
使用Azure VM環境
- CentOS 7.2 64bit
- Oracle JDKをインストール済(jdk-8u111-linux-x64.rpm)
- curlインストール済
インストールコマンド
インストールは簡単なコマンドの実行のみで可能です。
[code lang=”shell”]
$ 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
[/code]
Embulk本体をインストールした後は、入出力に必要なプラグインをEmbulkにインストールします。
今回必要なプラグインはAzure Blob Storage用の入力プラグインと、MySQL用の出力プラグインです。
プラグインをコマンド1つでインストールするだけで、様々な入力に対応できる点がEmbulkの魅力です。
[code lang=”shell”]
$ embulk gem install embulk-input-azure_blob_storage
$ embulk gem install embulk-output-mysql
[/code]
Embulkの実行
いよいよEmbulkを実行し、Blob Storage上のファイルをMySQLサーバーにインポートしてみます。
設定ファイル
まずはEmbulkの設定ファイル「load.yml」を用意します。
今回はAzure Blob Storage上のCSVファイルからMySQLのテーブルにデータを転送するため、以下のようになります。
この設定では出力先テーブルが存在しない場合、Embulkが自動的にテーブルを作成してくれるため、事前にMySQL上にテーブルを作成しておく必要はありません。
[code]
in:
type: azure_blob_storage
account_name:
account_key:
container:
path_prefix: minatokushisetsujoho_
parser:
type: csv
delimiter: ‘,’
quote: ‘”‘
skip_header_lines: true
stop_on_invalid_record: true
default_timezone: Asia/Tokyo
newline: CRLF
charset: MS932
columns:
– {name: last_updated, type: timestamp, format: ‘%Y-%m-%d %H:%M:%S’}
– {name: page_title, type: string}
– {name: class_code, type: long}
– {name: first_class, type: string}
– {name: second_class, type: string}
– {name: file_path, type: string}
– {name: area, type: string}
– {name: introduction, type: string}
– {name: location, type: string}
– {name: contact, type: string}
– {name: opening_hours, type: string}
– {name: closing_day, type: string}
– {name: overview, type: string}
– {name: reception_hours, type: string}
– {name: access_train, type: string}
– {name: access_bus, type: string}
– {name: parking, type: string}
– {name: bicycle_parking, type: string}
– {name: image1, type: string}
– {name: caption1, type: string}
– {name: image2, type: string}
– {name: caption2, type: string}
– {name: image3, type: string}
– {name: caption3, type: string}
– {name: image4, type: string}
– {name: caption4, type: string}
– {name: image5, type: string}
– {name: caption5, type: string}
– {name: latitude, type: string}
– {name: longitude, type: string}
out:
type: mysql
host:
port:
user:
password:
table: facilities_in_minato_ward
mode: truncate_insert
default_timezone: Asia/Tokyo
column_options:
latitude: {type: ‘DECIMAL(9,6)’}
longitude: {type: ‘DECIMAL(9,6)’}
[/code]
Blob StorageやMySQLの接続情報、およびCSVのカラム情報は自分の環境に合わせて変更してください。
実行
カレントディレクトリに「load.yml」を配置し、以下のコマンドでEmbulkを実行します。
[code lang=”shell”]
$ embulk run load.yml
[/code]
実行結果の確認
Embulkの実行が完了したら、早速テーブルの中身を確認してみましょう!
以下はmysql-clientをインストールし、CLI上で確認した場合の例です。
MySQLデータベースにアクセスする方法はこれ以外にもあるので、自分のお好みの方法で行ってください。
テーブルが作成され、中にデータが格納されていることが確認できました!
まとめ
今回はAzure上のVMにEmbulkをインストールし、Azure Blob Storage上に配置したCSVファイルのデータをMySQLデータベースにインポートしました。
Embulkは日次や1時間毎に実行するようなバッチ処理が得意なので、ローテートした古いログをDBに保存する、日ごとに分割されたログを日次で保存するといったシチュエーションで活用するとよいと思います。
リアルタイムでログをDBに格納するようなパターンもあると思いますので、機会がありましたらFluentdを用いたMySQLへのデータインポートの方法もご紹介したいと思います。
ここまでご覧いただきありがとうございました。


コメント投稿