TreasureData使ってみた

treasuredataを使ってみたのでメモメモ。

## 背景
使う契機とは直接関係はないけどログについて、色々思うところがあった。

色々思うところとは・・・

* ログは重要
* ログは管理が大変
* ログは消したくない
* ログのフォーマットは変更されやすい

である。

「ログは重要」は、アプリケーションエンジニアのみならず情報系のエンジニアなら同意してくれると思う。
「えっこれ動かないんだけど？」って言われたときにまず見るのがログだもの。

「ログは管理が大変」は「ログは重要」のためもあるのだが、重要だからこそ消したくなく、どんどん増え続けてしまいディスクがいっぱいになっても、消したくないからテープに書き出し保存するってことが往々にしてある。

「ログは消したくない」は「ログは管理が大変」で記載してしまった。。。

「ログのフォーマットは変更されやすい」は、まあシステムをステップ開発する場合は往々にしてある。システムに対する習熟度が上がるとフォーマットも変えたくなる。

S3とかのクラウドストレージに入れればええやん？とかも思ったけど、問題発生時にはログを手元にもってきて、ログ解析・・・億劫と思ってしまう自分がいた。

まあそんな中、真剣に何かを使いたいと思っていたわけではないのだけど縁があってTreasureDataを使う機会があったので、主にログ管理システムとしてどうなんだろうと思って触ってみたので、備忘のためにメモしておく。

今回は環境準備まで。

以下環境情報。

* ubuntu: 12.04
* ruby: 2.1.2p95
* rubygem: 2.2.2


## TreasureDataとは
wikiとかあればいいんだけど無さげなので、一言で言うとクラウド上にあるデータベースと思ってもらえればいい気がする。ただ大容量データを解析するためにクエリはHadoop使えまっせって感じ。

## SignUp
AWS上にある[WebConsole](https://console.treasuredata.com/users/sign_up)で無料でサインアップができ、早速使い始められる。

![td_signup.png](https://qiita-image-store.s3.amazonaws.com/0/46472/cd86c3dc-ff0a-5dd2-b86f-cc5c2a550692.png "td_signup.png")

## APIキーの取得
アプリケーションから利用するために必要なAPIキーを取っておく。
WebConsoleからログイン後、
![td_signin.png](https://qiita-image-store.s3.amazonaws.com/0/46472/5cd69e77-1c32-c915-ec7d-be7c6561e591.png "td_signin.png")

画面右上のプルダウンメニュから`My Profile`を選択。

![td_get_apikey.png](https://qiita-image-store.s3.amazonaws.com/0/46472/d8e02fee-8354-547c-01c4-b22c0ae7126c.png "td_get_apikey.png")

`My Profile`画面で`API Keys`のテキストボックスに`my_td_password`を入力後`Show Keys`タブを選択する。

そうするとAPIキーが表示されるのでメモしておく。

## TreasureData Tool Beltのインストール
Tool Beltって一般的なのかな？まあRubyBaseのCLIのクライアントツールである。
WebConsoleでもログのアップロードやクエリを投げられるけど、基本はこのTool BeltやJDBC、RestAPI経由で使うと思う。

以下のコマンドで`TD Tool Belt`をインストールする。

```cmd:install_td
$ gem install td
$ td --version
0.11.3
$ 
```

## 使ってみる
### 環境変数設定
以下のコマンドでTreasureDataのAPIエンドポイントを指定する。

```cmd:set_env
$ export TD_API_SERVER=https://api.treasuredata.com
$ env | grep TD
TD_API_SERVER=https://api.treasuredata.com
```

### ログイン
`TD Tool Belt`経由でTreasureDataにログインする。

```cmd:login_td
$ td account -f
Enter your Treasure Data credentials.
Email: ${my_addr}
Password (typing will be hidden): ${my_passwd} 
Authenticated successfully.
Use 'td db:create <db_name>' to create a database.
$
````

### クエリ実行
TreasureDataではサンプルデータが用意されている。

```cmd:td_db
$ td db:list # DB一覧表示
+-------------+-------+
| Name        | Count |
+-------------+-------+
| sample_db   | 5000  |
+-------------+-------+
1 rows in set
$ td table:list sample_db # テーブル一覧表示
+-----------+------------+------+-------+--------+---------------------------+---------------------------+----------------------------------------------------------------------------------------------------------+
| Database  | Table      | Type | Count | Size   | Last import               | Last log timestamp        | Schema                                                                                                   |
+-----------+------------+------+-------+--------+---------------------------+---------------------------+----------------------------------------------------------------------------------------------------------+
| sample_db | www_access | log  | 5,000 | 0.0 GB | 2014-03-14 01:12:32 +0900 | 2013-09-07 10:13:45 +0900 | host:string, path:string, method:string, referer:string, code:long, agent:string, user:string, size:long |
+-----------+------------+------+-------+--------+---------------------------+---------------------------+----------------------------------------------------------------------------------------------------------+
1 row in set
$
```

`sample_db.www_access`のレコード数を取得するクエリを以下で実行することができる。

```cmd:td_query
$ td query -w -t hive -d sample_db "SELECT COUNT(1) FROM www_access"
Job 13623610 is queued.
Use 'td job:show 13623610' to show the status.
queued...
  started at 2014-08-13T14:15:54Z
  14/08/13 14:16:00 WARN conf.Configuration: org.apache.hadoop.hive.conf.LoopingByteArrayInputStream@5adeeabd:an attempt to override final parameter: mapreduce.input.fileinputformat.split.minsize;  Ignoring.
  Hive history file=/mnt/hive/tmp/4115/hive_job_log_e8d443fc-5e93-4ff0-a53a-983786540afc_1000320679.txt
  Total jobs = 1
  Launching Job 1 out of 1
  Number of reduce tasks determined at compile time: 1
  In order to change the average load for a reducer (in bytes):
    set hive.exec.reducers.bytes.per.reducer=<number>
  In order to limit the maximum number of reducers:
    set hive.exec.reducers.max=<number>
  In order to set a constant number of reducers:
    set mapreduce.job.reduces=<number>
  **
  ** WARNING: time index filtering is not set!
  ** This query could be very slow as a result.
  ** Please see http://docs.treasure-data.com/articles/performance-tuning#leveraging-time-based-partitioning
  **
  Starting Job = job_1407740893231_6027, Tracking URL = http://ip-10-145-145-114.ec2.internal:8088/proxy/application_1407740893231_6027/
  Kill Command = /usr/lib/hadoop/bin/hadoop job  -kill job_1407740893231_6027
  Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
  2014-08-13 14:16:13,982 Stage-1 map = 0%,  reduce = 0%
  2014-08-13 14:16:21,301 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 12.64 sec
  2014-08-13 14:16:27,550 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 14.66 sec
  finished at 2014-08-13T14:16:31Z
  MapReduce Total cumulative CPU time: 14 seconds 660 msec
  Ended Job = job_1407740893231_6027
  MapReduce Jobs Launched: 
  Job 0: Map: 1  Reduce: 1   Cumulative CPU: 14.66 sec   HDFS Read: 2574 HDFS Write: 104 SUCCESS
  Total MapReduce CPU Time Spent: 14 seconds 660 msec
  OK
  MapReduce time taken: 24.295 seconds
  Fetching results...
  Total CPU Time: 14660
  Time taken: 24.663 seconds
Status     : success
Result     :
WARNING: the job result is being downloaded...: 24 B / 100.0%                                                                                                   +------+                                          
| _c0  |
+------+
| 5000 |
+------+
1 row in set
$
```

データ件数が5000件あることがわかる。そして裏では`map reduces`処理がはしっているっぽいことがわかる。

データインポート部分については次回！！