Hadoopクラスタの設定

目的

このドキュメントでは、数ノードから数千ノードの非常に大規模なクラスタに至るまでのHadoopクラスタをインストールおよび構成する方法について説明します。Hadoopを試すには、まず単一のマシンにインストールすることをお勧めします(シングルノードの設定を参照)。

このドキュメントでは、高可用性などの高度なトピックは扱いません。

重要:すべての本番環境のHadoopクラスタは、Kerberosを使用して呼び出し元を認証し、HDFSデータへのアクセスを保護し、計算サービス(YARNなど)へのアクセスを制限します。

これらの手順は、Kerberosサービスとの統合については説明していません。本番環境のクラスタを立ち上げるすべての人は、組織のKerberosインフラストラクチャへの接続をデプロイメントの重要な一部として含める必要があります。

クラスタを保護する方法の詳細については、セキュリティを参照してください。

前提条件

  • Javaをインストールします。既知の適切なバージョンについては、Hadoop Wikiを参照してください。
  • ApacheミラーからHadoopの安定版をダウンロードします。

インストール

Hadoopクラスタのインストールには、通常、クラスタ内のすべてのマシンにソフトウェアを解凍するか、オペレーティングシステムに応じてパッケージングシステムを介してインストールすることが含まれます。ハードウェアを機能ごとに分割することが重要です。

通常、クラスタ内の1つのマシンがNameNodeとして、別のマシンがResourceManagerとして排他的に指定されます。これらがマスターです。その他のサービス(WebアプリプロキシサーバーやMapReduceジョブヒストリーサーバーなど)は通常、負荷に応じて専用ハードウェアまたは共有インフラストラクチャのいずれかで実行されます。

クラスタ内の残りのマシンは、DataNodeとNodeManagerの両方として機能します。これらはワーカーです。

非セキュアモードでのHadoopの設定

HadoopのJava構成は、2種類の重要な構成ファイルによって駆動されます。

  • 読み取り専用のデフォルト構成 - core-default.xmlhdfs-default.xmlyarn-default.xml、および mapred-default.xml

  • サイト固有の構成 - etc/hadoop/core-site.xmletc/hadoop/hdfs-site.xmletc/hadoop/yarn-site.xml、および etc/hadoop/mapred-site.xml

さらに、etc/hadoop/hadoop-env.sh および etc/hadoop/yarn-env.sh を介してサイト固有の値を設定することにより、ディストリビューションの bin/ ディレクトリにあるHadoopスクリプトを制御できます。

Hadoopクラスタを構成するには、Hadoopデーモンが実行される environment と、Hadoopデーモンの configuration parameters を構成する必要があります。

HDFSデーモンは、NameNode、SecondaryNameNode、およびDataNodeです。YARNデーモンは、ResourceManager、NodeManager、およびWebAppProxyです。MapReduceを使用する場合は、MapReduceジョブヒストリーサーバーも実行されます。大規模なインストールでは、これらは通常、別々のホストで実行されます。

Hadoopデーモンの環境設定

管理者は、etc/hadoop/hadoop-env.sh およびオプションで etc/hadoop/mapred-env.sh および etc/hadoop/yarn-env.sh スクリプトを使用して、Hadoopデーモンのプロセス環境をサイト固有にカスタマイズする必要があります。

少なくとも、リモートノードごとに正しく定義されるように、JAVA_HOME を指定する必要があります。

管理者は、テーブルに示されている以下の構成オプションを使用して、個々のデーモンを構成できます。

デーモン 環境変数
NameNode HDFS_NAMENODE_OPTS
DataNode HDFS_DATANODE_OPTS
Secondary NameNode HDFS_SECONDARYNAMENODE_OPTS
ResourceManager YARN_RESOURCEMANAGER_OPTS
NodeManager YARN_NODEMANAGER_OPTS
WebAppProxy YARN_PROXYSERVER_OPTS
MapReduceジョブヒストリーサーバー MAPRED_HISTORYSERVER_OPTS

たとえば、NameNodeでparallelGCと4GBのJavaヒープを使用するように構成するには、hadoop-env.shに次のステートメントを追加する必要があります。

  export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4g"

その他の例については、etc/hadoop/hadoop-env.shを参照してください。

カスタマイズできるその他の便利な構成パラメーターには、以下が含まれます。

  • HADOOP_PID_DIR - デーモンのプロセスIDファイルが格納されるディレクトリ。
  • HADOOP_LOG_DIR - デーモンのログファイルが格納されるディレクトリ。ログファイルが存在しない場合は自動的に作成されます。
  • HADOOP_HEAPSIZE_MAX - Javaヒープサイズに使用する最大メモリ量。JVMでサポートされているユニットもここでサポートされます。ユニットが存在しない場合、数値はメガバイト単位であるとみなされます。デフォルトでは、HadoopはJVMに使用量を決定させます。この値は、上記の適切な _OPTS 変数を使用して、デーモンごとにオーバーライドできます。たとえば、HADOOP_HEAPSIZE_MAX=1g および HADOOP_NAMENODE_OPTS="-Xmx5g" を設定すると、NameNodeが5GBのヒープで構成されます。

ほとんどの場合、HADOOP_PID_DIR および HADOOP_LOG_DIR ディレクトリは、hadoopデーモンを実行するユーザーのみが書き込めるように指定する必要があります。そうしないと、シンボリックリンク攻撃の可能性があります。

また、HADOOP_HOME をシステム全体のシェル環境構成で構成するのが慣例です。たとえば、/etc/profile.d 内の単純なスクリプト。

  HADOOP_HOME=/path/to/hadoop
  export HADOOP_HOME

Hadoopデーモンの構成

このセクションでは、指定された構成ファイルで指定する重要なパラメーターについて説明します。

  • etc/hadoop/core-site.xml
パラメーター 注釈
fs.defaultFS NameNode URI hdfs://ホスト:ポート/
io.file.buffer.size 131072 SequenceFilesで使用される読み取り/書き込みバッファーのサイズ。
  • etc/hadoop/hdfs-site.xml

  • NameNodeの構成

パラメーター 注釈
dfs.namenode.name.dir NameNodeが名前空間とトランザクションログを永続的に格納するローカルファイルシステム上のパス。 これがディレクトリのカンマ区切りリストである場合、名前テーブルは冗長性のためにすべてのディレクトリに複製されます。
dfs.hosts / dfs.hosts.exclude 許可/除外されたDataNodeのリスト。 必要に応じて、これらのファイルを使用して、許可されるデータノードのリストを制御します。
dfs.blocksize 268435456 大規模なファイルシステムのHDFSブロックサイズは256MB。
dfs.namenode.handler.count 100 多数のDataNodeからのRPCを処理するためのNameNodeサーバーのスレッド数を増やします。
  • DataNodeの構成
パラメーター 注釈
dfs.datanode.data.dir DataNodeがそのブロックを格納するローカルファイルシステム上のパスのカンマ区切りリスト。 これがディレクトリのカンマ区切りリストである場合、データは通常異なるデバイス上のすべての名前付きディレクトリに格納されます。
  • etc/hadoop/yarn-site.xml

  • ResourceManagerとNodeManagerの構成

パラメーター 注釈
yarn.acl.enable true / false ACLを有効にするかどうか。デフォルトはfalseです。
yarn.admin.acl 管理者ACL クラスターの管理者を設定するためのACL。ACLは、カンマ区切りのユーザー、カンマ区切りのグループの形式です。デフォルトは特別な値である*で、これは誰でもアクセスできることを意味します。特別な値のスペースのみは、誰もアクセスできないことを意味します。
yarn.log-aggregation-enable false ログ集約を有効または無効にするための設定
  • ResourceManagerの設定
パラメーター 注釈
yarn.resourcemanager.address ジョブを送信するクライアント向けのResourceManagerホスト:ポート。 host:port 設定されている場合、yarn.resourcemanager.hostnameで設定されたホスト名をオーバーライドします。
yarn.resourcemanager.scheduler.address リソースを取得するためにApplicationMastersがSchedulerと通信するためのResourceManagerホスト:ポート。 host:port 設定されている場合、yarn.resourcemanager.hostnameで設定されたホスト名をオーバーライドします。
yarn.resourcemanager.resource-tracker.address NodeManager向けのResourceManagerホスト:ポート。 host:port 設定されている場合、yarn.resourcemanager.hostnameで設定されたホスト名をオーバーライドします。
yarn.resourcemanager.admin.address 管理コマンド向けのResourceManagerホスト:ポート。 host:port 設定されている場合、yarn.resourcemanager.hostnameで設定されたホスト名をオーバーライドします。
yarn.resourcemanager.webapp.address ResourceManager Web UIホスト:ポート。 host:port 設定されている場合、yarn.resourcemanager.hostnameで設定されたホスト名をオーバーライドします。
yarn.resourcemanager.hostname ResourceManagerホスト。 host すべてのyarn.resourcemanager*addressリソースを設定する代わりに設定できる単一のホスト名。ResourceManagerコンポーネントのデフォルトポートになります。
yarn.resourcemanager.scheduler.class ResourceManagerスケジューラークラス。 CapacityScheduler(推奨)、FairScheduler(こちらも推奨)、またはFifoScheduler。完全修飾クラス名(例:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler)を使用します。
yarn.scheduler.minimum-allocation-mb ResourceManagerで各コンテナリクエストに割り当てるメモリの最小制限。 MB単位
yarn.scheduler.maximum-allocation-mb ResourceManagerで各コンテナリクエストに割り当てるメモリの最大制限。 MB単位
yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path 許可/除外されるNodeManagerのリスト。 必要に応じて、これらのファイルを使用して、許可されるNodeManagerのリストを制御します。
  • NodeManagerの設定
パラメーター 注釈
yarn.nodemanager.resource.memory-mb 指定されたNodeManagerで利用可能な物理メモリ(MB単位)のリソース。 実行中のコンテナで利用可能になるNodeManagerの利用可能なリソースの合計を定義します
yarn.nodemanager.vmem-pmem-ratio タスクの仮想メモリ使用量が物理メモリを超えてもよい最大比率 各タスクの仮想メモリ使用量は、この比率で物理メモリ制限を超える場合があります。NodeManager上のタスクで使用される仮想メモリの合計量は、この比率で物理メモリ使用量を超える場合があります。
yarn.nodemanager.local-dirs 中間データが書き込まれるローカルファイルシステムのパスのカンマ区切りリスト。 複数のパスは、ディスクI/Oの分散に役立ちます。
yarn.nodemanager.log-dirs ログが書き込まれるローカルファイルシステムのパスのカンマ区切りリスト。 複数のパスは、ディスクI/Oの分散に役立ちます。
yarn.nodemanager.log.retain-seconds 10800 NodeManagerでログファイルを保持するデフォルト時間(秒単位)。ログ集約が無効になっている場合にのみ適用されます。
yarn.nodemanager.remote-app-log-dir /logs アプリケーションの完了時にアプリケーションログが移動されるHDFSディレクトリ。適切な権限を設定する必要があります。ログ集約が有効になっている場合にのみ適用されます。
yarn.nodemanager.remote-app-log-dir-suffix logs リモートログディレクトリに追加されるサフィックス。ログは${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}に集約されます。ログ集約が有効になっている場合にのみ適用されます。
yarn.nodemanager.aux-services mapreduce_shuffle Map Reduceアプリケーション用に設定する必要があるシャッフルサービス。
yarn.nodemanager.env-whitelist コンテナがNodeManagerから継承する環境プロパティ mapreduceアプリケーションの場合、デフォルト値に加えて、HADOOP_MAPRED_HOMEを追加する必要があります。プロパティ値は、JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOMEである必要があります
  • 履歴サーバーの設定(他の場所に移動する必要があります)
パラメーター 注釈
yarn.log-aggregation.retain-seconds -1 集約ログを削除する前に保持する時間。-1は無効にします。注意して、これを小さく設定しすぎると、ネームノードをスパムすることになります。
yarn.log-aggregation.retain-check-interval-seconds -1 集約されたログ保持のチェック間隔。0または負の値に設定すると、値は集約されたログ保持時間の1/10として計算されます。注意して、これを小さく設定しすぎると、ネームノードをスパムすることになります。
  • etc/hadoop/mapred-site.xml

  • MapReduceアプリケーションの設定

パラメーター 注釈
mapreduce.framework.name yarn Hadoop YARNに設定された実行フレームワーク。
mapreduce.map.memory.mb 1536 マップのより大きなリソース制限。
mapreduce.map.java.opts -Xmx1024M マップの子JVMのより大きなヒープサイズ。
mapreduce.reduce.memory.mb 3072 リデュースのより大きなリソース制限。
mapreduce.reduce.java.opts -Xmx2560M リデュースの子JVMのより大きなヒープサイズ。
mapreduce.task.io.sort.mb 512 効率のためにデータをソートする際のより高いメモリ制限。
mapreduce.task.io.sort.factor 100 ファイルをソートする際に一度にマージされるストリームを増やします。
mapreduce.reduce.shuffle.parallelcopies 50 非常に多数のマップから出力をフェッチするためにリデュースによって実行される並列コピーの数を増やします。
  • MapReduce JobHistory Serverの設定
パラメーター 注釈
mapreduce.jobhistory.address MapReduce JobHistory Serverホスト:ポート デフォルトポートは10020です。
mapreduce.jobhistory.webapp.address MapReduce JobHistory Server Web UIホスト:ポート デフォルトポートは19888です。
mapreduce.jobhistory.intermediate-done-dir /mr-history/tmp 履歴ファイルがMapReduceジョブによって書き込まれるディレクトリ。
mapreduce.jobhistory.done-dir /mr-history/done 履歴ファイルがMR JobHistory Serverによって管理されるディレクトリ。

NodeManagerのヘルスモニタリング

Hadoopは、管理者がNodeManagerを構成して、ノードが正常かどうかを判断するために管理者提供のスクリプトを定期的に実行するメカニズムを提供します。

管理者は、スクリプトで任意のチェックを実行することにより、ノードが正常な状態にあるかどうかを判断できます。スクリプトがノードが異常な状態にあることを検出した場合、標準出力に文字列ERRORで始まる行を出力する必要があります。NodeManagerはスクリプトを定期的にスポーンし、その出力をチェックします。スクリプトの出力に上記の文字列ERRORが含まれている場合、ノードのステータスは異常として報告され、ノードはResourceManagerによってブラックリストに登録されます。これ以上のタスクはこのノードに割り当てられません。ただし、NodeManagerはスクリプトの実行を継続するため、ノードが再び正常になった場合、ResourceManagerのブラックリストから自動的に削除されます。ノードのヘルス状態は、異常な場合はスクリプトの出力とともに、ResourceManager Webインターフェースで管理者が利用できます。ノードが正常になってからの時間もWebインターフェースに表示されます。

次のパラメータを使用して、etc/hadoop/yarn-site.xmlでノードヘルス監視スクリプトを制御できます。

パラメーター 注釈
yarn.nodemanager.health-checker.script.path ノードヘルススクリプト ノードのヘルス状態をチェックするスクリプト。
yarn.nodemanager.health-checker.script.opts ノードヘルススクリプトオプション ノードのヘルス状態をチェックするスクリプトのオプション。
yarn.nodemanager.health-checker.interval-ms ノードヘルススクリプトの間隔 ヘルススクリプトを実行する時間間隔。
yarn.nodemanager.health-checker.script.timeout-ms ノードヘルススクリプトのタイムアウト間隔 ヘルススクリプトの実行のタイムアウト。

ローカルディスクの一部のみが不良になった場合、ヘルスチェッカースクリプトはERRORを出力するべきではありません。NodeManagerには、ローカルディスク(特にnodemanager-local-dirsおよびnodemanager-log-dirsをチェック)のヘルス状態を定期的にチェックする機能があり、設定プロパティyarn.nodemanager.disk-health-checker.min-healthy-disksに設定された値に基づいて不良ディレクトリの数しきい値に達した後、ノード全体が異常としてマークされ、この情報もリソースマネージャーに送信されます。ブートディスクはRAIDされるか、ブートディスクの障害はヘルスチェッカースクリプトによって識別されます。

スレーブファイル

etc/hadoop/workersファイルに、すべてのワーカーホスト名またはIPアドレスを1行に1つずつリストします。ヘルパースクリプト(下記を参照)は、etc/hadoop/workersファイルを使用して、一度に多くのホストでコマンドを実行します。これは、JavaベースのHadoop構成には使用されません。この機能を使用するには、Hadoopの実行に使用されるアカウントに対して、sshトラスト(パスフレーズなしのsshまたはKerberosなどの他の手段)を確立する必要があります。

Hadoopラック認識

多くのHadoopコンポーネントはラックを認識しており、パフォーマンスと安全のためにネットワークトポロジを利用します。Hadoopデーモンは、管理者が構成したモジュールを呼び出すことによって、クラスター内のワーカーのラック情報を取得します。詳細については、ラック認識のドキュメントを参照してください。

HDFSを起動する前に、ラック認識を構成することを強くお勧めします。

ロギング

Hadoopは、ロギングにApache Commons Loggingフレームワークを介してApache log4jを使用します。etc/hadoop/log4j.propertiesファイルを編集して、Hadoopデーモンのロギング構成(ログ形式など)をカスタマイズします。

Hadoopクラスターの操作

必要なすべての構成が完了したら、ファイルをすべてのマシン上のHADOOP_CONF_DIRディレクトリに配布します。これは、すべてのマシンで同じディレクトリである必要があります。

一般に、HDFSとYARNは別々のユーザーとして実行することをお勧めします。ほとんどのインストールでは、HDFSプロセスは「hdfs」として実行されます。YARNは通常、「yarn」アカウントを使用しています。

Hadoopの起動

Hadoopクラスターを起動するには、HDFSとYARNクラスターの両方を起動する必要があります。

HDFSを初めて起動するときは、フォーマットする必要があります。新しい分散ファイルシステムをhdfsとしてフォーマットします

[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format

指定されたノードでhdfsとして次のコマンドを使用して、HDFS NameNodeを起動します

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode

指定された各ノードでhdfsとして次のコマンドを使用して、HDFS DataNodeを起動します

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode

etc/hadoop/workersとsshの信頼されたアクセスが構成されている場合(シングルノードセットアップを参照)、すべてのHDFSプロセスをユーティリティスクリプトで起動できます。hdfsとして

[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh

指定されたResourceManagerでyarnとして実行される次のコマンドを使用して、YARNを起動します

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager

指定された各ホストでyarnとしてNodeManagerを起動するスクリプトを実行します

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager

スタンドアロンWebAppProxyサーバーを起動します。WebAppProxyサーバーでyarnとして実行します。ロードバランシングで複数のサーバーが使用されている場合は、それらの各サーバーで実行する必要があります

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver

etc/hadoop/workers が設定され、SSH信頼アクセスが構成されている場合(シングルノードセットアップを参照)、すべてのYARNプロセスはユーティリティスクリプトで開始できます。yarn として実行します。

[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh

MapReduce JobHistory Server を開始するには、指定されたサーバーで mapred として次のコマンドを実行します。

[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver

Hadoop のシャットダウン

NameNode を停止するには、指定された NameNode で hdfs として次のコマンドを実行します。

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode

DataNode を停止するスクリプトを hdfs として実行します。

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode

etc/hadoop/workers が設定され、SSH信頼アクセスが構成されている場合(シングルノードセットアップを参照)、すべてのHDFSプロセスはユーティリティスクリプトで停止できます。hdfs として実行します。

[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh

ResourceManager を停止するには、指定された ResourceManager で yarn として次のコマンドを実行します。

[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager

ワーカー上の NodeManager を停止するスクリプトを yarn として実行します。

[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager

etc/hadoop/workers が設定され、SSH信頼アクセスが構成されている場合(シングルノードセットアップを参照)、すべてのYARNプロセスはユーティリティスクリプトで停止できます。yarn として実行します。

[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh

WebAppProxyサーバーを停止します。WebAppProxyサーバー上で yarn として実行します。ロードバランシングで複数のサーバーを使用している場合は、それぞれのサーバーで実行する必要があります。

[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver

MapReduce JobHistory Server を停止するには、指定されたサーバーで mapred として次のコマンドを実行します。

[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver

Webインターフェース

Hadoopクラスタが起動して実行されたら、以下に説明するようにコンポーネントのWeb UIを確認してください。

デーモン Webインターフェース 注釈
NameNode http://nn_host:port/ デフォルトのHTTPポートは9870です。
ResourceManager http://rm_host:port/ デフォルトのHTTPポートは8088です。
MapReduce JobHistory Server http://jhs_host:port/ デフォルトのHTTPポートは19888です。