IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

Embulkベースのデータインポート機能「Data Connector」をYBIで試してみる

※2016年10月1日より、サービス名称が「Yahoo!ビッグデータインサイト」から「トレジャーデータサービス by IDCF」に変更となっております。

こんにちは、ビッグデータ戦略グループの高階(takashina)です。

DataConnector

いきなり私事ですが、今年の初めからダイエットに取り組んでいます。 成果がこれだけ出ています!

1weight体重

2bodyfat体脂肪率

3muscle筋肉量

1月に73.25kgだった体重が8月の今は65.1kg、 同じく25.6%だった体脂肪率が18.0%です。 数値が読みにくいですが、体重は落ちてきて下げ止まっている、体脂肪率は順調に落ちている最中、筋肉量は一旦落ちて戻ってきた、ということがグラフにするとわかりやすいですね。

今年どんな取り組みをしてきたかと言うと、主に次の3点です。

  1. お昼ごはんを もりそば 中心にする。
  2. 運動を増やす。特に意図的に歩く距離を増やす。
  3. 毎日計測してグラフで見る。

グラフで体重等の状況を見るのに、とあるスマホアプリを使いました。 データは体重を測ったときに手動入力していましたが、それだけでグラフにしてくれるのはとっても便利!

あ、そうそう、データを入れると言えば、Yahoo!ビッグデータインサイト(YBI)にも、新しいデータインポート方法が増えたのをご存知ですか? 前置きが長くなりましたが、今日は新しいデータインポート方法「Data Connector」をご紹介します。

Data Connectorとは

DataConnector

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の画面で確認することができます。
webui_bulkload
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

それでは、ごきげんよう!

 

<関連記事>

Copyright © IDC Frontier Inc.