このガイドでは、YARN の ResourceManager の高可用性について概要を説明し、この機能を構成および使用する方法について詳しく説明します。 ResourceManager (RM) は、クラスタ内のリソースを追跡し、アプリケーション (MapReduce ジョブなど) をスケジューリングする役割を担います。 Hadoop 2.4 より前は、ResourceManager は YARN クラスタにおける単一障害点でした。高可用性機能は、アクティブ/スタンバイ ResourceManager ペアの形で冗長性を追加し、この単一障害点を解消します。
ResourceManager HA は、アクティブ/スタンバイアーキテクチャによって実現されます。常に、RM の 1 つがアクティブであり、1 つ以上の RM がスタンバイモードで、アクティブに障害が発生した場合に引き継ぐのを待機しています。アクティブへの移行のトリガーは、管理者 (CLI 経由) または自動フェールオーバーが有効な場合に統合フェールオーバーコントローラーから発信されます。
自動フェールオーバーが有効になっていない場合、管理者は RM の 1 つをアクティブに手動で切り替える必要があります。ある RM から別の RM にフェールオーバーするには、最初にアクティブ RM をスタンバイに移行し、スタンバイ RM をアクティブに移行する必要があります。これはすべて、「yarn rmadmin
」CLI を使用して実行できます。
RM には、Zookeeper ベースの ActiveStandbyElector を組み込んで、どの RM をアクティブにするかを決定するオプションがあります。アクティブがダウンまたは応答しなくなると、別の RM が自動的にアクティブに選択され、引き継ぎます。HDFS の場合のように個別の ZKFCデーモンを実行する必要はありません。RM に組み込まれた ActiveStandbyElector が、個別の ZKFCデーモンの代わりに障害検出器とリーダーセレクターとして機能するためです。
複数の RM がある場合、クライアントとノードで使用される構成 (yarn-site.xml) には、すべての RM がリストされている必要があります。クライアント、ApplicationMaster (AM)、および NodeManager (NM) は、アクティブ RM に到達するまで、ラウンドロビン方式で RM への接続を試みます。アクティブがダウンした場合、「新しい」アクティブに到達するまでラウンドロビンポーリングを再開します。このデフォルトの再試行ロジックは、org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider
として実装されています。 org.apache.hadoop.yarn.client.RMFailoverProxyProvider
を実装し、yarn.client.failover-proxy-provider
の値をクラス名に設定することで、ロジックをオーバーライドできます。非 HA モードで実行する場合は、代わりに yarn.client.failover-no-ha-proxy-provider
の値を設定します。
ResourceManager の再起動が有効になっている場合、アクティブ状態に昇格された RM は RM の内部状態をロードし、RM の再起動機能に応じて、以前のアクティブが中断したところから可能な限り操作を続行します。以前に RM に送信された各管理対象アプリケーションに対して、新しい試行が生成されます。アプリケーションは定期的にチェックポイントを設定して、作業の損失を防ぐことができます。状態ストアは、アクティブ/スタンバイ RM の両方から見える必要があります。現在、永続性のための RMStateStore 実装は 2 つあります。FileSystemRMStateStore と ZKRMStateStore です。 ZKRMStateStore
は、暗黙的に任意の時点で単一の RM への書き込みアクセスを許可するため、HA クラスタで使用するために推奨されるストアです。 ZKRMStateStore を使用する場合、複数の RM がアクティブロールを想定できる潜在的なスプリットブレイン状況に対処するために、個別のフェンシングメカニズムは必要ありません。 ZKRMStateStore を使用する場合、Zookeeper 管理者が YARN アプリケーション/ユーザーの資格情報にアクセスできないようにするために、「zookeeper.DigestAuthenticationProvider.superDigest
」プロパティを Zookeeper クラスタに設定しないことをお勧めします。
フェールオーバー機能のほとんどは、さまざまな構成プロパティを使用して調整可能です。以下は、必須/重要なもののリストです。 yarn-default.xml には、すべてのノブのリストが含まれています。デフォルト値を含む詳細については、yarn-default.xml を参照してください。状態ストアのセットアップ手順については、ResourceManager の再起動のドキュメントも参照してください。
構成プロパティ | 説明 |
---|---|
hadoop.zk.address |
ZK-クォーラムのアドレス。状態ストアと組み込みリーダー選出の両方で使用されます。 |
yarn.resourcemanager.ha.enabled |
RM HA を有効にします。 |
yarn.resourcemanager.ha.rm-ids |
RM の論理 ID のリスト。例: 「rm1,rm2」。 |
yarn.resourcemanager.hostname. rm-id |
各 rm-id に対して、RM が対応するホスト名を指定します。あるいは、各 RM のサービスアドレスを設定することもできます。 |
yarn.resourcemanager.address. rm-id |
各 rm-id に対して、クライアントがジョブを送信するための host:port を指定します。設定されている場合、yarn.resourcemanager.hostname. rm-id に設定されているホスト名をオーバーライドします。 |
yarn.resourcemanager.scheduler.address. rm-id |
各 rm-id に対して、ApplicationMaster がリソースを取得するためのスケジューラ host:port を指定します。設定されている場合、yarn.resourcemanager.hostname. rm-id に設定されているホスト名をオーバーライドします。 |
yarn.resourcemanager.resource-tracker.address. rm-id |
各 rm-id に対して、NodeManager が接続するための host:port を指定します。設定されている場合、yarn.resourcemanager.hostname. rm-id に設定されているホスト名をオーバーライドします。 |
yarn.resourcemanager.admin.address. rm-id |
各 rm-id に対して、管理コマンド用の host:port を指定します。設定されている場合、yarn.resourcemanager.hostname. rm-id に設定されているホスト名をオーバーライドします。 |
yarn.resourcemanager.webapp.address. rm-id |
各 rm-id に対して、RM Web アプリケーションが対応する host:port を指定します。 yarn.http.policy を HTTPS_ONLY に設定した場合、これは必要ありません。設定されている場合、yarn.resourcemanager.hostname. rm-id に設定されているホスト名をオーバーライドします。 |
yarn.resourcemanager.webapp.https.address. rm-id |
各 rm-id に対して、RM https Web アプリケーションが対応する host:port を指定します。 yarn.http.policy を HTTP_ONLY に設定した場合、これは必要ありません。設定されている場合、yarn.resourcemanager.hostname. rm-id に設定されているホスト名をオーバーライドします。 |
yarn.resourcemanager.ha.id |
アンサンブル内の RM を識別します。これはオプションです。ただし、設定されている場合、管理者はすべての RM が構成に独自の ID を持っていることを確認する必要があります。 |
yarn.resourcemanager.ha.automatic-failover.enabled |
自動フェールオーバーを有効にします。デフォルトでは、HA が有効になっている場合にのみ有効になります。 |
yarn.resourcemanager.ha.automatic-failover.embedded |
自動フェールオーバーが有効になっている場合、組み込みリーダーセレクターを使用してアクティブ RM を選択します。デフォルトでは、HA が有効になっている場合にのみ有効になります。 |
yarn.resourcemanager.cluster-id |
クラスタを識別します。セレクターによって使用され、RM が別のクラスタのアクティブとして引き継がないようにします。 |
yarn.client.failover-proxy-provider |
クライアント、AM、および NM がアクティブ RM にフェールオーバーするために使用されるクラス。 |
yarn.client.failover-no-ha-proxy-provider |
HA モードで実行されていない場合に、クライアント、AM、および NM がアクティブ RM にフェールオーバーするために使用されるクラス |
yarn.client.failover-max-attempts |
FailoverProxyProvider がフェールオーバーを試行する最大回数。 |
yarn.client.failover-sleep-base-ms |
フェールオーバー間の指数関数的な遅延を計算するために使用されるスリープベース(ミリ秒単位)。 |
yarn.client.failover-sleep-max-ms |
フェールオーバー間の最大スリープ時間(ミリ秒単位)。 |
yarn.client.failover-retries |
ResourceManagerへの接続試行ごとの再試行回数。 |
yarn.client.failover-retries-on-socket-timeouts |
ソケットタイムアウト時にResourceManagerへの接続試行ごとの再試行回数。 |
RM フェールオーバーの最小限のセットアップ例を以下に示します。
<property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster1</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>master1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>master2</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>master1:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>master2:8088</value> </property> <property> <name>hadoop.zk.address</name> <value>zk1:2181,zk2:2181,zk3:2181</value> </property>
yarn rmadmin
には、RM のヘルス/状態を確認し、アクティブ/スタンバイに移行するための、HA 固有のコマンドオプションがいくつかあります。HA 用のコマンドは、yarn.resourcemanager.ha.rm-ids
で設定された RM のサービス ID を引数として取ります。
$ yarn rmadmin -getServiceState rm1 active $ yarn rmadmin -getServiceState rm2 standby
自動フェールオーバーが有効になっている場合、手動遷移コマンドを使用することはできません。ただし、–forcemanual フラグを使用することでこれをオーバーライドできますが、注意が必要です。
$ yarn rmadmin -transitionToStandby rm1 Automatic failover is enabled for org.apache.hadoop.yarn.client.RMHAServiceTarget@1d8299fd Refusing to manually manage HA state, since it may cause a split-brain scenario or other incorrect state. If you are very sure you know what you are doing, please specify the forcemanual flag.
詳細は、Yarnコマンド を参照してください。
スタンバイ RM が起動して実行されている場合、スタンバイは「About」ページを除くすべての Web リクエストをアクティブに自動的にリダイレクトします。
スタンバイ RM が起動して実行されている場合、スタンバイ RM で呼び出された ResourceManager REST API で説明されている RM Web サービスは、アクティブ RM に自動的にリダイレクトされます。
ロードバランサー(例:Azure または AWS)の背後で ResourceManager のセットを実行し、ロードバランサーがアクティブな RM を指すようにしたい場合は、/isActive HTTP エンドポイントをヘルスプローブとして使用できます。http://RM_HOSTNAME/isActive は、RM がアクティブな HA 状態にある場合は 200 ステータスコードレスポンスを返し、それ以外の場合は 405 を返します。