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 は虫眼鏡効果のケーススタディを実装します

推薦する

CSS 3.0とビデオを組み合わせることでクリエイティブなオープニング効果を実現

CSS 3.0 とビデオを組み合わせて実現したクリエイティブなオープニングをご紹介します。効果は次の...

React Hooks に基づく小さな状態管理の詳細な説明

目次React Hooks に基づく状態共有の実装ユーザーエクスペリエンスこの記事では、主に Rea...

マークアップ言語 - リスト再び

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

Nginx 逆生成 Mogilefs 分散ストレージ例の詳細な説明

1. 分散ストレージシステムの概要情報技術の継続的な発展により、利便性がもたらされる一方で、データ量...

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

以前はMySQLをあまり使用していなかったため、MySQLの機能にあまり詳しくありませんでした。この...

CSS で実装された円形のプログレスバー

成果を達成する 実装コードhtml <div class="wrap"&g...

あるテーブルからバッチデータをクエリし、それを別のテーブルに挿入する MySQL の完全な例

事前に言っておくNodejs はデータベースを非同期操作として読み取るため、データベースがデータを読...

ウェブサイト標準の検証方法を通じてFlashページを共有する方法

1. 埋め込みは違法です<embed> タグは Netscape のプライベート タグで...

期間限定フラッシュセール機能を実装するJavaScript

この記事では、期間限定フラッシュセール機能を実装するためのJavaScriptの具体的なコードを参考...

Windows 10 で MySQL を完全に削除してアンインストールする方法

序文この記事では、Windows 10 システムで MySQL を完全に削除してアンインストールする...

MySQL がユーザー名とパスワードの漏洩を引き起こす可能性のある Riddle の脆弱性を公開

MySQL バージョン 5.5 および 5.6 を標的とする Riddle 脆弱性により、中間者攻撃...

すべてのブラウザとの完全な互換性を実現するために最適なプリセットを選択してください

各ブラウザの select タグのプロパティと各ブラウザのサポートが多少異なるため、各ブラウザでの選...

Vue/React シングルページ アプリケーションをリフレッシュなしで復元するソリューション

目次導入なぜわざわざ?落とし穴のあるコミュニティソリューション(Vue を例に挙げる)現時点では良い...

CSSを使用して、頻繁に表示される奇妙なボタンを簡単に実装します。

背景グループでは、CSS を使用してインセット コーナー ボタンを実装する方法や、矢印付きのボタンを...

CSS 動的読み込みバー効果のサンプルコード

CSS変数の知識を使って、追加したコードとコメントを直接投稿します <!DOCTYPE htm...