ZooKeeper をベースにした Hadoop 高可用性クラスタの構築のチュートリアル図

ZooKeeper をベースにした Hadoop 高可用性クラスタの構築のチュートリアル図

1. 高可用性の概要

Hadoop High Availability は、HDFS High Availability と YARN High Availability に分かれています。この 2 つの実装は基本的に似ていますが、HDFS NameNode は YARN ResourceManager よりもデータ ストレージと一貫性の要件がはるかに高いため、実装もより複雑になります。そのため、最初に説明します。

1.1 可用性の高い全体アーキテクチャ

HDFS の高可用性アーキテクチャは次のとおりです。

画像ソース: https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-high-availability/

HDFS 高可用性アーキテクチャは、主に次のコンポーネントで構成されています。

アクティブ ネームノードとスタンバイ ネームノード: 2 つのネームノードが相互バックアップを形成します。1 つはアクティブ状態でプライマリ ネームノードとなり、もう 1 つはスタンバイ状態でバックアップ ネームノードとなります。プライマリ ネームノードのみが外部に対して読み取りおよび書き込みサービスを提供できます。

  • アクティブ/スタンバイ切り替えコントローラ ZKFailoverController: ZKFailoverController は独立したプロセスとして実行され、NameNode のアクティブ/スタンバイ切り替えの全体的な制御を実行します。 ZKFailoverController は、NameNode のヘルス状態を適時に検出し、マスター NameNode に障害が発生した場合に Zookeeper を使用して自動マスター/スレーブ選択と切り替えを実装できます。もちろん、NameNode は現在、Zookeeper に依存しない手動のマスター/スレーブ切り替えもサポートしています。
  • Zookeeper クラスター: マスター/スレーブ スイッチ コントローラーのマスター/スレーブ選択のサポートを提供します。共有ストレージ システム: 共有ストレージ システムは、NameNode の高可用性を実現するために最も重要な部分です。共有ストレージ システムは、動作中に NameNode によって生成された HDFS メタデータを保存します。
  • プライマリ NameNode と NameNode は、共有ストレージ システムを通じてメタデータを同期します。マスター/スレーブ切り替えを実行する場合、新しいマスター NameNode は、メタデータが完全に同期されていることを確認した後でのみ、サービスを引き続き提供できます。
  • DataNode: 共有ストレージ システムを通じて HDFS メタデータ情報を共有することに加えて、プライマリ NameNode とバックアップ NameNode は、HDFS データ ブロックと DataNode 間のマッピング関係も共有する必要があります。
  • DataNode は、データ ブロックの場所情報をプライマリ NameNode とバックアップ NameNode の両方に報告します。

1.2 QJMに基づく共有ストレージシステムのデータ同期メカニズムの分析

現在、Hadoop は、共有ストレージ システムとして Quorum Journal Manager (QJM) または Network File System (NFS) の使用をサポートしています。ここでは、QJM クラスターを例として使用します。アクティブ NameNode は最初に EditLog を JournalNode クラスターに送信し、次にスタンバイ NameNode は定期的に JournalNode クラスターから EditLog を同期します。アクティブ NameNode がダウンすると、スタンバイ NameNode はメタデータが完全に同期されていることを確認した後、外部サービスを提供できます。

JournalNode クラスターへの EditLog の書き込みは、「エントリの半分以上が書き込まれたら成功」という戦略に従うため、少なくとも 3 つの JournalNode ノードが必要であることに注意してください。もちろん、ノードの数を増やし続けることもできますが、ノードの合計数は奇数である必要があります。同時に、ジャーナルノードが 2N+1 個ある場合、多数決書き込みの原則に従って、最大 N 個のジャーナルノードの障害を許容できます。

1.3 NameNode アクティブ/スタンバイ スイッチオーバー

NameNode がアクティブ/スタンバイ切り替えを実装するプロセスを次の図に示します。

HealthMonitor は初期化された後、内部スレッドを開始し、NameNode に対応する HAServiceProtocol RPC インターフェースのメソッドを定期的に呼び出して、NameNode のヘルス状態を検出します。

HealthMonitor は、NameNode のヘルス ステータスが変化したことを検出すると、処理のために ZKFailoverController によって登録された対応するメソッドをコールバックします。

ZKFailoverController は、アクティブ/スタンバイの切り替えが必要であると判断した場合、まず ActiveStandbyElector を使用してアクティブ/スタンバイ ノードを自動的に選択します。

ActiveStandbyElector は Zookeeper と対話して、自動マスター/スレーブ選択を完了します。

マスター/スレーブの選出が完了すると、ActiveStandbyElector は ZKFailoverController の対応するメソッドをコールバックして、現在の NameNode がマスター NameNode またはスタンバイ NameNode になるように通知します。

ZKFailoverController は、対応する NameNode の HAServiceProtocol RPC インターフェースのメソッドを呼び出して、NameNode をアクティブ状態またはスタンバイ状態に変換します。

1.4 YARN 高可用性

YARN ResourceManager の高可用性は HDFS NameNode と似ていますが、NameNode とは異なり、ResourceManager には維持するメタデータ情報がそれほど多くないため、そのステータス情報は Zookeeper に直接書き込まれ、マスター/スレーブの選択は Zookeeper に依存できます。

2. クラスター計画

高可用性の設計目標によれば、少なくとも 2 つの NameNode (1 つはアクティブ、もう 1 つはスタンバイ) と 2 つの ResourceManager (1 つはアクティブ、もう 1 つはスタンバイ) が存在する必要があります。同時に、「書き込みの半分以上が成功する」という原則を満たすには、少なくとも 3 つの JournalNode ノードが必要です。ここでは 3 つのホストが構築に使用され、クラスター計画は次のようになります。

3. 前提条件 すべてのサーバーに JDK がインストールされていること。インストール手順については、「 Linux での JDK のインストール」および「ZooKeeper クラスターのセットアップ」を参照してください。構築手順については、 「Zookeeper スタンドアロン環境」および「クラスター環境の構築」を参照してください。すべてのサーバー間で SSH パスワードフリー ログインが構成されています。

4. クラスタ構成

4.1 ダウンロードして解凍する

Hadoop をダウンロードします。ここで Hadoop の CDH バージョンをダウンロードしました。ダウンロード アドレスは次のとおりです: http://archive.cloudera.com/cdh5/cdh/5/

# tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz

4.2 環境変数を設定する

profileファイルを編集します。

# vim /etc/profile

次の構成を追加します。

export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2export PATH=${HADOOP_HOME}/bin:$PATH

設定をすぐに有効にするには、 sourceコマンドを実行します。

 # source /etc/profile

4.3 構成の変更

${HADOOP_HOME}/etc/hadoopディレクトリに移動し、設定ファイルを変更します。各設定ファイルの内容は次のとおりです。

1. hadoop-env.sh

 # 指定JDK的安裝位置export JAVA_HOME=/usr/java/jdk1.8.0_201/

2. コアサイト.xml

<構成>
 <プロパティ>
 <!-- ネームノードの HDFS プロトコル ファイル システムの通信アドレスを指定します -->
 <name>fs.defaultFS</name>
 <値>hdfs://hadoop001:8020</値>
 </プロパティ>
 <プロパティ>
 <!-- Hadoop クラスターが一時ファイルを保存するディレクトリを指定します -->
 <name>hadoop.tmp.dir</name>
 <値>/home/hadoop/tmp</値>
 </プロパティ>
 <プロパティ>
 <!-- ZooKeeper クラスターのアドレス -->
 <name>ha.zookeeper.quorum</name>
 <値>hadoop001:2181、hadoop002:2181、hadoop002:2181</値>
 </プロパティ>
 <プロパティ>
 <!-- ZKFC が ZooKeeper に接続してタイムアウト -->
 <name>ha.zookeeper.session-timeout.ms</name>
 <値>10000</値>
 </プロパティ>
</構成>

3. hdfs-site.xml

<構成>
 <プロパティ>
 <!-- HDFS レプリカの数を指定します -->
 <name>dfs.replication</name>
 <値>3</値>
 </プロパティ>
 <プロパティ>
 <!-- ネームノード ノード データ (メタデータなど) の保存場所。フォールト トレランスを実現するために複数のディレクトリを指定できます。複数のディレクトリはカンマで区切られます。 -->
 <name>dfs.namenode.name.dir</name>
 <値>/home/hadoop/namenode/data</値>
 </プロパティ>
 <プロパティ>
 <!-- データノード ノード データ (つまりデータ ブロック) の保存場所 -->
 <name>dfs.datanode.data.dir</name>
 <値>/home/hadoop/datanode/data</値>
 </プロパティ>
 <プロパティ>
 <!-- クラスター サービスの論理名 -->
 <name>dfs.nameservices</name>
 <値>mycluster</値>
 </プロパティ>
 <プロパティ>
 <!-- NameNode ID リスト -->
 <name>dfs.ha.namenodes.mycluster</name>
 <値>nn1,nn2</値>
 </プロパティ>
 <プロパティ>
 <!-- nn1 の RPC 通信アドレス -->
 <name>dfs.namenode.rpc-address.mycluster.nn1</name>
 <値>hadoop001:8020</値>
 </プロパティ>
 <プロパティ>
 <!-- nn2 の RPC 通信アドレス -->
 <name>dfs.namenode.rpc-address.mycluster.nn2</name>
 <値>hadoop002:8020</値>
 </プロパティ>
 <プロパティ>
 <!-- nn1 の http 通信アドレス -->
 <name>dfs.namenode.http-address.mycluster.nn1</name>
 <値>hadoop001:50070</値>
 </プロパティ>
 <プロパティ>
 <!-- nn2 の http 通信アドレス -->
 <name>dfs.namenode.http-address.mycluster.nn2</name>
 <値>hadoop002:50070</値>
 </プロパティ>
 <プロパティ>
 <!-- JournalNode 上の NameNode メタデータの共有ストレージ ディレクトリ -->
 <name>dfs.namenode.shared.edits.dir</name>
 <値>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</値>
 </プロパティ>
 <プロパティ>
 <!-- ジャーナル編集ファイルの保存ディレクトリ -->
 <name>dfs.journalnode.edits.dir</name>
 <値>/home/hadoop/journalnode/data</値>
 </プロパティ>
 <プロパティ>
 <!-- 分離メカニズムを構成して、常に 1 つの NameNode のみがアクティブになるようにします -->
 <name>dfs.ha.fencing.methods</name>
 <値>sshfence</値>
 </プロパティ>
 <プロパティ>
 <!-- sshfence メカニズムを使用する場合は SSH パスワードなしのログインが必要です -->
 <name>dfs.ha.fencing.ssh.秘密鍵ファイル</name>
 <値>/root/.ssh/id_rsa</値>
 </プロパティ>
 <プロパティ>
 <!-- SSH タイムアウト -->
 <name>dfs.ha.fencing.ssh.connect-timeout</name>
 <値>30000</値>
 </プロパティ>
 <プロパティ>
 <!-- アクセス プロキシ クラス。現在アクティブ状態にある NameNode を判別するために使用されます -->
 <name>dfs.client.failover.proxy.provider.mycluster</name>
 <値>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</値>
 </プロパティ>
 <プロパティ>
 <!-- 自動フェイルオーバーを有効にする -->
 <name>dfs.ha.automatic-failover.enabled</name>
 <値>真</値>
 </プロパティ>
</構成>

4. 糸サイト.xml

<構成>
 <プロパティ>
 <!--NodeManager で実行される補助サービスを設定します。 MapReduce プログラムは、mapreduce_shuffle が設定された後にのみ Yarn 上で実行できます。 -->
 <name>yarn.nodemanager.aux-services</name>
 <値>mapreduce_shuffle</値>
 </プロパティ>
 <プロパティ>
 <!-- ログ集約を有効にするかどうか (オプション) -->
 <name>yarn.log-aggregation-enable</name>
 <値>真</値>
 </プロパティ>
 <プロパティ>
 <!-- ログ保存時間の集計 (オプション) -->
 <name>yarn.log-aggregation.retain-seconds</name>
 <値>86400</値>
 </プロパティ>
 <プロパティ>
 <!-- RM HA を有効にする -->
 <name>yarn.resourcemanager.ha.enabled</name>
 <値>真</値>
 </プロパティ>
 <プロパティ>
 <!-- RM クラスター識別子 -->
 <name>yarn.resourcemanager.cluster-id</name>
 <value>my-yarn-cluster</value>
 </プロパティ>
 <プロパティ>
 <!-- RM 論理 ID リスト -->
 <name>yarn.resourcemanager.ha.rm-ids</name>
 <値>rm1,rm2</値>
 </プロパティ>
 <プロパティ>
 <!-- RM1 サービス アドレス -->
 <name>yarn.resourcemanager.hostname.rm1</name>
 <値>hadoop002</値>
 </プロパティ>
 <プロパティ>
 <!-- RM2 サービス アドレス -->
 <name>yarn.resourcemanager.hostname.rm2</name>
 <値>hadoop003</値>
 </プロパティ>
 <プロパティ>
 <!-- RM1 Web アプリケーションのアドレス -->
 <name>yarn.resourcemanager.webapp.address.rm1</name>
 <値>hadoop002:8088</値>
 </プロパティ>
 <プロパティ>
 <!-- RM2 Web アプリケーションのアドレス -->
 <name>yarn.resourcemanager.webapp.address.rm2</name>
 <値>hadoop003:8088</値>
 </プロパティ>
 <プロパティ>
 <!-- ZooKeeper クラスターのアドレス -->
 <name>yarn.resourcemanager.zk-address</name>
 <値>hadoop001:2181、hadoop002:2181、hadoop003:2181</値>
 </プロパティ>
 <プロパティ>
 <!-- 自動回復を有効にする -->
 <name>yarn.resourcemanager.recovery.enabled</name>
 <値>真</値>
 </プロパティ>
 <プロパティ>
 <!-- 永続ストレージのクラス-->
 <name>yarn.resourcemanager.store.class</name>
 <値>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</値>
 </プロパティ>
</構成>

5. mapred-site.xml

<構成>
 <プロパティ>
 <!--YARN で実行する MapReduce ジョブを指定します-->
 <name>mapreduce.framework.name</name>
 <value>糸</value>
 </プロパティ>
</構成>

5. 奴隷

すべてのスレーブ ノードのホスト名または IP アドレスを 1 行に 1 つずつ設定します。すべてのスレーブ ノードでDataNodeサービスとNodeManagerサービスが開始されます。

翻訳:
翻訳:
翻訳:

4.4 配布手順

Hadoop インストール パッケージを他の 2 台のサーバーに配布します。配布後、2 台のサーバーで Hadoop 環境変数を構成することをお勧めします。

# インストールパッケージをhadoop002に配布する
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop002:/usr/app/
# インストールパッケージをhadoop003に配布する
scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop003:/usr/app/

5.1 ZooKeeperを起動する

3 つのサーバーでそれぞれ ZooKeeper サービスを開始します。

 zkServer.sh start

5.2 ジャーナルノードを起動する

3 つのサーバーのそれぞれの${HADOOP_HOME}/sbinディレクトリに移動し、 journalnodeプロセスを開始します。

 hadoop-daemon.sh start journalnode

5.3 NameNodeの初期化

hadop001NameNode初期化コマンドを実行します。

hdfs namenode -format

初期化コマンドを実行した後、 NameNodeメタデータ ディレクトリの内容を他のフォーマットされていないNameNodeにコピーする必要があります。メタデータ ストレージ ディレクトリはhdfs-site.xmldfs.namenode.name.dirプロパティを使用して指定したディレクトリです。ここで、これをhadoop002にコピーする必要があります。

 scp -r /home/hadoop/namenode/data hadoop002:/home/hadoop/namenode/

5.4 HAステータスの初期化

ZooKeeper の HA 状態を初期化するには、任意のNameNodeで次のコマンドを使用します。

 hdfs zkfc -formatZK

5.5 HDFSを起動する

hadoop001${HADOOP_HOME}/sbinディレクトリに移動し、HDFS を起動します。この時点で、 hadoop001hadoop002上のNameNodeサービスと、3 つのサーバー上のDataNodeサービスが開始されます。

 start-dfs.sh

5.6 YARNの起動

hadoop002${HADOOP_HOME}/sbinディレクトリに移動し、YARN を起動します。この時点で、 hadoop002上のResourceManagerサービスと 3 つのサーバー上のNodeManagerサービスが起動します。

 start-yarn.sh

hadoop003上のResourceManagerサービスは通常この時点では開始されていないため、手動で開始する必要があることに注意してください。

 yarn-daemon.sh start resourcemanager

6. クラスターを表示する

6.1 プロセスの表示

起動が成功すると、各サーバーのプロセスは次のようになります。

[root@hadoop001 sbin]# jps
4512 DFSZKフェールオーバーコントローラ
3714 ジャーナルノード
4114 ネームノード
3668 クォーラムピアメイン
5012 データノード
4639 ノードマネージャー
[root@hadoop002 sbin]# jps
4499 リソースマネージャー
4595 ノードマネージャー
3465 クォーラムピアメイン
3705 ネームノード
3915 DFSZKフェールオーバーコントローラ
5211 データノード
3533 ジャーナルノード
[root@hadoop003 sbin]# jps
3491 ジャーナルノード
3942 ノードマネージャー
4102 リソースマネージャー
4201 データノード
3435 クォーラムピアメイン

6.2 Web UIを表示する

HDFS と YARN のポート番号はそれぞれ500708080です。インターフェースは次のようになります。

現時点では、hadoop001 上のNameNode利用可能な状態です。

hadoop002 上のNameNodeはスタンバイ状態です。



hadoop002 のResourceManager利用可能な状態です:



hadoop003 上のResourceManagerスタンバイ状態です。



同時に、インターフェースにはJournal Managerに関する関連情報も表示されます。


7. クラスターの二次起動

上記のクラスターの初期起動には、いくつかの必要な初期化操作が含まれるため、プロセスは少し面倒です。ただし、クラスターが構築されたら、再度有効にすると便利です。手順は次のとおりです (まず ZooKeeper クラスターが起動していることを確認します)。

hadoop001で HDFS を起動します。この時点で、NameNode、DataNode、JournalNode を含む、HDFS の高可用性に関連するすべてのサービスが起動されます。

 start-dfs.sh

hadoop002で YARN を起動します:

 start-yarn.sh

この時点では、 hadoop003上のResourceManagerサービスは通常は開始されていないため、手動で開始する必要があります。

 yarn-daemon.sh start resourcemanager

参考文献

上記の構築手順は主に公式ドキュメントから参照されています。

クォーラムジャーナルマネージャを使用したHDFSの高可用性ResourceManagerの高可用性

要約する

上記は、ZooKeeper をベースにした Hadoop 高可用性クラスターを構築する方法に関するチュートリアルです。お役に立てれば幸いです。ご質問がある場合は、メッセージを残していただければ、すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • Tencent Cloud 上で Hadoop 3.x 疑似クラスターを構築する方法を説明します
  • Hadoop 分散クラスターを構築するための方法と手順
  • Ubuntu DockerでHadoopクラスタ環境を構築する方法
  • Docker を使用した Hadoop および HBase クラスターの構築の詳細な説明
  • Ubuntu版Hadoopクラスタ構築の詳細な説明
  • Dockerを使用してHadoopクラスタ環境をゼロから素早く構築する方法を詳しく説明します
  • Docker を使用して Hadoop 分散クラスターを構築する方法の詳細な説明
  • Hadoop 3.2.0 クラスターの構築に関する一般的な考慮事項

<<:  jQueryチェーン呼び出しの詳細な説明

>>:  MySQL で誕生日から年齢を計算する複数の方法

推薦する

CSSでプロセスナビゲーション効果を実現する(3つの方法)

CSS によりプロセスナビゲーション効果を実現します。具体的な内容は以下のとおりです。 ::tip...

MySQL 8.0 のメモリ消費の詳細な分析

目次1. innodb_buffer_pool_size 2. innodb_log_buffer_...

MySQL における datetime と timestamp の違いと使い方

1. MySQL で現在の時刻を表現するにはどうすればよいでしょうか?実際、表現方法はいろいろありま...

Vue.jsは9グリッド画像表示モジュールを実装します

Vue.js を使用して、クリックしてズームできる 9 グリッドの画像表示モジュールを作成しました。...

Redmine の Docker インストール手順

イメージをダウンロードします(オプションの手順です。省略した場合は、手順 3 と 4 で自動的にイン...

MySQLでストアドプロシージャをデバッグする最も簡単な方法

同僚から、一時テーブルを使用して変数データを挿入して表示する方法を教わったことがありますが、この方法...

MySql で正規表現クエリを使用する方法

正規表現は、特定のパターンに一致するテキストを検索および置換するためによく使用されます。たとえば、テ...

Docker環境でMySQLを実行し、Binlogを有効にしてマスタースレーブ同期を構成する方法

同じサーバーで、Docker を使用して Mysql のマスター スレーブ同期設定をシミュレートしま...

SQLはLeetCodeを実装します(180.連続した数字)

[LeetCode] 180. 連続した数字少なくとも 3 回連続して出現するすべての数字を検索す...

mysql はインデックスを無効にしますか?

mysql の IN はインデックスを無効にしますか?しませんよ! 結果をご覧ください: mysq...

ウェブサイトのユーザビリティを向上させる10のヒント

企業の Web サイト、個人のブログ、ショッピング Web サイト、ゲーム Web サイトなど、どの...

JSON.stringify の簡易版の実装とその 6 つの主要機能の詳細な説明

目次序文JSON.stringify の 6 つの機能特集1特集2特集3特集4特集5特集6手動で文字...

ウェブデザインを改善するための 8 つの CSS ツールを共有する

ウェブサイトのデザインを編集または変更する必要がある場合、CSS が重要な役割を果たします。 CSS...

JS は Baidu 検索ボックスを実装します

この記事の例では、Baidu検索ボックスを実装するためのJSの具体的なコードを参考までに共有していま...

Dockerfile を使用して Node.js サービスをデプロイする方法

Dockerfileを初期化するプロジェクトの名前が express であると仮定して、expres...