双六工場日誌

平凡な日常を淡々と綴ります。

【 #hadoopAC11jp 】10日目・HBaseのメトリクス取得でハマった件とJSONでのメトリクス取得

今日、HBaseのメトリクス関連で調べ物をしたので、そのネタでHadoop アドベントカレンダーに参加してみます。
実はアドベントカレンダーって何かわかってなかったんですが、仕掛けカレンダーの一種なんですね。

Google画像検索 - アドベントカレンダー
http://www.google.co.jp/search?q=%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC&hl=ja&prmd=imvnsl&tbm=isch&tbo=u&source=univ&sa=X&ei=-kbjToHnAsuZmQWNuo3zBA&ved=0CHMQsAQ&biw=889&bih=1136

クリスマスまでの期間、その日の日付のところの箱を開いていくと、一つの絵が完成するようになっているんだと。
…自分のところには、クリスマス終了のお知らせしかきていないんですが(´・ω・`)


閑話休題。

Hadoop メトリクスの基本

それでは、本題のHadoop メトリクスについて。内容は、CDH3前提ですのであしからず。

Hadoopのメトリクスのモニタリング設定は、「hadoop-metrics.properties」で行います。
Hadoop自体にOSSのクラスタモニタリングソフトの「Ganglia」にメトリクスの情報を送信する仕組みがあり、以下のURLに設定方法が紹介されています。

http://wiki.apache.org/hadoop/GangliaMetrics

設定は例えばこんな感じです。

hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext31
hbase.period=10
hbase.servers=:8649


のところには、

・Ganglia gmetadサーバのIP
・Gangliaのサーバグループのマルチキャストアドレス

のどちらかが入ります。

Hadoopを監視する場合でも、HBaseをモニタリングする場合でも基本的な方法は同じで、どちらの場合も「hadoop-metrics.properties」を編集しますが、Hadoop本体の監視設定は「/etc/hadoop/conf」、HBaseの場合は「/etc/hbase/conf」にあるファイルを編集します。


のはずが、、、

ということでその設定をしたんですが、そこでハマったってのが今日のネタです。

HBaseのメトリクス設定はしたものの

上記の手順に従って「/etc/hbase/conf/hadoop-metrics.properties」を編集したのに、HBase Master と Regionserver の固有メトリクスがとれてないことのに気づきました。JVMとかRPCとかHBase固有ではないクラスのメトリクスはとれているので、動いていないわけではない様子。ただ、hbase関連のメトリクスだけは、どんな設定を入れてもうんともすんともいいません。

それで昨日の夜から今日の朝にかけて、HBaseと格闘した結果が以下の流れ。

「HBaseのメトリクスとれてないな。(ごにょごにょ設定いじって実験)」

「あれ、設定を全部Nullにしても、メトリクスが発行されてる!?」

JVMとかRPCとか、Hadoopと共通のメトリクスは、/etc/hadoop/confにある hadoop-metrics.properties の設定で動いているような。。。」

「なら、そっちにHBaseの設定も書いてみるか。」

「こいつ、動くぞ…!」

ということで、試行錯誤の上、なぜか動くworkaroundを見つけました。

@shiumachi さんからのお助けが!

自分としては、これでとりあえず動いたので一旦調べるのを止めていたんですが、 @shiumachi さんが僕のPOSTを拾ってくれて、以下のパッチを教えてくれました。

https://issues.apache.org/jira/browse/HBASE-4854

要するにHBaseの起動スクリプトにバグがあって、PATHが正しくと通ってなかったってことらしい。。。
確かにこの内容なら、/etc/hadoop/confの方が効いちゃってることも説明がつきます。起動スクリプトを見てみると、PATH設定が複数ファイルにわたって書かれていて、入り組んでいるので、さもありなんというところ。
パッチの内容は、hbaseの起動スクリプトを一行書き換えるだけだったので、自分の手元の環境ではそれを試したところ、見事解決しました。

もう少し調べてみたら、Clouderaの方にも報告が上がっていて、真相はHBaseのUpstreamのバグがCDHにも反映されてしまったってことみたいですね。
https://issues.cloudera.org/browse/DISTRO-338

上記のバグ報告にはまだ反映されていませんが、upstreamで修正されたため、CDH3u3ではこの問題が解決される見通しとのことです。

HBaseのMetricsは、モニタリングし甲斐があるパラメータが多いので、原因がはっきりして助かりました。
ちなみにメトリクス一覧はこちら↓
http://hbase.apache.org/book.html#hbase_metrics



おまけ:HadoopのメトリクスはJSONで取れるよ!

これだけだと、トラブル報告だけなので、小ネタをひとつ。

Gangliaなどへのメトリクス発行を有効化していると、「http://<各ノードのIP>:/metrics」にアクセスして、同様のメトリクス情報を取得できるようになります。

各デーモンごとのポートは以下のとおり。

Namenode: 50070
SecondaryNamenode: 50090
Datanode: 50075
JobTracker: 50030
TaskTracker: 50060
HBase Master: 60010
HBase Regionserver: 60030


例えばこんな感じにとれます。

# curl http://localhost:60030/metrics
hbase
info
master
{Master=host01.sechiro.local:38282,hostName=host01.sechiro.local}:
cluster_requests=0.0
splitSize_avg_time=0
splitSize_num_ops=0
splitTime_avg_time=0
splitTime_num_ops=0
(以下略)


ただ、これだとインデントされたテキストで出てくるので、プログラム上からはちょっと扱いにくい。。。
と思って、ソースを確認してみると「format=json」という出力オプションがありました。

http://<各ノードのIP>:/metrics?format=json

これを使えば、JSON形式でGangliaに出力されているものと全く同じものが取得できます。
GangliaContext31などを有効にしている場合は、すでにこれが使える状態になっているはずです。また、Gangliaは使わず、これだけを使いたい場合は、これだけにしか出力しない場合は、NoEmitMetricsContextを指定すればOK。

これを使うと、どんなモニタリングソフトともHadoop Metricsの連携ができるようになります。
あとは監視用のボイスをつけるだけですw

インフラ屋としては、モニタリングががっちりできていると、非常に心穏やかになれますw
その点、Hadoopはモニタリングすべき値をこのように外部にきちんと提供してくれているので、非常にいい作りだと思います。

あとは、モニタリング関係だと各MapReduceジョブごとの解析が、これだけだと足りないので、その解析ツールができたらもっと幸せになれるかなーと考えたりします。


ということで、急遽、10日目担当をやらせていただきましたせちろーでした。
駄文失礼。ではでは。


【PR】 大晦日にインフラエンジニア双六を頒布します!

12月31日(土) コミックマーケット 81にて、インフラエンジニア双六を頒布します!
笑いあり、涙あり、お正月に家族と一緒に遊ぶことで家族の間でインフラエンジニアの仕事への理解が深まること請け合いです!

12月31日(土)  東地区 ペ ブロック 02a
サーバ擬人化ユーザ会

こちらも、よろしくお願いします。