Cloudera ManagerでHBaseの運用

サイバーエージェントの秋葉原ラボで働いている[鈴木](https://twitter.com/brfrn169)といいます。
今回は、Cloudera Managerを使ったHBaseの運用の一部を紹介しようと思います。

# はじめに

弊社ではHBaseの運用にCloudera Managerを使っています。
Cloudera Managerを使うことでクラスタの構築・管理が楽になるのはもちろんのこと、監視やトラブルシューティングも簡単になったりします。

既に[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)で紹介されている[ログ検索](http://qiita.com/d1ce_/items/f8e171ed8e63f441b29d)も便利ですし、
[tsquery](http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_dg_tsquery.html)というチャート生成専用のクエリ言語もかなり便利です。

今回はHBaseを運用する上で普段見ているチャートのtsqueryを紹介したいと思います。

# tsqueryについて

tsqueryはCloudera Manager内に蓄積されているメトリクスなどの時系列DBにアクセスできるSQLライクな言語です。Cloudera Managerのチャートビルダーからtsqueryなどを指定することでチャートが作成できます。

詳細については、以下をご覧ください。

http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_dg_tsquery.html

# サーバリソース系のメトリクス

ここからは実際に普段見ているチャートのtsqueryを紹介します。

まずは、サーバリソース系です。

## CPU

最初にCPUのメトリクスから紹介します。

| 項目| 値|
|---|---|
| tsquery | select cpu_percent  |
| Chart Type | Line |
| Facets | All Combined |

tsqueryで指定している cpu_percent はCPUの使用率を表すメトリクスを見ることができます。

Cloudera Managerではチャートを作成する際に、tsqueryを指定する他に「Chart Type」や「Facets」を指定できます。
Chart Typeを「Line」にすると折れ線グラフになります。
台数が多くなってくるとグラフが多くなると見づらくなるのでFacetsは「All Combined」にして全サーバのメトリクスを１つのグラフで見れるようにしています。

以下のようなチャートになります。

<img width="943" alt="chart1" src="https://qiita-image-store.s3.amazonaws.com/0/8576/1bbe03d8-c5c3-8b61-454f-8bd1750107e1.png">

全体的なCPU使用率の傾向がわかったり、異常なCPU使用率になっているRegionServerを特定することができます。

## ディスク

次にディスクです。

| 項目| 値|
|---|---|
| tsquery | select utilization_across_disks  |
| Chart Type | Line |
| Facets | All Combined |

普段はディスクの使用率を見ています。
tsqueryで指定している utilization_across_disks はサーバにある全てのディスクの総使用率を見ることができます。

ディスク使用率も、Chart TypeはLine、FacetsはAll Combinedにしています。

チャートの画像はCPUと同じような感じになるので割愛します。

## ネットワーク

ネットワークはInとOutで別チャートにして見ています。
ネットワークに関しても、Chart TypeはLine、FacetsはAll Combinedにしています。

* In

| 項目| 値|
|---|---|
| tsquery | select bytes_receive_rate  |
| Chart Type | Line |
| Facets | All Combined |

* Out

| 項目| 値|
|---|---|
| tsquery | select bytes_transmit_rate  |
| Chart Type | Line |
| Facets | All Combined |

以下は、ネットワークのInのチャートになります。

<img width="930" alt="chart2" src="https://qiita-image-store.s3.amazonaws.com/0/8576/a88cd014-606b-8909-0df2-95c49d443ffa.png">

# HBaseのメトリクス

ここからはHBaseのメトリクスについて紹介します。

## IPC系のメトリクス

IPC系のメトリクスとして、「Queue Time」と「Process Time」の99パーセンタイルを見ています。
HBaseでは、リクエストはまずキューイングされ、ハンドラースレッドがそこからリクエストを取り出し処理するという仕組みになっています。Queue Timeはリクエストがキューの中にいる時間を示していて、Process Timeはハンドラースレッドがリクエストを処理する時間を示しています。
Queue Timeが大きくなることはハンドラースレッドが処理に間に合わず詰まってきていることになり、Process Timeが大きくなると重いリクエストが来ているか、何らかの原因で処理速度が遅くなっていることになります。

* Queue Time

| 項目| 値|
|---|---|
| tsquery | select ipc_queue_time_99th_percentile  |
| Chart Type | Line |
| Facets | All Combined |

* Process Time

| 項目| 値|
|---|---|
| tsquery | select ipc_process_time_99th_percentile  |
| Chart Type | Line |
| Facets | All Combined |

以下はProcess Timeのチャートです。

<img width="934" alt="chart3" src="https://qiita-image-store.s3.amazonaws.com/0/8576/4e541af3-c3d6-3250-539f-76200b3fe3e9.png">

## オペレーション(Get, Incrementなど)のメトリクス

IPC系のメトリクス以外にも、GetやIncrementなどのオペレーション毎のメトリクスも見ています。
秒間オペレーション数やレイテンシの99パーセンタイルを見ています。

* Getの秒間オペレーション数

| 項目| 値|
|---|---|
| tsquery | select get_rate  |
| Chart Type | Line |
| Facets | All Combined |

* Getのレイテンシの99パーセンタイル

| 項目| 値|
|---|---|
| tsquery | select get_99th_percentile |
| Chart Type | Line |
| Facets | All Combined |

Get以外にも、例えばIncrementの秒間オペレーション数は increment_rate で取得できますし、レイテンシの99パーセンタイルは increment_99th_percentile で取得できます。

## Block Cacheのメトリクス

HBaseではBlock Cacheにどれだけヒットしているかが参照系のパフォーマンスに大きく影響してきます。
ヒット率が低くなってきた場合やEvictionが増えてきた場合には、増設の検討やRegionのバランシングの改善などの対策が必要となります。

ただし、私たちがメトリクスとして普段見ているのはヒット率ではなくキャッシュミスカウントを見ています。これは、ヒット率にはあまり影響していないがキャッシュミスが増えているケースがあるからです。

* Block Cacheのキャッシュミスカウント

| 項目| 値 |
|---|---|
| tsquery | select block_cache_miss_rate |
| Chart Type | Line |
| Facets | All Combined |

* Block Cacheのeviction数

| 項目| 値 |
|---|---|
| tsquery | select block_cache_evicted_rate |
| Chart Type | Line |
| Facets | All Combined |

## コンパクションのメトリクス

コンパクションは非常に重い処理であり、頻発すると全体のパフォーマンスに影響を与えてしまうので普段から見ておく必要があります。
HBaseではコンパクションの要求が発生するとコンパクションキューにキューイングされる仕組みになっているので、コンパクションキューのサイズを見ています。

| 項目| 値 |
|---|---|
| tsquery | select compaction_queue_size |
| Chart Type | Line |
| Facets | All Combined |

以下のようなチャートになります。

<img width="919" alt="chart4" src="https://qiita-image-store.s3.amazonaws.com/0/8576/2dfb59e3-02ad-7649-bf4e-37c9df82e0e2.png">

## Region毎のメトリクス

最後にRegion毎のメトリクスを紹介します。

これまでは、Chart TypeがLineの折れ線グラフばかりでしたが、Region毎のメトリクスを見るのには「Heatmap」が便利です。

例えば、Region毎にIncrementのオペレーション数がどれくらい来ているのかを見たいとします。

| 項目| 値 |
|---|---|
| tsquery | select last(increment_rate) |
| Chart Type | Heatmap |
| Facets | All Combined |

このように指定すると、以下のようなチャートが表示されます。

![heatmap.png](https://qiita-image-store.s3.amazonaws.com/0/8576/f2f020be-c408-af68-8af1-292737c1a26a.png)

この1つ1つの四角がRegionを表しています。色の濃い四角がIncrementのオペレーション数がより来ているRegionとなります。四角の上にカーソルを持っていくことでRegionの情報が表示され、クリックすると更に詳細な情報が表示されます。

このように、Heatmapを使うことでRegion間の偏りやホットリージョンなどを見つけることができます。

# まとめ

今回は、HBaseを運用する上で普段見ているチャートのtsqueryの一部を紹介しました。

tsqueryの補足として、今回紹介した例ではwhere句を使っていませんでしたが、where句を用いることにより対象ホストを絞ったりすることなどができます。

Cloudera Managerを使う前はgangliaを使っていたのですが、クラスタの台数が増えてくると重くなったり、Viewの追加がめんどくさかったりするので(慣れの問題かもしれませんが)、Cloudera Managerのtsqueryはかなり便利に感じています。

ご興味のある方は一度使ってみてはいかがでしょうか。