CentOS 7 は Hadoop 2.10 の高可用性 (HA) をビルドします

CentOS 7 は Hadoop 2.10 の高可用性 (HA) をビルドします

この記事では、CentOS 7 で高可用性 Hadoop 2.10 クラスターを構築する方法を紹介します。まず、6 台のマシンを準備します。2 台の NN (ネームノード)、4 台の DN (データノード)、3 台の JNS (ジャーナルノード)

IPホスト名プロセス
192.168.30.141 s141 nn1 (ネームノード)、zkfc (DFSZKFailoverController)、zk (QuorumPeerMain)
192.168.30.142 s142 dn (データノード)、jn (ジャーナルノード)、zk (QuorumPeerMain)
192.168.30.143 s143 dn (データノード)、jn (ジャーナルノード)、zk (QuorumPeerMain)
192.168.30.144 s144 dn (データノード)、jn (ジャーナルノード)
192.168.30.145 s145 dn (データノード)
192.168.30.146 s146 nn2 (ネームノード)、zkfc (DFSZKFailoverController)

各マシンのJpsプロセス:

私はvmwareの仮想マシンを使用しているため、1台のマシンを設定した後、cloneを使用して残りのマシンをクローンし、ホスト名とIPを変更して、各マシンの構成が統一されるようにします。各マシン構成にhdfsユーザーとユーザーグループを追加し、jdk環境を構成し、hadoopをインストールします。今回は、hdfsユーザーの下に高可用性クラスターを構築します。参照してください:CentOS 7はhadoop 2.10疑似分散モードを構築します

高可用性クラスターをインストールするための手順と詳細は次のとおりです。

1. 各マシンのホスト名とホストを設定する

hosts ファイルを変更します。ホストが設定されると、ホスト名を使用してマシンにアクセスできます。これはより便利です。次のように変更します。

127.0.0.1 ローカルホスト
192.168.30.141 s141
192.168.30.142 s142
192.168.30.143 s143
192.168.30.144 s144
192.168.30.145 s145
192.168.30.146 s146

2. ssh パスワードフリー ログインを設定します。s141 と s146 はどちらもネームノードなので、これら 2 台のマシンからすべてのマシンにパスワードなしでログインする必要があります。hdfs ユーザーと root ユーザーの両方にパスワードフリー ログインを設定するのが最適です。

s141 を nn1 に、s146 を nn2 に設定します。s141 と s146 は、パスワードなしで ssh 経由で他のマシンにログインできるようにする必要があります。これを行うには、s141 および s146 マシンの hdfs ユーザーでキー ペアを生成し、s141 および s146 の公開キーを他のマシンに送信して、~/.ssh/authorized_keys ファイルに配置する必要があります。より正確には、すべてのマシン (自分自身を含む) に公開キーを追加する必要があります。

s141 および s146 マシンでキー ペアを生成します。

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

id_rsa.pub ファイルの内容を s141-s146 マシンの /home/hdfs/.ssh/authorized_keys に追加します。他のマシンには authorized_keys ファイルがないため、id_rsa.pub の名前を authorized_keys に変更できます。他のマシンに authorized_keys ファイルがすでにある場合は、id_rsa.pub の内容をファイルに追加できます。リモート コピーの場合は、scp コマンドを使用できます。

s141マシンの公開鍵を他のマシンにコピーする

scp id_rsa.pub hdfs@s141:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s142:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s143:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s144:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s145:/home/hdfs/.ssh/id_rsa_141.pub
scp id_rsa.pub hdfs@s146:/home/hdfs/.ssh/id_rsa_141.pub

s146マシンの公開鍵を他のマシンにコピーする

scp id_rsa.pub hdfs@s141:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s142:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s143:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s144:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s145:/home/hdfs/.ssh/id_rsa_146.pub
scp id_rsa.pub hdfs@s146:/home/hdfs/.ssh/id_rsa_146.pub

各マシンでcatを使用してキーをauthorized_keysファイルに追加できます。

cat id_rsa_141.pub >> authorized_keys
cat id_rsa_146.pub >> authorized_keys

このとき、authorized_keys ファイルの権限を 644 に変更する必要があります (この権限の問題により、ssh パスワードなしログインが失敗することが多いことに注意してください)

chmod 644 承認済みキー

3. Hadoop 設定ファイル (${hadoop_home}/etc/hadoop/) を設定します。

構成の詳細:

注: s141 と s146 は、特に ssh に関してはまったく同じ構成になっています。

1) ネームサービスを構成する

[hdfs-site.xml]
<プロパティ>
 <name>dfs.nameservices</name>
 <値>mycluster</値>
</プロパティ>


2) dfs.ha.namenodes.[ネームサービスID]

[hdfs-site.xml]
<!-- myucluster の下の名前ノードの 2 つの ID -->
<プロパティ>
  <name>dfs.ha.namenodes.mycluster</name>
  <値>nn1,nn2</値>
</プロパティ>

3) dfs.namenode.rpc-address.[ネームサービスID].[ネームノードID]

[hdfs-site.xml]
各 nn の rpc アドレスを設定します。
<プロパティ>
 <name>dfs.namenode.rpc-address.mycluster.nn1</name>
 <値>s141:8020</値>
</プロパティ>
<プロパティ>
 <name>dfs.namenode.rpc-address.mycluster.nn2</name>
 <値>s146:8020</値>
</プロパティ>

4) dfs.namenode.http-address.[ネームサービスID].[ネームノードID]
WebUIポートを設定する

[hdfs-site.xml]
<プロパティ>
 <name>dfs.namenode.http-address.mycluster.nn1</name>
 <値>s141:50070</値>
</プロパティ>
<プロパティ>
 <name>dfs.namenode.http-address.mycluster.nn2</name>
 <値>s146:50070</値>
</プロパティ>

5) dfs.namenode.shared.edits.dir
名前ノード共有編集ディレクトリ。3つのジャーナルノードノードを選択します。ここではs142、s143、s144の3つのマシンを選択します。

[hdfs-site.xml]
<プロパティ>
 <name>dfs.namenode.shared.edits.dir</name>
 <値>qjournal://s142:8485;s143:8485;s144:8485/mycluster</値>
</プロパティ>

6) dfs.client.failover.proxy.provider.[ネームサービスID]
HA フェイルオーバー Java クラスを構成します (構成は固定)。クライアントはそれを使用して、どのノードがアクティブであるかを判断します。

[hdfs-site.xml]
<プロパティ>
 <name>dfs.client.failover.proxy.provider.mycluster</name>
 <値>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</値>
</プロパティ>

7) dfs.ha.フェンシング.メソッド
災害復旧保護がアクティブ化された状態 nn のスクリプト リストまたは Java クラス。

[hdfs-site.xml]
<プロパティ>
 <name>dfs.ha.fencing.methods</name>
 <値>sshfence</値>
</プロパティ>

<プロパティ>
 <name>dfs.ha.fencing.ssh.秘密鍵ファイル</name>
 <値>/home/hdfs/.ssh/id_rsa</値>
</プロパティ>

8) fs.defaultFS
hdfs ファイル システム名サービスを設定します。ここで、myclusterは上記で設定されたdfs.nameservicesです。

[コアサイト.xml]
<プロパティ>
 <name>fs.defaultFS</name>
 <値>hdfs://mycluster</値>
</プロパティ>

9) dfs.journalnode.edits.dir
JN が編集内容を保存するローカル パスを設定します。

[hdfs-site.xml]
<プロパティ>
 <name>dfs.journalnode.edits.dir</name>
 <値>/home/hdfs/hadoop/journal</値>
</プロパティ>

完全な構成ファイル:

コアサイト.xml

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<構成>
 <プロパティ>
 <name>fs.defaultFS</name>
 <値>hdfs://mycluster/</値>
 </プロパティ>
 <プロパティ>
 <name>hadoop.tmp.dir</name>
 <値>/home/hdfs/hadoop</値>
 </プロパティ>
</構成>

hdfs-サイト.xml

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<構成>
 <プロパティ>
   <name>dfs.replication</name>
   <値>3</値>
 </プロパティ>
 <プロパティ>
   <name>dfs.hosts</name>
   <値>/opt/soft/hadoop/etc/dfs.include.txt</値>
 </プロパティ>
 <プロパティ>
   <name>dfs.hosts.exclude</name>
   <値>/opt/soft/hadoop/etc/dfs.hosts.exclude.txt</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.nameservices</name>
  <値>mycluster</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.ha.namenodes.mycluster</name>
  <値>nn1,nn2</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <値>s141:8020</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <値>s146:8020</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <値>s141:50070</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <値>s146:50070</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.namenode.shared.edits.dir</name>
  <値>qjournal://s142:8485;s143:8485;s144:8485/mycluster</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <値>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.ha.fencing.methods</name>
  <値>sshfence</値>
 </プロパティ>

 <プロパティ>
  <name>dfs.ha.fencing.ssh.秘密鍵ファイル</name>
  <値>/home/hdfs/.ssh/id_rsa</値>
 </プロパティ>
 <プロパティ>
  <name>dfs.journalnode.edits.dir</name>
  <値>/home/hdfs/hadoop/journal</値>
 </プロパティ>
</構成>

マップレッドサイト.xml

<?xml バージョン="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<構成>
 <プロパティ>
 <name>mapreduce.framework.name</name>
 <value>糸</value>
 </プロパティ>
</構成>

糸サイト.xml

<?xml バージョン="1.0"?>

<構成>

<!-- サイト固有の YARN 構成プロパティ -->
 <プロパティ>
   <name>yarn.resourcemanager.ホスト名</name>
   <値>s141</値>
 </プロパティ>
 <プロパティ>
    <name>yarn.nodemanager.aux-services</name>
   <値>mapreduce_shuffle</値>
 </プロパティ>
</構成>

4. 展開の詳細

1) jnノード上でそれぞれjnプロセス(s142、s143、s144)を起動する

hadoop-daemon.sh ジャーナルノードを起動します

2) jnを起動した後、2つのNN間でディスクメタデータを同期します。

a) まったく新しいクラスターの場合は、まずファイル システムをフォーマットします。これは 1 つの NN でのみ実行する必要があります。
[s141|s146]

hadoop ネームノード -フォーマット

b) 非 HA クラスターを HA クラスターに変換する場合は、元の NN のメタデータを別の NN にコピーします。

1. ステップ1 s141マシンで、hadoopデータをs146に対応するディレクトリにコピーします。

scp -r /home/hdfs/hadoop/dfs hdfs@s146:/home/hdfs/hadoop/

2. 手順 2: 新しい nn (フォーマットされていない nn、私の場合は s146) で次のコマンドを実行して、スタンバイ モードで起動します。注意: s141namenode を起動する必要があります (hadoop-daemon.sh start namenode を実行できます)。

hdfs ネームノード -bootstrapStandby

s141 名前ノードが起動されていない場合は、図に示すように失敗します。

s141ネームノードを起動した後、s141でコマンドを実行します。

hadoop-daemon.sh ネームノードを起動します

次に、スタンバイ ブート コマンドを実行します。注意: フォーマットするかどうかを尋ねられた場合は、図に示すように N を選択します。

    3. ステップ3

いずれかの NN で次のコマンドを実行して、編集ログの jn ノードへの送信を完了します。

hdfs ネームノード -initializeSharedEdits

実行中に java.nio.channels.OverlappingFileLockException エラーが報告された場合:

namenode が起動しており、停止する必要があることを示します (hadoop-daemon.sh stop namenode)

実行後、s142、s143、s144 に編集データがあるかどうかを確認します。ここでは、次のように編集ログデータを含む mycluster ディレクトリが生成されていることを確認します。

4. ステップ4

すべてのノードを起動します。

s141 上の名前ノードとすべてのデータノードを起動します。

hadoop-daemon.sh ネームノードを起動します
hadoop-daemons.sh データノードを起動する

s146で名前ノードを起動する

hadoop-daemon.sh ネームノードを起動します

この時点で、ブラウザで http://192.168.30.141:50070/ と http://192.168.30.146:50070/ にアクセスすると、両方のネームノードがスタンバイ状態であることがわかります。

このとき、コマンドを使用して手動で1つをアクティブ状態に切り替える必要があります。ここでは、s141(nn1)をアクティブに設定します。

hdfs haadmin -transitionToActive nn1

現時点ではs141がアクティブです

hdfs haadmin の一般的なコマンド:

この時点で、手動の災害復旧高可用性構成は完了ですが、この方法はインテリジェントではなく、災害復旧を自動的に感知できないため、次に自動災害復旧構成を紹介します。

5. 自動災害復旧構成

2 つのコンポーネントを導入する必要があります: zookeeperquarum と zk 災害復旧コントローラー (ZKFC)

Zookeeper クラスターを構築し、3 台​​のマシン s141、s142、s143 を選択し、zookeeper をダウンロードします: http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.6

1) Zookeeper を解凍します。

tar -xzvf apache-zookeeper-3.5.6-bin.tar.gz -C /opt/soft/zookeeper-3.5.6

2) 環境変数を設定し、/etc/profileにzk環境変数を追加し、/etc/profileファイルを再コンパイルします。

次のようにコードをコピーします
ソース /etc/profile

3) zk設定ファイルを設定し、3台のマシンの設定ファイルを統合する

# 各ティックのミリ秒数
ティックタイム=2000
# 初期値であるティック数 
# 同期フェーズは
初期制限=10
# 通過できるティック数 
# リクエストを送信し、確認応答を受け取る
同期制限=5
# スナップショットが保存されるディレクトリ。
# /tmpをストレージとして使用しないでください。ここでの/tmpは 
# 例のため。
データディレクトリ=/home/hdfs/zookeeper
# クライアントが接続するポート
クライアントポート=2181
# クライアント接続の最大数。
# より多くのクライアントを処理する必要がある場合は、これを増やします
#最大クライアント接続数=60
#
# 必ずメンテナンスセクションをお読みください 
# 自動消去をオンにする前に管理者ガイドを参照してください。
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# dataDir に保持するスナップショットの数
#自動パージ.スナップ保持カウント=3
# 消去タスク間隔(時間単位)
# 自動パージ機能を無効にするには「0」に設定します
#自動パージ.パージ間隔=1
サーバー.1=s141:2888:3888
サーバー2=s142:2888:3888
サーバー3=s143:2888:3888

4) それぞれ

s141 の /home/hdfs/zookeeper ディレクトリ (zoo.cfg 構成ファイルで設定された dataDir パス) に、値 1 (zoo.cfg 構成ファイルの server.1 に対応) の myid ファイルを作成します。

s142 の /home/hdfs/zookeeper ディレクトリ (zoo.cfg 構成ファイルで構成された dataDir パス) に、値 2 (zoo.cfg 構成ファイルの server.2 に対応) の myid ファイルを作成します。

s143 の /home/hdfs/zookeeper ディレクトリ (zoo.cfg 構成ファイルで設定された dataDir パス) に、値 3 (zoo.cfg 構成ファイルの server.3 に対応) の myid ファイルを作成します。

5) 各マシンでzkを個別に起動する

zkServer.sh 開始

起動が成功すると、zk プロセスが表示されます。

HDFs 関連の設定を構成します。

1) すべてのHDFSプロセスを停止する

すべて停止.sh

2) hdfs-site.xml を構成し、自動災害復旧を有効にします。

[hdfs-site.xml]
<プロパティ>
 <name>dfs.ha.automatic-failover.enabled</name>
 <値>真</値>
</プロパティ>

3) core-site.xml を設定し、zk の接続アドレスを指定します。

<プロパティ>
 <name>ha.zookeeper.quorum</name>
 <値>s141:2181、s142:2181、s143:2181</値>
</プロパティ>

4) 上記の 2 つのファイルをすべてのノードに配布します。

5) NNの1つ(s141)で、ZKのHA状態を初期化する

hdfs zkfc -formatZK

次の結果は成功を示します。

zk でも確認できます:

6) HDFSクラスタを起動する

dfs.shを起動します

各マシンのプロセスを表示します。

起動に成功しました。WebUIをご覧ください

s146が起動します

s141はスタンバイモードです

この時点で、Hadoop自動災害復旧HAが構築されます。

要約する

以上、centos7 上で hadoop2.10 の高可用性 (HA) を構築する方法についてご紹介しました。参考になれば幸いです。

以下もご興味があるかもしれません:
  • Hadoop マルチジョブ並列処理の詳細な例
  • 一般的な Hadoop エラーと解決策の詳細な説明
  • リモート デバッグ コードに IntelliJ IDEA を使用するように Hadoop を構成する方法
  • Spring と統合された Hadoop の使用方法に関する詳細なチュートリアル (ビッグ データのクイック スタート)
  • Windows で IDEA を使用して Hadoop 開発環境を構築する詳細な方法
  • Tencent Cloud 上で Hadoop 3.x 疑似クラスターを構築する方法を説明します
  • DockerでHadoopを実行しイメージを作成する方法
  • Hadoopを使用してファイルから指定されたコンテンツを抽出する方法を教えます

<<:  vue3でDOMをマウントするためのプラグインを書く際の問題について

>>:  Vue3.0 は虫眼鏡効果のケーススタディを実装します

推薦する

Ubuntu での CUDA と CUDNN のインストールとアンインストールの実装

目次序文グラフィックドライバーをインストールするCUDAをアンインストールするCUDAをインストール...

vue-router からのフロントエンドルーティングの 2 つの実装

目次モードパラメータハッシュ履歴ハッシュ履歴.push()ハッシュ履歴.replace()アドレスバ...

CSS を使用して同じ親タグの左側と右側に 2 つのボタンを配置する方法

この記事では、主に同じ親タグの左側と右側にある 2 つのボタンの CSS レイアウト方法を紹介し、皆...

Element PlusはAffixを実装します

目次1. コンポーネントの紹介2. ソースコード分析2.1 テンプレート2.2 スクリプト2.3 実...

Docker に fastdfs イメージをインストールする際の注意事項

1. Docker環境を準備する2. fastdfsイメージを検索する 3. イメージをプルするdo...

HTML でテキストの折り返しを実装する例 (HTML でテキストと画像が混在)

1. 画像の周りのテキスト通常のものを使用する場合、たとえば次のようになります。コードをコピーコー...

win10 での mysql 8.0.16 winx64 インストールの最新グラフィック チュートリアル

このデータベースをダウンロードするには、多くの時間とトラフィックがかかります。踏み込んだ落とし穴で時...

Vue3+スクリプト設定+ts+Vite+Volarプロジェクト

目次Viteを使用してvue + tsプロジェクトを作成するVue 3の3つの構文オプションAPIコ...

Vuexの役割についての深い理解

目次概要コンポーネント間でデータを共有する方法Vuex の原則の紹介Vuexはコンポーネントのグロー...

ネイティブ Js で実装されたシンプルなシームレス スクロール カルーセルのサンプル コード

シンプルなシームレススクロールカルーセルには多くの抜け穴があり、後から画像を追加するのは非常に不便で...

vscode dockerプラグインのdocker.socket権限問題を解決する

解決策: システム内のすべての .vscode 関連プロセスを終了します (または、remote-s...

VMware Workstation Pro が Win10 アップデートにより開けなくなる問題の解決方法

今夜の夕食後にノートパソコンの電源を入れたところ、問題が発生しました。通常、コンピューターがスリープ...

MySQL が group by をサポートしない場合の解決策の概要

MySQL 5.7.x の最新バージョンをダウンロードしてインストールしました。デフォルトでは、on...

HTML でランダムロールコーラーを実装するためのサンプルコード

この点呼装置は簡易版であり、自動停止の必要性を考慮していないため、点呼を開始した後、停止ボタンをクリ...

Reactエラー境界コンポーネント処理

React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなか...