※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。
こんにちは、ビッグデータ戦略グループの高階(takashina)です。
いきなり私事ですが、今年の初めからダイエットに取り組んでいます。 成果がこれだけ出ています!
1月に73.25kgだった体重が8月の今は65.1kg、 同じく25.6%だった体脂肪率が18.0%です。 数値が読みにくいですが、体重は落ちてきて下げ止まっている、体脂肪率は順調に落ちている最中、筋肉量は一旦落ちて戻ってきた、ということがグラフにするとわかりやすいですね。
今年どんな取り組みをしてきたかと言うと、主に次の3点です。
- お昼ごはんを もりそば 中心にする。
- 運動を増やす。特に意図的に歩く距離を増やす。
- 毎日計測してグラフで見る。
グラフで体重等の状況を見るのに、とあるスマホアプリを使いました。 データは体重を測ったときに手動入力していましたが、それだけでグラフにしてくれるのはとっても便利!
あ、そうそう、データを入れると言えば、Yahoo!ビッグデータインサイト(YBI)にも、新しいデータインポート方法が増えたのをご存知ですか? 前置きが長くなりましたが、今日は新しいデータインポート方法「Data Connector」をご紹介します。
Data Connectorとは
Data Connectorは、YBIに新しく実装されたデータインポートの機能です。Treasure Dataのエンジニアさんが開発してリリースされた、大量データセットをバルク処理で転送できるソフトウェア「Embulk」というOSS(Open Source Software)をベースにしています。
従来、クライアント上にある巨大データを一括でインポートするには「バルクインポート」機能を使うことができましたが、データインポート時にクライアントの負荷が気になるところでした。 例えば、1時間毎に生成されるログデータを定期的にインポートする必要がある場合、データを読み込み、転送する、という手順を毎時実行する度に大きな負荷がかかりました。
Data Connectorを使うと、YBIから対象のリソースにアクセス可能ならば、YBI側でデータの取得からテーブルへの保管までをやってくれます。 つまり、YBI側でデータインポートをやってくれるので、クライアント側には負荷がかからずより手軽にYBIにデータをためることができます。
インポート元として利用可能なシステムは、今オブジェクトストレージ、MySQL、PostgreSQLが挙げられますが、それ以外のシステムも順次増えていくことを期待していてください。
MySQLからデータインポート
まず、MySQLからData Connectorを使ってデータインポートしてみましょう。 ちなみに、PostgreSQLの場合も、ポート番号が違うぐらいでほぼ同じく実施可能です。
前提条件
Data ConnectorはYBIの機能の1つですので、ここから先は下記の前提で綴っていきます。
- YBIのアカウントを持ち、YBIの基本機能を理解している
- YBIを操作するためのtdコマンドラインツールを使用できる
- MySQLサーバはYBIからアクセス可能である
Step0. tdコマンドラインツールのアップデート
Data Connectorを使用するためには、v0.11.9より新しいtdコマンドラインツールを使う必要があります。 バグに当たらないためにも、最新のバージョンにアップデートすることをお勧め。
$ td-agent-gem install td $ td --version 0.12.0
Step1. Seedコンフィグファイルの作成
Data Connector利用の最初のステップは、コンフィグのymlファイルを作成することです。 下記に例を示します。
$ vi seed.yml config: in: type: mysql host: mysqlhost.example.com port: 3306 user: mysql_user password: mysql_password database: mysql_database table: mysql_table select: "*" out: mode: replace
host, user, password, database, tableの各パラメータは、MySQLで使用しているものを記載します。その他の細かな指定方法についてはGitHubのページを参照してください。
https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql
Step2. データフォーマットを推定してロードファイルを作成
次に、作成したseed.ymlファイルからload.ymlファイルを作成します。
$ td connector:guess seed.yml -o load.yml Guessed configuration: --- in: type: mysql host: mysql_host.example.com port: 3306 user: mysql_user password: mysql_password database: mysql_password table: mysql_table select: "*" filters: [] out: mode: replace Created load.yml file. Use 'td connector:preview load.yml' to see bulk load preview.
load.ymlというロードファイルが作成されました。 このload.ymlファイルに対してpreviewすることができます。
$ td connector:preview load.yml +---------------------------+-------------+--------------------------+---------------+-----------+------------------------------+---------------------------------------------------------------------------------------+------------+ | datetime:timestamp | host:string | path:string | method:string | code:long | referer:string | agent:string | time:long | +---------------------------+-------------+--------------------------+---------------+-----------+------------------------------+---------------------------------------------------------------------------------------+------------+ | "2015-08-13 02:21:12 JST" | "10.0.9.1" | "/item/sports/4642" | "GET" | 200 | "/search/?c=Sports+Music" | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" | 1421115672 | | "2015-08-13 02:21:13 JST" | "10.1.8.2" | "/search/?c=Music+Games" | "POST" | 200 | "/item/finance/2436" | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)" | 1421115673 | | "2015-08-13 02:21:14 JST" | "10.2.7.3" | "/category/software" | "GET" | 200 | "/item/books/647" | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" | 1421115674 | | "2015-08-13 02:21:14 JST" | "10.3.6.4" | "/category/games" | "GET" | 200 | "/category/electronics" | "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1" | 1421115674 | | "2015-08-13 02:21:14 JST" | "10.4.5.5" | "/item/electronics/4504" | "GET" | 200 | "-" | "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)" | 1421115674 | | "2015-08-13 02:21:15 JST" | "10.5.4.6" | "/item/computers/1890" | "GET" | 200 | "/search/?c=Computers+Books" | "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1" | 1421115675 | | "2015-08-13 02:21:15 JST" | "10.6.3.7" | "/item/software/2872" | "GET" | 200 | "/search/?c=Software" | "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" | 1421115675 | | "2015-08-13 02:21:15 JST" | "10.7.2.8" | "/category/games" | "GET" | 200 | "-" | "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1" | 1421115675 | | "2015-08-13 02:21:15 JST" | "10.8.1.9" | "/category/office" | "GET" | 200 | "-" | "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" | 1421115675 | | "2015-08-13 02:21:16 JST" | "10.9.0.10" | "/category/sports" | "GET" | 200 | "-" | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" | 1421115676 | (中略) +---------------------------+-------------+--------------------------+---------------+-----------+------------------------------+---------------------------------------------------------------------------------------+------------+ 273 rows in set Update load.yml and use 'td connector:preview load.yml' to preview again. Use 'td connector:issue load.yml' to run Server-side bulk load.
previewをすると、インポートしようとしているテーブル構造を事前に確認することができます。
Step3. データロードジョブの実行
作成されたload.ymlを使って、データロードジョブを実行します。データインポート先となるYBIのDBとテーブルは事前に作成しておいてください。
$ td db:create ybi_sample_db $ td table:create ybi_sample_db ybi_sample_table $ td connector:issue load.yml --database ybi_sample_db --table ybi_sample_table --time-column datetime
末尾にあるオプション--time-columnでtimeカラムを指定しています。(インポート元のテーブルに、そのものずばりtimeというカラムがあればこの記載は不要です)
ロードジョブを実行するとJOB IDが割り振られますので、ジョブの実行状況はWebUIにあるJobsの画面で確認することができます。
STATUSがSUCCESSになったらロード完了です。 New Queryの画面でこんな具合に、ybi_sample_dbに対してクエリを発行して確認してみましょう。
SELECT * FROM ybi_sample_table LIMIT 10
オブジェクトストレージからデータインポート
オブジェクトストレージに置いたCSVやTSVファイルを、Data Connectorを使ってインポートすることもできます。 今回は、TSV形式にしたWebのアクセスログをインポートしてみます。 まず、seed.ymlファイルを下記のように作成します。
$ vi seed.yml config: in: type: riak_cs endpoint: ds.jp-east.idcfcloud.com access_key_id: xxxxxxxxxxxxxxxx secret_access_key: xxxxxxxxxxxxxxxxxxxxxxxx bucket: testbucket path_prefix: wwwlog.tsv.gz parser: default_timezone: 'Asia/Tokyo' out: mode: append
続いて、ロードファイルの作成を。コマンドはMySQLの時と同じです。
$ td connector:guess seed.yml -o load.yml Guessed configuration: --- config: in: type: riak_cs endpoint: ds.jp-east.idcfcloud.com access_key_id: xxxxxxxxxxxxxxxx secret_access_key: xxxxxxxxxxxxxxxxxxxxxxxx bucket: testbucket path_prefix: wwwlog.tsv.gz parser: default_timezone: Asia/Tokyo charset: UTF-8 newline: CRLF type: csv delimiter: "\t" quote: '' escape: '' trim_if_not_quoted: false skip_header_lines: 1 allow_extra_columns: false allow_optional_columns: false columns: - name: datetime type: timestamp format: "%Y-%m-%d %H:%M:%S" - name: host type: string - name: path type: string - name: method type: string - name: code type: long - name: referer type: string - name: agent type: string - name: time type: long decoders: - type: gzip filters: [] out: mode: append Created load.yml file. Use 'td connector:preview load.yml' to see bulk load preview.
MySQLの時とはかなり違うload.ymlファイルができ上がりました。 connector:guessを実行するとファイルの中身を読み取って、データの型をある程度推定してくれるのです。誤りがあれば生成されたload.ymlファイルを直接編集することが可能です。カラムの名前や型をゼロから指定するのではなく、自動生成された内容を確認すれば良いので、ロードファイルを作るのも随分と楽になっていますね。
データロードの実行はMySQLの時と同じです。
$ td connector:issue load.yml --database ybi_sample_db --table ybi_sample_table --time-column datetime
スケジューリングもできる
Data Connectorを使ったデータインポートは、cronのようにスケジューリングすることができます。 次の例のように、登録名、cron設定、インポート先DB、インポート先テーブル、ロードファイル名を指定します。
$ td connector:create \ test_daily_import \ "10 0 * * *" \ ybi_sample_db \ ybi_sample_table \ load.yml \ -t "Asia/Tokyo"
スケジューリングをすると、例えば、定期的にオブジェクトストレージに書き出されたTSVファイルをインポートしたり、MySQLのテーブルの中で前日分データを定期的にインポートしたりすることができます。
スケジュールの登録状況はtd connector:listで、実行状況はtd connector:historyで確認することが出来ます。
$ td connector:list
$ td connector:history test_daily_import
おわりに
いかがでしたか。 クライアント側に大きな負荷がかからず、データインポートが手軽にできるのは大きなメリットだと思います。 Data Connectorの詳しい使い方は、下記のドキュメントサイトに記載がありますので、気になる方は参照してみてください。
http://ybi-docs.idcfcloud.com/categories/data-connector
それでは、ごきげんよう!