TreasureDataに既存データ(TSV形式)をバルクインポートしてみた


## 背景
既にあるデータを`TreasureData`にアップロードしたいなと思い、`Treasuredata`が提供している`CLIツール(TD-CLI)`を使ってアップロードしてみたのでメモとして残しておく。

以下前提条件。

* `TD-CLI`がインストールされていること。

`TD-CLI`のインストール方法や基本的な使い方は[TreasureData使ってみた](http://qiita.com/akito1986/items/4c83ff492ed4b390ad50 "TreasureData使ってみた")を参照のこと。


以下環境情報。

* ubuntu: 12.04
* TD-CLI: 0.11.3

## データ準備

まずはアップロードしたいデータを準備する。
今回は`Apacheログ`形式である以下のデータを準備した。

```file:/tmp/www_access.tsv
$ cat /tmp/www_access.tsv | head -2
host	path	method	referer	code	agent	time
48.45.67.130	/category/computers	GET	-	200	Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1	2013-05-14 16:53:22
$ cat /tmp/www_access.tsv | wc -l
1001
$
```

## DB/Table作成
データの投げ先である`TreasureData`上に`DB`と`Table`を作成しておく。

```cmd:td_create
$ td account -f # 念のためログイン
Enter your Treasure Data credentials.
Email: td@treasuredata.com
Password (typing will be hidden): 
Authenticated successfully.
Use 'td db:create <db_name>' to create a database.
$
$ td db:create apache_sample
Database 'apache_sample' is created.
Use 'td table:create apache_sample <table_name>' to create a table.
$ td table:create apache_sample access
Table 'apache_sample.access' is created.
$
```

ここでは`apache_sample`という`DB`に`access`という`Table`を作成している。

## データアップロード
さてこれでデータアップロードする準備ができたので以下のコマンドでアップロードする。

### Options
```cmd:td_import
$ td import:auto --format tsv --auto-create apache_sample.access --parallel 8 --prepare-parallel 8 --column-header -o /ext4/td_out/ --time-column 'time' --time-format "%Y-%m-%d %H:%M:%S" /tmp/www_access.tsv 
```

上記のオプションのざっとした説明は以下。

| Option | 説明 | 
|:-----------|:------------|
| import:atuo     |        `TD-CLI`のアップロードにはいくつかのステップがあり`auto`オプションを指定することでその全てのステップを自動的に実行してくれる。 |
| --fromt tsv| アップロードデータが`TSV`形式であることを意味する。`CSV`形式の場合はここをcsvとする。 |
| --auto-create     | なんだっけ・・・忘れたorz|
| apache_sample.access       |データアップロード先|
| --parallel 8     |データアプロードの並行スレッド数|
| --prepare-parallel 8 |データを`MessagePack`形式に加工する際の並行スレッド数 |
| --column-header |`TreasureData`上でのカラム名をアップロード対象ファイルの一行目の値を利用するように指定する。|
| -o /ext4/td_out|`MessagePack`形式ファイルの出力先`Directory`|
| --time-column 'time'|時刻カラムの指定|
| --time-format "%Y-%m-%d %H:%M:%S"|指定した時刻カラムのフォーマット|
| /tmp/www_access.tsv|アップロード対象ファイル|


`TreasureData`の中で時刻というのは重要なため`--time-column`は必須であるため注意すること。
`--parallel`を指定することでデータアップロードの並行数が増えるのでアップロード時間がある程度短縮される。

### 実行ログ

コマンドを実行すると以下のような実行ログが出力される。

```log:td_import_log
Uploading prepared sources
  Session    : apache_sample_access_2014_09_10_1410349386586
  Source     : /tmp/www_access.tsv (193315 bytes)

Converting '/tmp/www_access.tsv'...
sample row: {"time":1368518002,"host":"48.45.67.130","path":"\/category\/computers","method":"GET","code":200,"referer":"-","agent":"Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko\/20100101 Firefox\/10.0.1"}
Uploading /ext4/td_out/www_access_tsv_0.msgpack.gz (19489 bytes)...
....省略
Prepare status:
  Elapsed time: 9 sec.
  Source     : /tmp/www_access.tsv
    Status          : SUCCESS
    Read lines      : 1001
    Valid rows      : 1000
    Invalid rows    : 0
    Converted Files : /ext4/td_out/www_access_tsv_0.msgpack.gz (19489 bytes)


Next steps:
  => execute following 'td import:upload' command. if the bulk import session is not created yet, please create it with 'td import:create <session> <database> <table>' command.
     $ td import:upload <session> '/ext4/td_out/www_access_tsv_0.msgpack.gz'


Upload status:
  Elapsed time: 18 sec.
  Source  : /ext4/td_out/www_access_tsv_0.msgpack.gz
    Status          : SUCCESS
    Part name       : www_access_tsv_0_msgpack_gz
    Size            : 19489
    Retry count     : 0


Next Steps:
  => execute 'td import:perform apache_sample_access_2014_09_10_1410349386586'.

Freeze bulk import session apache_sample_access_2014_09_10_1410349386586
Perform bulk import session apache_sample_access_2014_09_10_1410349386586
Show status of bulk import session apache_sample_access_2014_09_10_1410349386586
  Performing job ID : 40448
  Name              : apache_sample_access_2014_09_10_1410349386586
  Status            : performing

Wait apache_sample_access_2014_09_10_1410349386586 bulk import session performing...
Show error records of bulk import session apache_sample_access_2014_09_10_1410349386586
  Performing job ID : 40448
  Valid parts       : 1
  Error parts       : 0
  Valid records     : 1000
  Error records     : 0
```

いくつかのStepを踏んで処理をしていることがわかる。

## 確認してみる
以下のコマンドでデータが正常に入っているか確認する。

```
$ td table:show apache_sample access
Name        : apache_sample.access
Type        : log
Count       : 1000
Schema      : (
    host:string
    path:string
    method:string
    referer:string
    code:long
    agent:string
)
$
$ td query -w -t hive -d apache_sample "SELECT * FROM access LIMIT 10"
...省略
+-----------------+------------------------+--------+--------------------------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
| host            | path                   | method | referer                  | code | agent                                                                                                                                                                     | v                                                                                                                                                                                                                                                                                                   | time       |
+-----------------+------------------------+--------+--------------------------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
| 48.45.67.130    | /category/computers    | GET    | -                        | 200  | Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1                                                                                              | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1","referer":"-","path":"/category/computers","host":"48.45.67.130"}                                                                                           | 1368518002 |
| 124.192.166.98  | /search/?c=Giftcards   | POST   | /category/sports         | 200  | Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)                                                                                                    | {"code":"200","time":"1368518002","method":"POST","agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)","referer":"/category/sports","path":"/search/?c=Giftcards","host":"124.192.166.98"}                                                                              | 1368518002 |
| 176.183.137.115 | /category/finance      | GET    | -                        | 200  | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)                                                                                                  | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)","referer":"-","path":"/category/finance","host":"176.183.137.115"}                                                                                              | 1368518002 |
| 192.183.92.55   | /item/software/4777    | GET    | -                        | 200  | Mozilla/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3                                           | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3","referer":"-","path":"/item/software/4777","host":"192.183.92.55"}                                       | 1368518002 |
| 48.66.40.214    | /category/networking   | GET    | -                        | 200  | Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1                                                                                                     | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1","referer":"-","path":"/category/networking","host":"48.66.40.214"}                                                                                                 | 1368518002 |
| 144.132.188.212 | /item/electronics/2649 | GET    | /item/electronics/1996   | 200  | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1                                                                                       | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1","referer":"/item/electronics/1996","path":"/item/electronics/2649","host":"144.132.188.212"}                                                         | 1368518002 |
| 36.171.84.59    | /category/finance      | GET    | -                        | 200  | Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11                                                               | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11","referer":"-","path":"/category/finance","host":"36.171.84.59"}                                                              | 1368518002 |
| 204.204.116.114 | /item/toys/3282        | GET    | -                        | 200  | Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1                                                                                              | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1","referer":"-","path":"/item/toys/3282","host":"204.204.116.114"}                                                                                            | 1368518002 |
| 100.27.141.84   | /item/software/2012    | GET    | /category/cameras?from=0 | 200  | Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1                                                                                              | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1","referer":"/category/cameras?from=0","path":"/item/software/2012","host":"100.27.141.84"}                                                                   | 1368518002 |
| 96.195.97.82    | /category/garden       | GET    | -                        | 200  | Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; YTB730; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C) | {"code":"200","time":"1368518002","method":"GET","agent":"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; YTB730; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)","referer":"-","path":"/category/garden","host":"96.195.97.82"} | 1368518002 |
+-----------------+------------------------+--------+--------------------------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
10 rows in set
$
```

`time`カラムにUnix時間で値が格納されていることがわかる。
正常っぽい。

`TSV`以外の形式のインポートについては`TreasureData`の[Doccumentサイト](http://docs.treasuredata.com/articles/command-line "TreasureData-Doccuments")を参照のこと。

`MySQL`からはJDBC経由で直接データを入れられるらしい。


おしまい。