HadoopでMapReduce処理を動かせるようになると、アドホック(個別対応)に処理させるだけでなく、毎時間や毎日、繰り返し処理を実行したいということも増えてくる。このとき、試行的に構築した環境のリソースをより活用することで、扱う処理の幅やデータの規模を増やすことも可能になる。

 今回は、Hadoopを長期間運用していくときに抑えるべきポイントや、よくある運用時に陥りやすいポイントについてそれぞれ2点ずつ解説しよう。

Hadoopクラスタの運用で抑えておきたいポイント

1. Hadoopのノードで取得できる情報

 Hadoopの各ノードは、操作の数やメモリーの状態などをメモリー上で管理している。これらの情報の一部はログに出力するが、デフォルトの設定では全てをファイルには出力しない。しかし長期間Hadoopクラスタを運用していくためには、管理情報の全てを把握して、ノードの異常にいち早く気づき、クラスターを増設するなどの対策を取る必要が発生する。

各種ノードの情報を取得する代表的な方法は4通りある。

(1) ファイルで確認
(2) JMXで確認
(3) Gangliaで確認
(4) Webブラウザで確認

 (1)~(3)を行うためには、Hadoop設定ファイル(hadoop-metrics.propertiesやhadoop-env.shなど)内の設定を変更する。そうすればファイルまたはJMX、Gangliaからノードの情報を取得できるようになる。(4)については、「http://[ノードのHTTPアドレス]:[ポート]/jmx 」にアクセスすることで、(1)~(3)で得られる情報と同様のものを取得できる。

 どのような方法であれ、ノードを安定運用するためには各種ノードの情報を継続して取得しなければならない。

2. Hadoopを動かすJava VM

 HadoopはJavaにより動作する。現在の推奨バージョンはJava 6のみである。各種ノードについてチューニングしておくポイントは(1) ヒープメモリーサイズと(2) GC(ガベージコレクション)オプションである。

 管理するファイルやディレクトリー、ブロック数が増えるとヒープメモリーの消費も増える。サーバーのメモリー容量が少ないことがメモリー枯渇につながるのはもちろんだが、メモリー容量が潤沢な場合でも、フルGCにより長期間停止するなど、GCが本動作の停止を引き起こすことがある。そのため、下記のようなチューニングを行う。

(1)ヒープメモリーのチューニング

  Hadoopでは特にマスターノードは継続してファイルシステムやジョブなどの管理情報をメモリー上で管理する。そのため、格納するファイル数や、実行するジョブ数、Hadoopクラスタ規模に応じてヒープメモリーのサイズを変更する必要がある。

 デフォルト値は1GBとなっている。NameNode(マスターノードで動作し、HDFS(Hadoop分散ファイルシステム)のブロック化したファイルの位置情報、所有者などを集中管理するデーモンプロセス)で100万オブジェクト(ファイル・ディレクトリー・ブロックをまとめたもの)の場合なら、この程度で問題ないだろう。JobTracker(マスターノードで動作し、ジョブの投入を受け付け、割り振るデーモンプロセス)のヒープメモリーは、実行するジョブ数やタスク数、メモリー上で保存するジョブ履歴数に応じて変更しなければならない。

 一方スレーブノードについてもヒープメモリーのサイズを意識することが大切だ。DataNode(NameNodeからの指示で、スレーブノードにおいて実際のファイル操作を行うデーモンプロセス)は格納するブロック数が10万単位になる場合は、デフォルト値である1GBよりも増やす必要がある。TaskTracker(ジョブトラッカーから指示を受け、スレーブノードで子プロセスを起動してタスクを実行するデーモンプロセス)は、Hadoopクラスタの規模が大きくなる(目安として50以上のノード数)場合に、デフォルト値である1GBより増やすとよい。

 また、ヒープサイズだけでなく、ヒープ領域におけるNew領域とOld領域の割合の変更も大切だ。Hadoopは、長命なオブジェクトだけでなく、短命なオブジェクトを扱う場合も多いので極力New領域の割合を大きくすることで、短命オブジェクトをOld領域に移動させないようにする。

(2)GCオプションのチューニング

 Javaのチューニングにおいて避けて通れないものは、ヒープ領域内の不使用オブジェクトを消去するGCの動作方式の設定である。GCにより本処理が中断することを防ぐためには、デフォルトのGCから変更することが望ましい。特に停止時間を抑える方式として、アプリケーションと並行して動作するコンカレント方式がある。この方式は、削除対象のオブジェクトを抽出し、抽出が完了するところまでは本処理と並行して行える。オブジェクトを除去するときだけ本処理を停止するように動作する。このため、GCにより長期間停止することを防ぐように動作する。