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

推薦する

Webフォーム作成スキル

実際、上記の 3 つの表はいずれも 3 行 3 列です。区切り線を非表示にするコツはルールにあります...

Mac で Docker を使用して Oracle をデプロイする方法

Mac で Docker を使用して Oracle をデプロイする方法まずdockerをインストール...

純粋な JS を使用して vue.js で双方向バインディング機能を実装する方法

目次まず、双方向バインディングを実装するアイデアについて説明します。これらの機能を実装するための j...

コマンドを使用してMySQLデータベース(de1)を作成する方法

1. MYSQLに接続するフォーマット: mysql -h ホストアドレス -u ユーザー名 -p ...

DockerでJavaプログラムを起動する方法

シンプルなSpring Boot Webプロジェクトを作成するアイデア ツールを使用して、Sprin...

MySQL ステートメントを使用して、さまざまな整数が占めるバイト数とその最大値と最小値を調べる例

直接コード: タイプとして「bigint unsigned」、バイトとして「8」、max_numとし...

VSCode と SSH を使用したリモート開発

0. リモート開発が必要な理由組み込み Linux を開発する場合、便宜上、通常は Windows ...

SQL 最適化チュートリアル: IN クエリと RANGE クエリ

序文「High Performance MySQL」では、インデックスでは範囲フィールドの後の部分が...

水平プログレスバーの最後にテキストを表示するための実装コードの CSS 記述

問題の説明仕事で以下の成果を達成したいと考えています。 解決div タグに相対配置を追加し、絶対配置...

背景画像に CSS3 変換を適用するためのソリューション

CSS 変換は便利ですが、背景画像にはまだ適用されていません。この投稿では、背景画像を回転させたい場...

入力タイプ=テキスト値=str を使用するための不完全なソリューション

今日、非常に奇妙な問題に遭遇しました。次のコードを見てください。 SimpleDateFormat ...

HTMLのmarquee属性でテキストを踊らせる

構文: <marquee> …</marquee>モバイル属性マーキーを使用...

Linux で Nginx ロード バランシングを使用して複数の Tomcat を構成する方法

Linux に nginx と複数の tomcat をインストールする方法はここでは紹介しません。不...

Nginx Linux のインストールと展開の詳細なチュートリアル

1. Nginx の紹介Nginxは負荷分散やリバースプロキシにも使えるWebサーバーです。現在最も...

HTML テーブル マウス ドラッグ ソート機能

効果画像: 1. ファイルをインポートする<script src="js/jquer...