クラスタセットアップ
はじめに
このドキュメントでは、数ノードの小さなクラスタから数千ノードの非常に大規模なものまで、Hadoop クラスタのインストール、設定、および管理の方法について説明します。
Hadoop を使うには、まず 1 台のマシンに Hadoop をインストールすることから始めてください (Hadoop クイックスタートを参照してください)。
必要なもの
インストール
通常、Hadoop クラスタのインストールでは、クラスタを構成するすべてのマシンでソフトウェアを展開する作業が伴います。
一般にクラスタ上の 1 台のマシンを NameNode 専用とし、これとは別のマシンを JobTracker 専用とします。これらのマシンはマスターです。クラスタ上のこれら以外のマシンは DataNode および TaskTracker の両方の役割を果たします。これらのマシンはスレーブです。
以下では、ディストリビューションのルートが HADOOP_HOME に設定されているものとします。通常、クラスタ上のすべてのマシンの HADOOP_HOME パスは同じです。
設定
以下のセクションでは、Hadoop クラスタの設定方法について説明します。
設定ファイル
Hadoop の設定は、次の 2 種類の重要な設定ファイル群によって決まります。
- 読み取り専用のデフォルトの設定 - src/core/core-default.xml、src/hdfs/hdfs-default.xml、および src/mapred/mapred-default.xml。
- サイト固有の設定 - conf/core-site.xml、conf/hdfs-site.xml、および conf/mapred-site.xml。
これらの設定ファイルによって Hadoop フレームワークがどのようにコントロールされるのかの詳細については、こちらを参照してください。
なお、ディストリビューションの bin/ ディレクトリにある Hadoop スクリプト群は、conf/hadoop-env.sh でサイト固有の値を設定することで制御できます。
サイトの設定
Hadoop クラスタを設定するには、Hadoop デーモンが動作する環境に加え、Hadoop デーモンの設定パラメータを指定する必要があります。
Hadoop デーモンとは、NameNode/DataNode および JobTracker/TaskTracker のことです。
Hadoop デーモンの環境設定
管理者は、conf/hadoop-env.sh スクリプトを使って、Hadoop デーモンプロセス環境に関するサイト固有のカスタマイズを行う必要があります。
最低でも、JAVA_HOME を適切に設定し、各リモートノードでこの環境変数が正しく設定されるようにする必要があります。
管理者は、設定オプション HADOOP_*_OPTS を用いて個々のデーモンの設定を行うことができます。次の表は、利用可能なオプションをまとめたものです。
| デーモン | 設定オプション |
|---|---|
| NameNode | HADOOP_NAMENODE_OPTS |
| DataNode | HADOOP_DATANODE_OPTS |
| SecondaryNamenode | HADOOP_SECONDARYNAMENODE_OPTS |
| JobTracker | HADOOP_JOBTRACKER_OPTS |
| TaskTracker | HADOOP_TASKTRACKER_OPTS |
たとえば、NameNode が parallelGC を使うように設定するには、次のステートメントを hadoop-env.sh に追加します。
export HADOOP_NAMENODE_OPTS="-XX:+UseParallelGC ${HADOOP_NAMENODE_OPTS}"
上の表のほかにも、カスタマイズ可能な便利な設定パラメータとして次のようなものがあります。
- HADOOP_LOG_DIR - デーモンのログファイルを格納するディレクトリ。ディレクトリが存在しない場合は自動的に作成されます。
- HADOOP_HEAPSIZE - 使用するヒープサイズの上限 (単位: MB)。Hadoop デーモンのヒープサイズを設定するのに使われます。デフォルトの値は 1000、すなわち 1000MB です。
Hadoop デーモンの設定
ここでは、設定ファイルで指定する重要なパラメータについて説明します。
conf/core-site.xml:
| パラメータ | 値 | 注 |
|---|---|---|
| fs.default.name | NameNode の URI | hdfs://hostname/ |
conf/hdfs-site.xml:
| パラメータ | 値 | 注 |
|---|---|---|
| dfs.name.dir | NameNode の名前空間とトランザクションログの永続的保存先となるローカルファイルシステム上のパス。 | カンマで区切られたディレクトリのリストを値に指定すると、冗長性を確保するために、指定されたディレクトリのすべてに名前テーブルがレプリケートされます。 |
| dfs.data.dir | DataNode のブロックの格納先となるローカルファイルシステム上のパスをカンマで区切ったリスト。 | カンマで区切られたディレクトリのリストを値に指定すると、指定されたすべてのディレクトリにデータが保存されます。これらのディレクトリには、通常、異なるデバイス上のディレクトリを指定します。 |
conf/mapred-site.xml:
| パラメータ | 値 | 注 |
|---|---|---|
| mapred.job.tracker | JobTracker のホスト名または IP アドレスとポート。 | host:port 形式で指定します。 |
| mapred.system.dir | Map/Reduce フレームワークが /hadoop/mapred/system/ などのシステムファイルを保存する HDFS 上のパス。 | このパスはデフォルトのファイルシステム (HDFS) 内にあり、サーバーマシンとクライアントマシンのどどちらからもアクセスできなければなりません。 |
| mapred.local.dir | Map/Reduce の一時的なデータの書き込み先となるローカルファイルシステム上のパスをカンマで区切ったリスト。 | 複数のパスを指定すると、ディスク I/O を分散できます。 |
| mapred.tasktracker.{map|reduce}.tasks.maximum | ある与えられた 1 つの TaskTracker で同時に実行される Map/Reduce タスク (それぞれ) の最大数。 | デフォルトは 2 (すなわち map タスクが 2 で reduce タスクも 2) ですが、使用するハードウェアに応じて変更してください。 |
| dfs.hosts/dfs.hosts.exclude | 許可する/除外する DataNode のリスト。 | 必要なら、これらのファイルを使って、許可する DataNode のリストを管理してください。 |
| mapred.hosts/mapred.hosts.exclude | 許可する/除外する TaskTracker のリスト。 | 必要なら、これらのファイルを使って、許可する TaskTracker のリストを管理してください。 |
| mapred.queue.names | ジョブをサブミットできるキューをカンマで区切ったリスト。 | Map/Reduce システムは常に少なくとも 1 つのキューを default という名前でサポートします。したがって、このパラメータの値には、文字列 default を必ず含める必要があります。Hadoop でサポートされるジョブスケジューラの一部、たとえば Capacity Scheduler は、複数のキューをサポートしています。この種のスケジューラを使用する場合は、設定するキューの名前のリストをここで指定しなければなりません。キューの定義が済んだら、ユーザーはジョブ設定の中のプロパティ名 mapred.job.queue.name を使って、ジョブをキューにサブミットできます。スケジューラが管理するこれらのキューのプロパティを設定するための別の設定ファイルがある場合もあります。詳細については、該当するスケジューラのドキュメントを参照してください。 |
| mapred.acls.enabled | ジョブのサブミットと管理を制御するために ACL をサポートするかどうかを指定します。 | true を指定すると、ジョブのサブミットと管理の際に ACL がチェックされます。ACL は、以下に示す mapred.queue.queue-name.acl-name 形式の設定パラメータを使って指定できます。 |
| mapred.queue.queue-name.acl-submit-job | 指定された queue-name にジョブをサブミットできるユーザーとグループのリスト。 | ユーザーとグループのリストは、どちらも名前をカンマで区切ったリストです。ユーザーのリストとグループのリストは、1 つの空白で区切ります (たとえば、user1,user2 group1,group2)。グループのリストだけを指定する場合は、値に先頭に空白を 1 つ入れます。 |
| mapred.queue.queue-name.acl-administer-job | 指定された queue-name にサブミットされているジョブのプライオリティを変更したり、ジョブを kill したりできるユーザーとグループのリスト。 | ユーザーとグループのリストは、どちらも名前をカンマで区切ったリストです。ユーザーのリストとグループのリストは、1 つの空白で区切ります (たとえば、user1,user2 group1,group2)。グループのリストだけを指定する場合は、値に先頭に空白を 1 つ入れます。ジョブのオーナーは、ACL の設定とは無関係に、自分のジョブのプライオリティを変更したり、ジョブを kill したりすることができる点に注意してください。 |
通常、上の表に掲載したパラメータはすべて、ユーザー・アプリケーションが上書きできないように、final とマークされています。
実際のクラスタでの設定
ここでは、非常に大規模なクラスタ上で sort ベンチマークを実行するのに使われた、デフォルトではない設定パラメータの一部を示します。
-
900 ノードのクラスタ上で 9TB のデータをソートする sort900 を実行した際に使われた、デフォルト以外の設定値の一部です。
設定ファイル パラメータ 値 注 conf/hdfs-site.xml dfs.block.size 134217728 大容量ファイルシステム向けに HDFS ブロックサイズを 128MB に設定。 conf/hdfs-site.xml dfs.namenode.handler.count 40 非常に多数の DataNode からの RPC を処理できるよう、NameNode サーバーのスレッドを多目に設定。 conf/mapred-site.xml mapred.reduce.parallel.copies 20 非常に数の多い map からの出力を取り込むために、reduce が同時に実行するコピーの数を増やして設定。 conf/mapred-site.xml mapred.child.java.opts -Xmx512M maps/reduce の子 jvm のヒープサイズを大き目に設定。 conf/core-site.xml fs.inmemory.size.mb 200 map からの出力を reduce でマージするときに使われるインメモリ・ファイルシステムに割り当てるメモリ量を増やして設定。 conf/core-site.xml io.sort.factor 100 ファイルのソート中により多くのストリームを一度にマージできるよう設定値を変更。 conf/core-site.xml io.sort.mb 200 データのソート中のメモリ上限を高目に設定。 conf/core-site.xml io.file.buffer.size 131072 SequenceFile で使われる読み取り/書き込みバッファのサイズ。 -
1400 ノード上で 14TB のデータをソートする sort1400 と、2000 ノード上で 20TB のデータをソートする sort2000 を実行した際に新たに変更した設定値の一部です。
設定ファイル パラメータ 値 注 conf/mapred-site.xml mapred.job.tracker.handler.count 60 非常に多数の TaskTracker からの RPC を処理できるよう、JobTracker サーバーのスレッドを多目に設定。 conf/mapred-site.xml mapred.reduce.parallel.copies 50 conf/mapred-site.xml tasktracker.http.threads 50 TaskTracker の HTTP サーバーのワーカースレッドを多目に設定。HTTP サーバーは、map からの中間出力を取り込むために、reduce によって使われます。 conf/mapred-site.xml mapred.child.java.opts -Xmx1024M maps/reduce の子 jvm のヒープサイズを大き目に設定。
メモリの監視
TaskTracker (TT) は、生成するタスクのメモリ使用状況を監視するように設定できます。このように設定すると、不適切なふるまいをするジョブの過剰なメモリ消費によってマシンがダウンするのを防ぐことができます。メモリの監視を有効にすると、各タスクには仮想メモリ (VMEM) に関するタスク制限が課せられます。また、各ノードには、VMEM 使用量に関するノード制限が課せられます。TaskTracker は、タスクおよびその子孫が、タスクごとの制限を超える VMEM を使用した場合に、該当するタスクが kill されることを保証します。また、すべてのタスク、およびこれらの子孫の合計 VMEM 使用量がノード制限を超えた場合に、これらのタスクが kill されることも保証します。
オプションとして、ユーザーはジョブごとに VMEM タスク制限を指定できます。制限が指定されていない場合には、デフォルトの制限が使われます。ノード制限はノードごとに設定できます。
現在、メモリの監視と管理がサポートされているのは、Linux プラットフォームだけです。
TaskTracker でメモリの監視を有効にするには、以下のすべてのパラメータを設定する必要があります。
| 名前 | 型 | 説明 |
|---|---|---|
| mapred.tasktracker.vmem.reserved | long | オフセットを示す値をバイト単位で指定します。マシンの合計 VMEM から、ここで指定するオフセットを引いたものが、TaskTracker によって生成されるすべてのタスクおよびその子孫に対する VMEM ノード制限になります。 |
| mapred.task.default.maxvmem | long | タスクに関連付けられるデフォルトの VMEM タスク制限を示す値をバイト単位で指定します。個々のジョブの設定で上書きされる場合を除いて、ここで指定する値が VMEM タスク制限となります。 |
| mapred.task.limit.maxvmem | long | タスクに関連付けられる VMEM タスク制限の上限を示す値をバイト単位で指定します。ユーザーがタスクに VMEM タスク制限を指定する場合、ここで指定された値を超える制限を指定することはできません。 |
上記に加えて、以下のパラメータを設定することもできます。
| 名前 | 型 | 説明 |
|---|---|---|
| mapred.tasktracker.taskmemorymanager.monitoring-interval | long | TaskTracker がメモリ違反をチェックする間隔をミリ秒単位で指定します。デフォルトの値は 5000 ミリ秒 ( 5 秒) です。 |
次に、TaskTracker でのメモリの監視の動作のしくみについて説明します。
- 上に説明した設定パラメータの 1 つ以上が欠けているか、-1 が指定されている場合、該当する TaskTracker でのメモリの監視は無効になります。
- さらに、mapred.task.default.maxvmem が mapred.task.limit.maxvmem より大きい場合、メモリの監視は無効になります。
- ユーザーがタスクにタスク制限を設定していて、その値が mapred.task.limit.maxvmem より大きい場合、該当するタスクを受け取った TaskTracker は警告を記録しますが、タスクは実行します。
- TaskTracker は定期的に以下のことをチェックします。
- いずれかのタスクの現在の VMEM 使用量が、そのタスクの VMEM タスク制限を超えている場合、そのタスクは kill され、タスクが kill された理由がタスクの診断結果に記録されます。このようなタスクは失敗したものとみなされ、kill された数はタスクの失敗数としてカウントされます。
- すべてのタスクおよびその子孫によって使われている合計 VMEM が、合計 VMEM が、ノード制限を超えている場合、TaskTracker は、全体の VMEM 使用量がノード制限を下回るまで、進捗の最も遅いものから順に、必要なだけタスクを kill します。このようにして kill されたタスクは失敗したものとはみなされず、kill された数はタスクの失敗数としてはカウントされません。
スケジューラは、1 つのノード上で実行されるタスクが多くなり過ぎないようにするとともに、TaskTracker に十分な空き VMEM がある場合にのみタスクをスケジューリングすることで、TaskTracker に課せられる監視の負荷を緩和することができます。また、スケジューラは、ノード上で利用可能な物理メモリ (RAM) も考慮の対象に含めることができます。スケジューラのサポートを有効にするために、TaskTracker はハートビートごとに JobTracker にメモリ設定を報告します。詳細な内容に入る前に、より適切なスケジューリングを可能にするために設定できるメモリ関連の追加パラメータを以下に示します。
| 名前 | 型 | 説明 |
|---|---|---|
| mapred.tasktracker.pmem.reserved | int | オフセットを示す値をバイト単位で指定します。マシンの合計物理メモリ (RAM) から、ここで指定するオフセットを引いたものが、推奨される RAM ノード制限になります。RAM ノード制限はスケジューラへのヒントとなります。すなわち、スケジューラは、タスクの合計必要 RAM がここで指定されている制限を超えることがないよう、スケジュールするタスクの数を制限します。RAM の使用量は、TaskTracker の監視対象ではありません。 |
TaskTracker は、ハートビートごとに以下のメモリ関連の値を報告します。
- ノード上で利用可能な合計 VMEM。
- mapred.tasktracker.vmem.reserved の値 (設定されている場合)。
- ノード上で利用可能な合計 RAM。
- mapred.tasktracker.pmem.reserved の値 (設定されている場合)。
スレーブ
一般にクラスタ上の 1 台のマシンを NameNode 専用とし、これとは別のマシンを JobTracker 専用とします。これら以外のマシンは DataNode および TaskTracker の両方の役割を果たします。これらのマシンのことを、スレーブと呼びます。
conf/slaves ファイルには、すべてのスレーブのホスト名または IP アドレスを 1 行に 1 つずつ記述します。
ログの記録
Hadoop では、 Apache Commons Logging フレームワークを介して Apache log4j を使ってログを記録します。Hadoop デーモンのログ記録設定 (ログのフォーマットなど) をカスタマイズするには、conf/log4j.properties ファイルを編集します。
履歴のログ記録
ジョブ履歴ファイルは、集中管理のための場所である hadoop.job.history.location に格納されます。この場所は DFS 上にあってもよく、デフォルトの値は ${HADOOP_LOG_DIR}/history です。履歴ウェブ UI は、ジョブトラッカー・ウェブ UI からアクセスできます。
履歴ファイルは、ユーザー指定のディレクトリ hadoop.job.history.user.location にも格納されます。ユーザー指定のディレクトリのデフォルトは、ジョブ出力ディレクトリです。履歴ファイルは、指定されたディレクトリ内の "_logs/history/" に格納されます。つまり、デフォルトでは、履歴ファイルは "mapred.output.dir/_logs/history/" に格納されることになります。ユーザーは、hadoop.job.history.user.location に値 none を指定することで、ログの記録を停止させることができます。
ユーザーは次のコマンドを実行することで、指定されたディレクトリ内の履歴ログのサマリーを表示できます。
$ bin/hadoop job -history output-dir
コマンドを実行すると、ジョブの詳細、失敗した TIP および kill された TIP の詳細が表示されます。
成功したタスクや各タスクのタスク試行など、ジョブの詳細を表示するには、次のコマンドを実行します。
$ bin/hadoop job -history all output-dir
必要な設定をすべて終えたら、設定ファイルをすべてのマシンの HADOOP_CONF_DIR ディレクトリ (通常は ${HADOOP_HOME}/conf) に転送します。
クラスタの回復可能性
Map/Reduce
mapred.jobtracker.restart.recover が true に設定されていて、JobHistory のログ記録が有効になっている場合、ジョブトラッカーの再起動時に、実行中のジョブを回復できます。この場合、mapred.jobtracker.job.history.block.size に適切な値を設定し、ジョブ履歴をできるだけ速やかにディスクにダンプできるようにしておく必要があります。mapred.jobtracker.job.history.block.size のデフォルトの値は 3145728 (3MB) です。
Hadoop のラック対応
HDFS および Map/Reduce コンポーネントはラック対応です。
NameNode および JobTracker は、管理者が設定したモジュール内の API resolve を呼び出して、クラスタ内のスレーブのラック ID を取得します。API は、スレーブの DNS 名 (または IP アドレス) をラック ID に解決します。このときどのモジュールを使うかは、設定項目 topology.node.switch.mapping.impl を使って設定できます。モジュールのデフォルトの実装では、topology.script.file.name で設定されたスクリプト/コマンドを実行します。topology.script.file.name が設定されていない場合は、渡されたすべての IP アドレスに対して、ラック ID /default-rack が返されます。Map/Reduce に関連するその他の設定として、mapred.cache.task.levels があり、キャッシュの (ネットワークトポロジ内での) レベル数はこの値によって決まります。たとえば、mapred.cache.task.levels の値がデフォルトの 2 である場合、1 つはホスト用 (ホストからタスクへのマッピング)、もう 1 つはラック用 (ラックからタスクへのマッピング) の 2 レベルのキャッシュが構築されます。
Hadoop の起動
Hadoop クラスタを起動するには、HDFS および Map/Reduce クラスタの両方を起動する必要があります。
新しい分散ファイルシステムをフォーマットします。
$ bin/hadoop namenode -format
NameNode に指定したマシンで次のコマンドを実行し、HDFS を起動します。
$ bin/start-dfs.sh
bin/start-dfs.sh スクリプトは、NameNode 上の ${HADOOP_CONF_DIR}/slaves ファイルを読み込み、このファイルで指定されているすべてのスレーブ上で DataNode デーモンを起動します。
JobTracker に指定したマシンで次のコマンドを実行し、Map/Reduce を起動します。
$ bin/start-mapred.sh
bin/start-mapred.sh スクリプトも、JobTracker 上の ${HADOOP_CONF_DIR}/slaves ファイルを読み込み、このファイルで指定されているすべてのスレーブ上で TaskTracker デーモンを起動します。
Hadoop のシャットダウン
NameNode に指定したマシンで次のコマンドを実行し、HDFS を停止します。
$ bin/stop-dfs.sh
bin/stop-dfs.sh スクリプトも、NameNode 上の ${HADOOP_CONF_DIR}/slaves ファイルを読み込み、このファイルで指定されているすべてのスレーブ上で DataNode デーモンを停止します。
JobTracker に指定したマシンで次のコマンドを実行し、Map/Reduce を停止します。
$ bin/stop-mapred.sh
bin/stop-mapred.sh スクリプトも、JobTracker 上の ${HADOOP_CONF_DIR}/slaves ファイルを読み込み、このファイルで指定されているすべてのスレーブ上で TaskTracker デーモンを停止します。


