今日はHadoopの部分の終わりである。これは、Hadoopのシリーズの最後の記事です。HAは、飼育係を必要とするため、飼育係の一部を説明した後、私はHadoopののHA部分を見に戻ってくると列に従います。「ブレークコクーンとバタフライになる-ビッグデータ」、関連コンテンツをもっと見る〜
目次
1つ、HAの概要
HA(高可用性)、つまり高可用性(7 * 24時間のノンストップサービス)。高可用性を実現するための最も重要な戦略は、単一障害点を排除することです。厳密に言えば、HAは各コンポーネントのHAメカニズムに分割する必要があります:HDFSHAとYARNHA。Hadoop 2.0より前は、HDFSクラスター内のNameNodeに単一障害点(SPOF)がありました。NameNodeは、主に次の2つの側面でHDFSクラスターに影響を与えます。(1)ダウンタイムなど、NameNodeマシンに事故が発生した場合、管理者が再起動するまでクラスターは使用できなくなります。(2)ソフトウェアとハードウェアのアップグレードを含め、NameNodeマシンをアップグレードする必要があります。この時点で、クラスターも使用できなくなります。
HDFS HA機能は、アクティブ/スタンバイの2つのNameNodeを構成して、クラスター内のNameNodeのホットスタンバイを実装することにより、上記の問題を解決します。マシンがクラッシュしたり、マシンをアップグレードして保守する必要があるなどの障害が発生した場合は、この方法でNameNodeを別のマシンにすばやく切り替えることができます。
2、HDFS HA
2.1 HDFSHAの動作メカニズム
2.1.1主な作業ポイント
1.メタデータの管理方法を変更する必要があります。
(1)各メタデータはメモリに保存されます;
(2)アクティブ状態のNameNodeノードのみが編集ログに書き込むことができます;
(3)両方のNameNodeは編集を読み取ることができます;
(4)共有編集は共有ストレージ管理に配置されます(qjournalとNFSは2つの主流の実装です);
2。状態管理汎用モジュールが必要です。
各namenodeが配置されているノードに存在するzkfailoverが実装され、各zkfailoverは独自のNameNodeノードを監視し、ステータスの識別にzkを使用します。状態を切り替える必要がある場合、zkfailoverは切り替えを担当します。切り替え中は脳の分裂を防ぐ必要があります。現象の発生。
3.2つのNameNodeがパスワードなしでSSHでログインできることを確認する必要があります。
4.フェンス、つまり、1つのNameNodeのみが同時に外部サービスを提供します。
2.1.2動作メカニズム
1.自動フェイルオーバーにより、HDFSデプロイメントにZooKeeperプロセスとZKFailoverController(ZKFC)プロセスの2つの新しいコンポーネントが追加されます。ZooKeeperは、少量の調整されたデータを維持し、これらのデータの変更をクライアントに通知し、クライアントの障害を監視する高可用性サービスです。HAの自動フェイルオーバーは、ZooKeeperの次の機能に依存しています。
(1)障害検出:クラスター内の各NameNodeは、ZooKeeperで永続セッションを維持します。マシンがクラッシュすると、ZooKeeperのセッションは終了し、ZooKeeperは他のNameNodeにフェイルオーバーをトリガーする必要があることを通知します。
(2)アクティブなNameNodeの選択:ZooKeeperは、ノードをアクティブとして選択するだけの簡単なメカニズムを提供します。現在アクティブなNameNodeがクラッシュした場合、別のノードがZooKeeperから特別な排他ロックを取得して、アクティブなNameNodeになる必要があることを示す場合があります。
2. ZKFCは、自動フェイルオーバーのもう1つの新しいコンポーネントであり、ZooKeeperのクライアントであり、NameNodeのステータスを監視および管理します。NameNodeを実行している各ホストはZKFCプロセスも実行し、ZKFCは以下を担当します。
(1)ヘルスモニタリング:ZKFCは、ヘルスチェックコマンドを使用して、同じホスト上のNameNodeに定期的にpingを実行します。NameNodeが時間内にヘルスステータスに戻る限り、ZKFCはノードが正常であると見なします。ノードがクラッシュ、フリーズ、または異常状態になった場合、ヘルスモニターはノードを異常として識別します。
(2)ZooKeeperセッション管理:ローカルNameNodeが正常である場合、ZKFCはZooKeeperで開かれたセッションを維持します。ローカルのNameNodeがアクティブな場合、ZKFCは特別なznodeロックも維持します。これは、ZooKeeperの一時ノードのサポートを使用します。セッションが終了すると、ロックノードは自動的に削除されます。
(3)ZooKeeperに基づく選択:ローカルのNameNodeが正常であり、ZKFCが現在znodeロックを保持しているノードが他にないことを検出した場合、ZKFCは自身のロックを取得します。成功した場合、それは選択を勝ち取り、フェイルオーバープロセスを実行してローカルのNameNodeをアクティブにする責任があります。フェイルオーバープロセスは、前述の手動フェイルオーバーと同様です。最初に、必要に応じて、前のアクティブなNameNodeを保護してから、ローカルのNameNodeをアクティブ状態に変換します。
2.2 HDFSHA構成
2.2.1環境への準備
これには、IPの変更、ホスト名の変更、ホストマッピング、ファイアウォールのオフ、セキュリティサブシステムのオフ、キーフリーログインの構成、JDK構成環境変数のインストールなどが含まれます。これらはすべて前の記事で言及されているので、ここでは繰り返しません。「2。LinuxでのHadoopオペレーティング環境の構築」を参照してください。
2.2.2クラスターノードの計画
主人 |
slave01 |
slave02 |
NameNode |
NameNode |
|
JournalNode |
JournalNode |
JournalNode |
DataNode |
DataNode |
DataNode |
ZK |
ZK |
ZK |
|
ResourceManager |
|
NodeManager |
NodeManager |
NodeManager |
2.2.3Zookeeperクラスターの構成
手順は、「2番目のLinuxによるZookeeperのインストール」のZookeeperの分散インストールの手順と同じです。
2.2.4 HDFSHAの構成
1.まず、/ opt / modulesディレクトリの下に新しいhaディレクトリを作成し、hadoop-2.7.2ディレクトリをhaディレクトリにコピーします。
2.hadoop-env.shでJAVA_HOMEを構成します。
3.core-site.xmlファイルを構成します
<configuration>
<!-- 把两个NameNode的地址组装成一个集群namenodecluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://namenodecluster</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/ha/hadoop-2.7.2/data/tmp</value>
</property>
</configuration>
4.hdfs-site.xmlファイルを構成します
<configuration>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>namenodecluster</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.namenodecluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.namenodecluster.nn1</name>
<value>master:9000</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.namenodecluster.nn2</name>
<value>slave01:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.namenodecluster.nn1</name>
<value>master:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.namenodecluster.nn2</name>
<value>slave01:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave01:8485;slave02:8485/namenodecluster</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/ha/hadoop-2.7.2/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>
5.設定したファイルを他のノードに配布します
xsync /opt/modules/ha
2.2.5 HDFSHAクラスターを開始します
1.最初にjournalnodeサービスを開始します。
sbin/hadoop-daemons.sh start journalnode
2. nn1でNameNodeをフォーマットして開始します:
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
3. nn1のメタデータ情報をnn2で同期して開始します。ここで、NameNodeは1回しかフォーマットできないことに注意してください。
bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode
4.テストのためのブラウザアクセス
5.nn1ですべてのDataNodeを開始します
sbin/hadoop-daemons.sh start datanode
6.nn1のNameNodeをアクティブに変更します
bin/hdfs haadmin -transitionToActive nn1
ブラウザを再度更新します。
このコマンドを使用して、nn1がアクティブかどうかを確認することもできます。
bin/hdfs haadmin -getServiceState nn1
2.2.6自動フェイルオーバーの構成
1. hdfs-site.xml構成ファイルを変更し、以下のコンテンツを追加します。
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
2.次のコンテンツをcore-site.xmlファイルに追加します。
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave01:2181,slave02:2181</value>
</property>
構成後、変更したファイルを残りのマシンに配布することを忘れないでください。
3.ディレクトリ内のデータとログファイルを削除します。
rm -rf ./data ./logs
4.サービスを開始します
(1)まず、Zookeeperクラスターとjournalnodeサービスを開始します。
bin/zkServer.sh start
sbin/hadoop-daemons.sh start journalnode
(2)NameNodeをフォーマットします。同様に、1台のマシンでのみフォーマットします。
bin/hdfs namenode -format
(3)ZookeeperでHA状態を初期化します。1台のマシンでのみ実行する必要があることに注意してください。
bin/hdfs zkfc -formatZK
ここでは、以下に示すように、Zookeeperで新しいノードを作成するのと同じです。
(4)HDFSサービスを開始します
sbin/start-dfs.sh
(5)nn2で以下のコマンドを実行し、nn1のメタデータ情報を同期させます。
bin/hdfs namenode -bootstrapStandby
(6)nn2のNameNodeを個別に起動します
sbin/hadoop-daemon.sh start namenode
5.テスト検証
現在、マスターノードのNameNodeはアクティブ状態です。マスターノードのNameNodeを手動で強制終了すると、slave01ノードのNameNodeがスタンバイからアクティブに自動的に変換されることがわかります。
三、ヤーンHA
3.1クラスターの計画
hadoop102 |
hadoop103 |
hadoop104 |
NameNode |
NameNode |
|
JournalNode |
JournalNode |
JournalNode |
DataNode |
DataNode |
DataNode |
ZK |
ZK |
ZK |
ResourceManager |
ResourceManager |
|
NodeManager |
NodeManager |
NodeManager |
3.2 YarnHAの構成
1.次の構成をyarn-site.xmlに追加します
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--声明两台resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave01</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave01:2181,slave02:2181</value>
</property>
<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
2.変更されたコンテンツを残りのノードに同期します。
3.サービスを開始します
(1)Zookeeperを起動します
bin/zkServer.sh start
(2)hdfs関連サービスを開始する
sbin/start-dfs.sh
(3)糸サービスを開始する
sbin/start-yarn.sh
このとき、別のマシンでResourceManagerを起動する必要があります。
sbin/yarn-daemon.sh start resourcemanager
4.ステータスを確認します
bin/yarn rmadmin -getServiceState rm1
ページアクセスを通じて、入力がmasterまたはslave01であるかどうかに関係なく、アクティブ状態のノードにジャンプします。これがマスターです。
これでこの記事は終わりです。このプロセスで問題が発生した場合は、メッセージを残して、発生した問題を確認させてください〜