HBaseにTSVデータを投入する(ImportTsv)


タブ区切り形式(TSV)ファイルのデータをHBaseに投入する方法について紹介する。
HBase にはTSVファイルのデータをロードするための ImportTsv というツールがあり、これを使うことで簡単に HBase のテーブルにデータをロードすることができる。

# 環境

* CDH 5.4.2 HBase (1.0 ベース)
* CDH 5.4.2 MapReduce (2.6 ベース)
* Cloudera Manager を使ってクラスタを準備するか、クイックスタートVMを準備すること。VMの準備方法については [こちら](http://codezine.jp/article/detail/8560)を参考。

# データセット

最近発生した地震のデータ・セット。
http://earthquake.usgs.gov/

# データの準備

## CSVファイルの取得

`http://earthquake.usgs.gov/fdsnws/event/1/query?format=csv` にアクセスすれば、CSV形式で取得できる。
詳細なAPIのドキュメントは [こちら](http://earthquake.usgs.gov/fdsnws/event/1/)。この記事の手順を進めるにあたって特に読む必要はない。


## TSVファイルに変換

ImportTsvそのものは任意の区切り文字を指定できるのでCSVファイルも一応ロード可能だが、ダブルクォートでくくられた文字列の中にカンマが入っている場合などに適切に処理することができない。
そこで、CSVファイルをTSVの形式に変換する。
簡単な方法はいくつかあるが、ここではGoogle Driveを使う方法を紹介する。

* https://drive.google.com にアクセスする。(要ログイン)
* 先ほどダウンロードした `query.csv` をドラッグアンドドロップする。
* Google Sheets で開き、 **File** → **Download as** → **Tab-separated files** を選択する。

これでTSV形式に変換することができる。

## HDFS にロードする

HDFS クライアントとして実行できる環境で以下のコマンドを入力し、 HDFS にデータをロードする。

```
$ hdfs dfs -mkdir earthquake
$ hdfs dfs -put query.tsv earthquake
```

# HBase テーブルの準備

HBase コマンドを実行できるノードから以下のコマンドを実行し、HBase のインタラクティブシェルモードを起動する。

```
$ hbase shell
```

HBase Shell 内で以下のコマンドを入力し、 `earthquake` テーブルを作成する。

```
hbase(main):005:0> create 'earthquake' 'cf'
```

`cf` というのは列ファミリ名であり、テーブル作成時に指定しなければいけない。列全体としては任意の数だけ作成可能なので、データの各列をこの場で指定する必要はない。

ちなみに `hbase shell` を起動しなくても、`echo` でコマンドをリダイレクトすることでテーブルを作成することもできる。

```
$ echo "create 'earthquake' 'cf'" | base shell
```

#  Importtsv の実行

HBase と MapReduce が実行できる環境で、以下のコマンドを実行する。

```
$ hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns=HBASE_ROW_KEY,cf:latitude,cf:longitude,cf:depth,cf:mag,cf:magType,cf:nst,cf:gap,cf:dmin,cf:rms,cf:net,cf:id,cf:updated,cf:place,cf:type earthquake /user/<自分のユーザ名>/earthquake
```
importtsv.columns は、データファイルとHBaseの列との対応関係を示すパラメータ。必須。 HBASE_ROW_KEY で指定された列は行キーとなる。この列名も必須。面倒だが地道に入力するしかない。


# 投入したデータの確認

## hbase shell からの確認

データがきちんと投入されていることを確認するため、 `hbase shell` を起動する。

以下のコマンドを実行し、データが投入されていることを確認する。

```
hbase(main):004:0> scan 'earthquake', {LIMIT => 1}
ROW                                           COLUMN+CELL
 2015-05-01T00:07:07.530Z                     column=cf:depth, timestamp=1435196936220, value=19.67
 2015-05-01T00:07:07.530Z                     column=cf:dmin, timestamp=1435196936220, value=0.07029
 2015-05-01T00:07:07.530Z                     column=cf:gap, timestamp=1435196936220, value=242
 2015-05-01T00:07:07.530Z                     column=cf:id, timestamp=1435196936220, value=uw60994542
 2015-05-01T00:07:07.530Z                     column=cf:latitude, timestamp=1435196936220, value=47.602
 2015-05-01T00:07:07.530Z                     column=cf:latlng, timestamp=1435196936220, value=47.602,-122.7216667
 2015-05-01T00:07:07.530Z                     column=cf:longtitude, timestamp=1435196936220, value=-122.7216667
 2015-05-01T00:07:07.530Z                     column=cf:mag, timestamp=1435196936220, value=0.43
 2015-05-01T00:07:07.530Z                     column=cf:magType, timestamp=1435196936220, value=md
 2015-05-01T00:07:07.530Z                     column=cf:net, timestamp=1435196936220, value=uw
 2015-05-01T00:07:07.530Z                     column=cf:nst, timestamp=1435196936220, value=7
 2015-05-01T00:07:07.530Z                     column=cf:place, timestamp=1435196936220, value=1km WNW of Erlands Point-Kitsap Lake, Washington
 2015-05-01T00:07:07.530Z                     column=cf:rms, timestamp=1435196936220, value=0.13
 2015-05-01T00:07:07.530Z                     column=cf:type, timestamp=1435196936220, value=earthquake
 2015-05-01T00:07:07.530Z                     column=cf:updated, timestamp=1435196936220, value=2015-05-04T20:42:21.380Z
```

件数のチェックには `count` を使う。

```
hbase(main):005:0> count 'earthquake'
Current count: 1000, row: 2015-05-03T07:57:29.390Z
Current count: 2000, row: 2015-05-05T10:55:18.000Z
Current count: 3000, row: 2015-05-07T19:53:57.490Z
Current count: 4000, row: 2015-05-10T19:02:04.180Z
Current count: 5000, row: 2015-05-13T20:26:01.590Z
Current count: 6000, row: 2015-05-16T12:44:49.000Z
Current count: 7000, row: 2015-05-19T16:05:53.950Z
Current count: 8000, row: 2015-05-22T12:39:25.540Z
Current count: 9000, row: 2015-05-25T12:00:17.280Z
Current count: 10000, row: 2015-05-28T19:08:01.720Z
Current count: 11000, row: 2015-06-01T00:56:05.000Z
Current count: 12000, row: 2015-06-04T07:01:22.330Z
Current count: 13000, row: 2015-06-08T03:04:05.100Z
Current count: 14000, row: 2015-06-11T20:23:45.120Z
Current count: 15000, row: 2015-06-15T16:50:16.700Z
Current count: 16000, row: 2015-06-20T00:37:42.280Z
16767 row(s) in 4.3890 seconds

=> 16767
```

## Hue による確認

Hue HBase App を使えば、Web UI から確認可能。

`http://<hueサーバのノード>:8888/hbase` にアクセスすれば、以下のようなUIでHBaseのデータを表示することができる。

![c54-hue-hbase-app-sample.png](https://qiita-image-store.s3.amazonaws.com/0/17749/07992269-0df9-6653-855d-bfb30791336d.png)


# 参考

* [ImportTsv のドキュメント](http://hbase.apache.org/book.html#_importtsv)