halookで始めるHadoop/HBaseトラブルシューティング

第1回halookでHadoop/HBaseを可視化しよう

この連載では、HadoopやHBaseのトラブルを解決する手順をご紹介します。第1回目となる今回は、本連載のキーとなるツール「halook」を紹介します。⁠halook」はオープンソースで開発しているHadoop/HBase用の可視化ツールで、トラブルの発生を可視化して把握し、原因究明するために利用できます。まずは「halook」の概要から紹介します。

Hadoop、HBaseの難しさ

Hadoopは大量データの保存と分散処理のために、数十台~数千台のマシンを扱います。そのため、何かトラブルがあったときに、どこに原因があるのか突き止めるのが難しい場合が多く、あるいは、そもそもトラブルが起こっていることに気付くのが遅れてしまうこともあります。たとえば、次のような点が挙げられます。

  1. データは正しく分散配置されているか
  2. 処理は分散して実行されているか
  3. 設定ミスをしていないか
  4. 問題の報告の難しさ

1.データは正しく分散配置されているか

HadoopやHBaseを採用した際、HDFSに保存するデータが、特定のスレーブに偏らず、うまく分散配置されているかどうかは、運用上気になるところです。データの偏りが生じると、MapReduce実行時に、スレーブ間でのデータ転送が発生してしまい、⁠ローカルのデータを処理対象にすることでネットワーク転送量を減らす」という特性が発揮されないか、あるいは特定のスレーブに処理が集中することとなり、いずれにせよパフォーマンスに影響が出る可能性があります。

Hadoopの機構として、データが自動的にバランス良く配置されるようになっていますが、たとえば新規にマシンを追加してスレーブの台数を増やした場合などは、元々保存されていたデータが新しいノードに自動で移動するわけではないため、手動でリバランスのコマンドを実行するか、新規に投入するデータが使用量の少ないノードに優先的に保存された結果としてばらつきがなくなるのを待つことになります。また、サーバごとにHDFSに割り当てられている容量が異なる場合、このようなケースでのデータ割り当てルールが単純ではないことから、バランスの良い配置になっているかどうかはなおのこと確認しておきたいところです。

HBaseについても同様です。HBaseは、Regionと呼ばれる単位でデータを管理します。HBaseへのreadやwriteは、対象のRegionを持っているRegionServerへの問い合わせの形で行われます。そのため、たとえばあるテーブルへの書き込みが行われる際、対象のテーブルのRegionが特定のRegionServerにしかなかった場合、そのRegionServerへのアクセスが集中してしまいます。このようなことが、読み書きの速度が思うように上がらない原因となります。また、⁠各RegionServerの持つRegion数」は均一になるように自動で調整されますが、テーブルごとに見た場合、⁠あるテーブルのRegionが特定のRegionServerに偏っている」という状況も起こり得ます。以下のは、30台のノードを持つHBaseクラスタにデータを投入したときのRegion分布を表したグラフです。テーブルごとに色分けがされています。各サーバのRegion数合計はほぼ同じですが、テーブルごとに見ると、ほとんどRegionが割り当てられていないノードとそうでないノードがあることがわかります。

図1 HBaseのテーブルごとのRegion数を表したグラフ
図1 HBaseのテーブルごとのRegion数を表したグラフ

2.処理は分散して実行されているか

MapReduceは、分散処理を簡単に記述するためのフレームワークです。しかし、⁠簡単に」とはいっても、処理の特性を理解して効率的なアプリケーションを作成するにはそれ相応の知識を必要とします。うまく分散しない処理を書いてしまうと、対象となるデータ量が増えたときに、マシンの台数を増やしてもパフォーマンスが上がらないという事態を招いてしまいます。もしくは、ある日突然「reduce処理中にOutOfMemoryErrorで落ちた」なんてことになるかもしれません。検証段階できちんとチェックすることが必要です。

また、PigやHiveなどの高級言語で処理を記述した場合も、結果的にどんなMapReduce処理が実行されているのかは気になるところです。いちいちMapReduceのログを確認するのは面倒ですが、定期的に実行されるジョブと、アドホックに実行されるジョブとを共存させることを考えた場合は、どのようなMapReduceジョブが実行されるかを把握した上で、スケジューラの設定、各処理に割り当てるスロット数を調整する必要が生じます。

3.設定ミスをしていないか

Hadoopの設定項目は多岐にわたります。データ量の増加や、分析したい内容の変更に応じて、クラスタ自体の設定を見直すこともあると思いますが、変えた結果、⁠結局どういう動きをするようになったのか」は確認しておかなければなりません。設定の変更が反映されたかどうかは、普通は設定変更後に確認するでしょうが、それに加えて、意図しない動きをするようになっていないかも見ておく必要があります。単に処理が正常に終了したことを見るだけではなく、何らかの可視化手法で直感的に動きが捉えられれば、⁠期待通りに処理が変わった」ことや、⁠おかしな動作をしている」ことが、把握できるようになります。特にHadoopは、マシンの台数が多くなるため、⁠一部のスレーブに設定変更が反映されていない」というミスも起こり得ます。そのため、なおのこと俯瞰的に処理の状態を見ることが求められます。

4.問題の報告の難しさ

システム運用時にトラブルが発生した場合、開発者本人はログを見れば問題がわかるかもしれませんが、その報告がネックになることがあります。⁠マシンの追加が必要だ」⁠このマシンの交換が必要だ」⁠この現象を解決するために、稼働中の商用クラスタに追加でこのような設定変更が必要だ」など、こういったことをステークホルダーに説明するためにエンジニアが資料を作るのですが、その作成に大きな工数がかかる場合があります。⁠システムの)現状の可視化は、このような場面でも役に立ちます。

Hadoop、HBaseを可視化しよう

それでは、halookを使って可視化できる内容を紹介しましょう。halookは、Acroquest Technology株式会社が2012年11月に公開した、Hadoop/HBase可視化のためのOSSです。halookと同時期に製品版をOSSとして公開した、Javaシステムの見える化・診断ツールENdoSnipeの機構を使ってデータを収集します。なお、halookはCDH3u5の他、コミュニティ版のApache Hadoop 0.20.2でも動作確認を行っています。

HDFSの使用量を可視化する

まずはhalookのロゴにもなっている、HDFSビューを見てみましょう図2⁠。1本のバーが、1つのDataNodeを表しており、容量に対する、現在の使用量を表示しています。使用率が設定した閾値を超えると、バーの色が青からオレンジ色に変わるようになっています。これにより、容量に余裕があるか、データに偏りがないかが、一目で確認できるようになります。過去データも参照できるため、時系列に追っていくことで、クラスタの成長も見て取ることができます。

図2 HDFSの可視化
図2 HDFSの可視化

MapReduce Jobを時系列に表示する

続いて、MapReduce Jobガントチャートです図3⁠。名前のとおり、MapReduce Jobの一覧を、ガントチャートで表示します。Hadoopの標準のWebUIだと、表形式で一覧化されるだけなので、たとえば「処理時間の長かったJobはどれか」というのもすぐにはわかりません。このように、Jobの開始時刻と終了時刻を線で表現することによって、時間のかかったJobがわかるようになり、同時に複数のJobが実行されている様子も把握できるようになります。

図3 MapReduce Jobガントチャート
図3 MapReduce Jobガントチャート

MapReduceのタスク実行状況を表示する

MapReduce Jobの一覧画面で、どれかのJobを選択すると表示される画面です。MapReduce Jobの実行内容を、Map TaskとReduce Taskを矢印で表現することで詳細に表します。時系列にソートしたり、Taskの実行ホストごとにソートしたりすることができるため、時系列にソートすれば処理の進む様子を視覚的に追うことができ、ホストごとにソートすれば各ノード上での実行状況を把握することができます。特定のノードで、Taskの失敗が集中していることや、他のノードより処理時間が長くなっていることがわかれば、ノードを切り離して調査するなどの対策を取ることができます。また、画面の下の方に表示されているグラフは、同時に実行しているTask数を表します。

たとえば、Jobの実行時間が長くなっている原因を調べる際に、このグラフによりTaskの同時実行数が少なくなっている時間帯があることがわかれば、⁠遅くなった原因は、同時に実行された他のJobによりTaskの実行数が制限されたから」と結論付けることが可能になります。

図4 MapReduce Taskを矢印で表示
図4 MapReduce Taskを矢印で表示

MapReduce Jobの特性を現すグラフを表示する

MapReduce Jobの特性を把握するのに便利なグラフを表示します。とくに、Map TaskとReduce Taskの数が多いときに効果を発揮します。横軸がTaskの開始時間もしくは終了時間、縦軸がTaskの実行時間です。このグラフにより、Taskの処理時間のばらつきを把握することができます。たとえば、Map Taskの処理時間が長いものと短いものがあれば、どこか特定のサーバで問題が発生し、処理に時間がかかるようになっているのではないか、などを疑うことになります。Reduce Taskの中に極端に処理時間の長いものがあれば、Partitionerの設定やMapperの実装見直しでJob全体の処理時間が短くなる可能性があると考えることもできます。

また、失敗したTaskの傾向も把握できます。たとえば、同じ処理時間で失敗するTaskが多ければ、Timeoutによる失敗を疑うことができます。うまく活用すれば便利なグラフです。

図5 MapReduce Jobの特性を現すグラフ
図5 MapReduce Jobの特性を現すグラフ

HBaseのRegion数の推移を表示する

HBaseのRegion数の推移を表したグラフで、HBaseクラスタの成長の様子を把握することができます。Region数の増加は、予想外の動きを示すことがあるので注意が必要です。HBaseに一定のペースでデータを書き込み続けた場合、RegionのSplitを自動に任せると、Splitのタイミングが集中し、グラフが階段状になる場合があります。

HBaseのRegionは、デフォルトでは256Mバイトに達すると、128MバイトのRegionに2分割されます。そのため、すべてのRegionに均等に書き込みが発生するケースでは、すべてのRegionのSplitが同時期に起こり、しばらくSplitが起こらない状態が続いたあと、ほぼ同時にすべてのRegionのサイズが256Mバイトに達し、Splitのタイミングがまた集中します。Splitにはコストがかかるので、Splitが集中するタイミングでパフォーマンスが低下する可能性があります。こういったことも、グラフ化することによって把握することができ、事前に手を打つことができます。

図6 HBaseのRegion数の推移グラフ
図6 HBaseのRegion数の推移グラフ

HBaseのRegion分布を表示する

HBaseのRegionの分布をサーバごとに表示します。グラフがテーブルごとに色分けされており、合計したRegion数の分布だけでなく、テーブルごとのRegion数の分布もわかるようになっています。Region数は各サーバで均等になっていても、テーブルごとのRegion数には偏りがあるかもしれません。この場合、テーブルへのデータ書き込みが分散せず、パフォーマンスが低下します。そのような状況がグラフ化でわかるようになります。

図7 HBaseのRegion分布グラフ
図7 HBaseのRegion分布グラフ

他のアプリケーションと合わせて監視する

halookはENdoSnipeのプラグインとして開発されたため、Hadoopの監視をしながら、同時に他のJavaシステムを監視することもできます。このは、2つのHadoopクラスタとフロントエンドのWebアプリケーションを同時に監視した場合の、ツリー表示のメニュー部分を表示したものです。

図8 Webアプリケーションと合わせて監視する
図8 Webアプリケーションと合わせて監視する

今回はここまでです。なお、今回紹介したhalookの機能は、次の動画で見ることができますので、もしよければご覧ください。次回、halookの適用方法と使用例を紹介します。

halookデモ(1) 機能紹介 - Hadoop Conference Japan 2013 Winter
http://youtu.be/rH16eS2_SJ8
halook
https://github.com/endosnipe/halook

おすすめ記事

記事・ニュース一覧