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 で誕生日から年齢を計算する複数の方法

推薦する

CSS3は子供のころの紙飛行機を実現する

今日は折り紙飛行機(飛べる飛行機)を作ります基本的にすべてCSSで実装されており、JSはごく一部に過...

MySQL をクリーンにアンインストールする方法 (テスト済みで効果的)

Mysql を完全にアンインストールするにはどうすればいいですか?以下の手順に従って実行してくださ...

Apache Webサーバーのインストールと設定方法

信頼性が高く、人気があり、簡単に構成できる Web サーバーである Apache で独自の Web ...

Linux におけるゼロコピー技術の使用に関する簡単な分析

この記事では、Linux におけるいくつかの主要なゼロコピー テクノロジと、ゼロコピー テクノロジを...

nginx を使用して http を https に変換するサンプルコード

最近、小さなプログラムを書いています。その小さなプログラムの公式ウェブサイトはhttpsを使用する必...

フォーム要素とプロンプトテキストが揃っていない問題

最近のプロジェクトでは、多くのフォーム、特にチェックボックスとラジオボタンの作成が含まれます。しかし...

SQL 集計、グループ化、並べ替え

目次1. 集計クエリ1. COUNT関数2. SUM関数3. AVG関数4. MAX関数とMIN関数...

MySQLバックアップとリカバリの実践に関する詳細な説明

1. mysqlbackup の紹介mysqlbackup は、MySQL Enterprise B...

JavaScriptプロトタイプチェーン図のまとめと実践

目次プロトタイプチェーンプロトタイプチェーンに基づいてシンプルなJQueryライブラリを実装すること...

Linux システムで TCP 接続を作成するプロセスの紹介

目次LinuxでTCPを作成する手順サーバクライアントTCP確立プロセスサンプルコードLinuxでT...

MySQL レプリケーション問題の 3 つのパラメータの分析

目次01 sql_slave_skip_counter パラメータ02 スレーブスキップエラーパラメ...

base target="" はリンクのターゲットオープンフレームを制御します

<base target=_blank> は、基本リンクのターゲット フレームを新しいペ...

MySQL ステートメントの配置と概要の紹介

SQL (Structured Query Language) ステートメント、つまり構造化クエリ言...

跳ねるボールを実現するネイティブjs

思いつきで、小さなボールが跳ね返るケーススタディを書いてみました。具体的な内容は以下のとおりです。主...

Docker での環境変数の使用とよくある問題の解決策

序文Docker はコンテナの環境変数を設定できます。設定方法は 2 つあります。イメージを作成する...