HDFS2.x高可用性クラスターアーキテクチャ
このブログでは、HDFS2.x高可用性クラスターアーキテクチャとHDFS高可用性クラスターをセットアップする手順について説明します。これはの重要な部分です 。 このブログで取り上げられているトピックの順序は次のとおりです。
- HDFSHAアーキテクチャ
- 前書き
- NameNodeの可用性
- HAのアーキテクチャ
- HAの実装(JournalNodeおよび共有ストレージ)
- HadoopクラスターでHA(クォーラムジャーナルノード)を設定するにはどうすればよいですか?
前書き:
高可用性クラスターの概念は、Hadoop2で導入されました。xは、Hadoop1.xの単一障害点の問題を解決します。私の以前のブログからご存知のように、 NameNodeがマスターデーモンとして機能し、DataNodeと呼ばれる他のスレーブノードの管理を担当するマスター/スレーブトポロジに従います。この単一のマスターデーモンまたはNameNodeがボトルネックになります。セカンダリNameNodeの導入により、データの損失とNameNodeの負担の一部の軽減が防止されましたが、NameNodeの可用性の問題は解決されませんでした。
NameNodeの可用性:
HDFSクラスターの標準構成を検討すると、NameNodeは 単一障害点 。これは、NameNodeが使用できなくなった瞬間に、誰かがNameNodeを再起動するか、新しいものを持ってくるまで、クラスター全体が使用できなくなるために発生します。
NameNodeが使用できない理由は、次のとおりです。
- メンテナンス作業などの計画されたイベントでは、ソフトウェアまたはハードウェアのアップグレードが行われます。
- また、何らかの理由でNameNodeがクラッシュする予定外のイベントが原因である可能性もあります。
上記のいずれの場合でも、HDFSクラスターを使用できないダウンタイムが発生します。これが課題になります。
HDFS HAアーキテクチャ:
HDFSHAアーキテクチャがNameNodeの可用性に関するこの重大な問題をどのように解決したかを理解しましょう。
HAアーキテクチャは、アクティブ/パッシブ構成で2つのNameNodeを使用できるようにすることで、NameNodeの可用性に関するこの問題を解決しました。したがって、高可用性クラスターで同時に2つのNameNodeを実行しています。
- アクティブなNameNode
- スタンバイ/パッシブNameNode。
一方のNameNodeがダウンした場合、もう一方のNameNodeが責任を引き継ぐことができるため、クラスターのダウンタイムを短縮できます。スタンバイNameNodeは、Hadoopクラスターにフェイルオーバー機能を組み込んだバックアップNameNode(セカンダリNameNodeとは異なります)の目的を果たします。したがって、StandbyNodeを使用すると、NameNodeがクラッシュしたとき(計画外のイベント)に自動フェイルオーバーを実行したり、メンテナンス期間中に正常な(手動で開始した)フェイルオーバーを実行したりできます。
HDFS高可用性クラスターの整合性を維持するには2つの問題があります。
- アクティブとスタンバイのNameNodeは常に互いに同期している必要があります。つまり、それらは同じメタデータを持っている必要があります。これにより、Hadoopクラスターをクラッシュしたのと同じ名前空間状態に復元できるため、高速フェイルオーバーが可能になります。
- 2つのアクティブなNameNodeはデータの破損につながるため、一度に1つのアクティブなNameNodeのみが存在する必要があります。 この種のシナリオは、クラスターがより小さなクラスターに分割され、それぞれが唯一のアクティブなクラスターであると信じるスプリットブレインシナリオと呼ばれます。 このようなシナリオを回避するために、フェンシングが行われます。フェンシングは、特定の時間に1つのNameNodeのみがアクティブのままであることを保証するプロセスです。
HAアーキテクチャの実装:
これで、HDFS HAアーキテクチャでは、2つのNameNodeが同時に実行されていることがわかります。したがって、次の2つの方法でアクティブおよびスタンバイNameNode構成を実装できます。
- クォーラムジャーナルノードの使用
- NFSを使用した共有ストレージ
一度に1つずつ実行するこれらの2つの実装方法を理解しましょう。
1.クォーラムジャーナルノードの使用:
doubleをintにキャストする方法
- スタンバイNameNodeとアクティブNameNodeは、ノードまたはデーモンの個別のグループを介して相互に同期を維持します。 JournalNodes 。JournalNodesは、ノードが相互に接続されてリングを形成するリングトポロジに従います。JournalNodeは、それに着信する要求を処理し、情報をリング内の他のノードにコピーします。これにより、JournalNodeに障害が発生した場合のフォールトトレランスが提供されます。
- アクティブなNameNodeは、JournalNodesに存在するEditLogs(メタデータ情報)を更新する役割を果たします。
- スタンバイノードは、JournalNodeのEditLogsに加えられた変更を読み取り、それを自身の名前空間に一定の方法で適用します。
- フェイルオーバー中、StandbyNodeは、新しいActive NameNodeになる前に、JournalNodeからのメタデータ情報を更新したことを確認します。これにより、現在の名前空間の状態がフェイルオーバー前の状態と同期されます。
- 両方のNameNodeのIPアドレスは、すべてのDataNodeで使用可能であり、ハートビートとブロック位置情報を両方のNameNodeに送信します。これにより、StandbyNodeがクラスター内のブロックの場所に関する情報を更新するため、フェイルオーバーが高速になります(ダウンタイムが短縮されます)。
NameNodeのフェンシング:
ここで、前に説明したように、一度に1つのアクティブなNameNodeのみが存在することを確認することが非常に重要です。したがって、フェンシングは、クラスター内のこのプロパティそのものを保証するプロセスです。
- JournalNodesは、一度に1つのNameNodeのみがライターになることを許可することにより、このフェンシングを実行します。
- スタンバイNameNodeは、JournalNodeへの書き込みの責任を引き継ぎ、他のNameNodeがアクティブなままになることを禁止します。
- 最後に、新しいActiveNameNodeはそのアクティビティを安全に実行できます。
2.共有ストレージの使用:
- スタンバイノードとアクティブなNameNodeは、を使用して相互に同期を維持します。 共有ストレージデバイス 。アクティブなNameNodeは、名前空間で行われた変更の記録を、この共有ストレージに存在するEditLogに記録します。スタンバイノードは、この共有ストレージ内のEditLogsに加えられた変更を読み取り、それを独自の名前空間に適用します。
- これで、フェイルオーバーの場合、StandbyNodeは最初に共有ストレージのEditLogsを使用してメタデータ情報を更新します。次に、ActiveNameNodeの責任を負います。これにより、現在の名前空間の状態がフェイルオーバー前の状態と同期されます。
- 管理者は、スプリットブレインシナリオを回避するために、少なくとも1つのフェンシング方法を構成する必要があります。
- システムは、さまざまなフェンシングメカニズムを採用する場合があります。これには、NameNodeのプロセスの強制終了、および共有ストレージディレクトリへのアクセスの取り消しが含まれる場合があります。
- 最後の手段として、以前アクティブだったNameNodeをSTONITHと呼ばれる手法でフェンスするか、「ヘッド内の他のノードを撃つ」ことができます。 STONITHは、専用の配電ユニットを使用して、NameNodeマシンの電源を強制的にオフにします。
自動フェイルオーバー:
フェイルオーバーは、システムが障害または障害を検出したときに、システムが自動的に制御をセカンダリシステムに移す手順です。フェイルオーバーには2つのタイプがあります。
グレースフルフェイルオーバー: この場合、定期的なメンテナンスのために手動でフェイルオーバーを開始します。
自動フェイルオーバー: この場合、NameNodeに障害が発生した場合(計画外のイベント)、フェイルオーバーが自動的に開始されます。
Apache Zookeeperは、HDFS高可用性クラスターで自動フェイルオーバー機能を提供するサービスです。少量の調整データを維持し、そのデータの変更をクライアントに通知し、クライアントの障害を監視します。 Zookeeperは、NameNodeとのセッションを維持します。失敗した場合、セッションは期限切れになり、Zookeeperは他のNameNodeにフェイルオーバープロセスを開始するよう通知します。 NameNodeに障害が発生した場合、他のパッシブNameNodeがZookeeperをロックして、次のアクティブNameNodeになりたいことを示すことができます。
ZookeerFailoverController(ZKFC)は、NameNodeステータスも監視および管理するZookeeperクライアントです。各NameNodeはZKFCも実行します。 ZKFCは、NameNodeの状態を定期的に監視する責任があります。
Hadoopクラスターの高可用性とは何かを理解したので、次にセットアップします。 Hadoopクラスターで高可用性を設定するには、すべてのノードでZookeeperを使用する必要があります。
ActiveNameNodeのデーモンは次のとおりです。
- Zookeeper
- Zookeeperフェイルオーバーコントローラー
- JournalNode
- NameNode
スタンバイNameNodeのデーモンは次のとおりです。
- Zookeeper
- Zookeeperフェイルオーバーコントローラー
- JournalNode
- NameNode
DataNodeのデーモンは次のとおりです。
- Zookeeper
- JournalNode
- DataNode
HDFSとHadoopをマスターしたい場合は、Edurekaによる特別にキュレーションされたビッグデータとHadoopコースをチェックしてください。下のボタンをクリックして開始してください。
Hadoopでの高可用性クラスターのセットアップと構成:
最初に、各ノードのJava名とホスト名を設定する必要があります。
仮想マシン | IPアドレス | ホスト名 |
アクティブなNameNode | 192.168.1.81 | nn1.cluster.comまたはnn1 |
スタンバイNameNode | 192.168.1.58 | nn2.cluster.comまたはnn2 |
DataNode | 192.168.1.82 | dn1.cluster.comまたはdn1 |
HadoopとZookeeperのバイナリtarファイルをダウンロードし、ファイルを抽出して構成ファイルを編集します。
コマンド: wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
zookeeper-3.4.6.tar.gzを広げます
コマンド :tar –xvf zookeeper-3.4.6.tar.gz
安定したHadoopバイナリtarをApacheHadoopサイトからダウンロードします。
コマンド :wget https://archive.apache.org/dist/hadoop/core/hadoop-2.6.0/hadoop-2.6.0.tar.gz
Hadoopタールボールを抽出します。
コマンド :tar –xvf hadoop-2.6.0.tar.gz
Hadoopバイナリを拡散します。
Hadoop、Zookeeper、パスを.bashrcファイルに追加します。
.bashrcファイルを開きます。
コマンド :sudo gedit〜 / .bashrc
以下のパスを追加します。
export HADOOP_HOME = export HADOOP_MAPRED_HOME = $ HADOOP_HOME export HADOOP_COMMON_HOME = $ HADOOP_HOME export HADOOP_HDFS_HOME = $ HADOOP_HOME export YARN_HOME = $ HADOOP_HOME export HADOOP_CONF_DIR = $ HADOOP_HOME / etc / hadoop export HADOOP_CONF_DIR = $ HADOOP_HOME / etc / hadoop export YARN_CON $ PATH:$ JAVA_HOME / bin:$ HADOOP_HOME / bin:$ HADOOP_HOME / sbin:$ ZOOKEEPER_HOME / bin
.bashrcファイルを編集します。
すべてのノードでSSHを有効にします。
すべてのノードでSSHキーを生成します。
コマンド :ssh-keygen –t rsa(すべてのノードでのこのステップ)
すべてのノードでSSHキーを設定します。
キーを保存するためにEnterファイルへのパスを指定したり、パスフレーズを指定したりしないでください。エンターボタンを押します。
すべてのノードでsshキープロセスを生成します。
sshキーが生成されると、公開キーと秘密キーを取得します。
.sshキーディレクトリにはパーミッション700が含まれている必要があり、.sshディレクトリ内のすべてのキーにはパーミッション600が含まれている必要があります。
SSHディレクトリのアクセス許可を変更します。
ディレクトリを.sshに変更し、ファイルのアクセス許可を600に変更します
公開鍵と秘密鍵のアクセス許可を変更します。
Nameノードのssh公開鍵をすべてのノードにコピーする必要があります。
Active Namenodeで、catコマンドを使用してid_rsa.pubをコピーします。
コマンド :cat〜 / .ssh / id_rsa.pub >>〜/ .ssh / authorized_keys
Namenodesshキーをその許可されたキーにコピーします。
NameNode公開鍵を使用してすべてのノードにコピーします ssh-copy-id コマンド。
コマンド :ssh-copy-id –i .ssh / id_rsa.pub edureka@nn2.cluster.com
目的キーをスタンバイNameNodeにコピーします。
NameNode公開鍵をデータノードにコピーします。
コマンド :ssh-copy-id –i .ssh / id_rsa.pub edureka@dn1.cluster.com
Namenode公開鍵をデータノードにコピーします。
すべてのノードでsshdサービスを再起動します。
コマンド :sudo service sshd restart(すべてのノードで実行)
SSHサービスを再起動します。
これで、認証なしでNamenodeから任意のノードにログインできます。
Active Nameノードからcore-site.xmlファイルを開き、以下のプロパティを追加します。
アクティブなnamenodeからcore-site.xmlを編集します
ActiveNamenodeでhdfs-site.xmlファイルを開きます。以下のプロパティを追加します。
dfs.namenode.name.dir / home / edureka / HA / data / namenode dfs.replication 1 dfs.permissions false dfs.nameservices ha-cluster dfs.ha.namenodes.ha-cluster nn1、nn2 dfs.namenode.rpc-address .ha-cluster.nn1 nn1.cluster.com:9000 dfs.namenode.rpc-address.ha-cluster.nn2 nn2.cluster.com:9000 dfs.namenode.http-address.ha-cluster.nn1nn1.cluster。 com:50070 dfs.namenode.http-address.ha-cluster.nn2 nn2.cluster.com:50070 dfs.namenode.shared.edits.dir qjournal://nn1.cluster.com:8485nn2.cluster.com:8485dn1。 cluster.com:8485/ha-cluster dfs.client.failover.proxy.provider.ha-cluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.automatic-failover.enabled true ha.zookeeper .quorum nn1.cluster.com:2181、nn2.cluster.com:2181、dn1.cluster.com:2181 dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files / home / edureka /.ssh/id_rsa
ディレクトリをzookeeperのconfディレクトリに変更します。
コマンド :cd zookeeper-3.4.6 / conf
ZookeeperConfディレクトリ。
zoo_sample.cfgファイルがあるconfディレクトリで、zoo_sample.cfgファイルを使用してzoo.cfgを作成します。
コマンド :cp zoo_sample.cfg zoo.cfg
zoo.cfgファイルを作成します。
任意の場所にディレクトリを作成し、このディレクトリを使用して動物園の飼育係のデータを保存します。
コマンド :mkdir
Zookeeperデータを保存するディレクトリを作成します。
zoo.cfgファイルを開きます。
コマンド :gedit zoo.cfg
上記の手順で作成したディレクトリパスをdataDirプロパティに追加し、残りのノードに関する以下の詳細をzoo.cfgファイルに追加します。
Server.1 = nn1.cluster.com:2888:3888
Server.2 = nn2.cluster.com:2888:3888
Server.3 = dn1.cluster.com:2888:3888
zoo.cfgファイルを編集します。
次に、scpコマンドを使用して、JavaおよびHadoop-2.6.0、zookeeper-3.4.6ディレクトリ、および.bashrcファイルをすべてのノード(スタンバイ名ノード、データノード)にコピーします。
コマンド :scp –r edureka @:
Hadoop、Zookeeper、および.bashrcファイルをすべてのノードにコピーします。
同様に、.bashrcファイルとzookeeperディレクトリをすべてのノードにコピーし、それぞれのノードに応じてそれぞれの環境変数を変更します。
データノードで、HDFSブロックを保存する必要があるディレクトリを作成します。
データノードでは、dfs.datanode.data.dirプロパティを追加する必要があります。
私の場合、私は作成しました データノード ブロックを格納するディレクトリ。
Datanodeディレクトリを作成します。
データノードディレクトリへのアクセス許可を変更します。
Javaのスタックおよびヒープメモリ
Datanodeディレクトリの権限を変更します。
HDFS-site.xmlファイルを開き、このDatanodeディレクトリパスをdfs.datanode.data.dirプロパティに追加します。
注:アクティブな名前ノードからコピーされたすべてのプロパティを保持し、名前ノードにdfs.datanode.data.dir1つの抽出プロパティを追加します。
dfs.datanode.data.dir / home / edureka / HA / data / datanode
Active namenodeで、zookeeper構成ファイルを保管するディレクトリー(dataDirプロパティー・パス)を変更します。
ディレクトリ内にmyidファイルを作成し、ファイルに数値1を追加して、ファイルを保存します。
コマンド :vi myid
myidファイルを作成します。
スタンバイnamenodeで、zookeeper構成ファイルを保管するディレクトリー(dataDirプロパティー・パス)を変更します。
ディレクトリ内にmyidファイルを作成し、ファイルに数値2を追加して、ファイルを保存します。
データノードで、zookeeper構成ファイルを保存するディレクトリ(dataDirプロパティパス)を変更します。
ディレクトリ内にmyidファイルを作成し、ファイルに数値3を追加して、ファイルを保存します。
3つのノードすべてでJournalnodeを開始します。
コマンド :hadoop-daemon.sh startjournalnode
Journalnodeを起動します。
jpsコマンドを入力すると、すべてのノードにJournalNodeデーモンが表示されます。
フォーマットする積極的な目的。
コマンド :HDFS意図-フォーマット
アクティブなNameNode形式。
NamenodeデーモンとActiveNamedodeを起動します。
コマンド :hadoop-daemon.sh開始目的
Namenodeを起動します。
HDFSメタデータをアクティブネームノードからスタンバイネームノードにコピーします。
コマンド :HDFSの意図-bootstrapStandby
HDFSメタデータをアクティブネームノードからスタンバイネームノードにコピーします。
このコマンドを実行すると、メタデータがコピーされているノードと場所、およびコピーが正常に行われているかどうかに関する情報が取得されます。
アクティブな目的の詳細の情報。
メタデータがアクティブネームノードからスタンバイネームノードにコピーされると、以下のスクリーンショットに示すメッセージが表示されます。
スタンバイNamenodeのHDFSに関する情報。
スタンバイnamenodeマシンでnamenodeデーモンを起動します。
コマンド :hadoop-daemon.sh開始目的
次に、3つのノードすべてでZookeeperサービスを開始します。
コマンド :zkServer.sh start(すべてのノードでこのコマンドを実行します)
アクティブな目的で:
ActiveNameNodeでzookeeperを起動します。
スタンバイネームノード:
スタンバイNameNodeでzookeeperを起動します。
データノード:
DataNodeでzookeeperを起動します。
Zookeeperサーバーを実行した後、JPSコマンドを入力します。すべてのノードで、QuorumPeerMainサービスが表示されます。
データノードマシンでデータノードデーモンを起動します。
コマンド :hadoop-daemon.sh start datanode
アクティブネームノードとスタンバイネームノードでZookeeperフェイルオーバーコントローラーを起動します。
アクティブなネームノードでzookeeperフェイルオーバーコントローラーをフォーマットします。
コマンド: HDFS zkfc –formatZK
ZKFCをフォーマットします。
アクティブなネームノードでZKFCを起動します。
コマンド :hadoop-daemon.sh start zkfc
jpsコマンドを入力して、DFSZkFailoverControllerデーモンを確認します。
ZKFCを起動します。
スタンバイネームノードでzookeeperフェイルオーバーコントローラーをフォーマットします。
コマンド :hdfs zkfc –formatZK
スタンバイネームノードでZKFCを起動します。
コマンド :hadoop-daemon.sh start zkfc
jpsコマンドを入力して、DFSZkFailoverControllerデーモンを確認します。
次に、以下のコマンドを使用して、各Namenodeのステータス、アクティブなノード、またはスタンバイ状態のノードを確認します。
コマンド :hdfs haadmin –getServiceState nn1
各NameNodeのステータスを確認します。
次に、Webブラウザを使用して各Namenodeのステータスを確認します。
Webブラウザを開き、以下のURLを入力してください。
:50070
ネームノードがアクティブかスタンバイかが表示されます。
アクティブなNameNode。
Webブラウザを使用して別の名前ノードの詳細を開きます。
スタンバイNameNode。
アクティブネームノードで、ネームノードデーモンを強制終了して、スタンバイネームノードをアクティブネームノードに変更します。
Active namenodeにjpsと入力し、デーモンを強制終了します。
コマンド: sudo kill -9
デーモンプロセスID。
NamenodeプロセスIDは7606です。namenodeを強制終了します。
コマンド :sudo kill -9 7606
NameNodeプロセスを強制終了します
Webブラウザで2つのノードを開き、ステータスを確認します。
Namenodeの詳細。
NameNodeのステータス。
おめでとうございます。HadoopでHDFS高可用性クラスターを正常にセットアップしました。
Hadoop高可用性クラスターアーキテクチャを理解したので、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaビッグデータHadoop認定トレーニングコースは、小売、ソーシャルメディア、航空、観光、金融の各ドメインでリアルタイムのユースケースを使用して、学習者がHDFS、Yarn、MapReduce、Pig、Hive、HBase、Oozie、Flume、Sqoopのエキスパートになるのに役立ちます。
質問がありますか?コメント欄にご記入ください。折り返しご連絡いたします。
window._LQ_ = window._LQ_ || {}
lqQuizModal(window、document、{quizId: ’XAIVp8’、baseUrl: ’https://quiz.leadquizzes.com/’、trigger:’ exit ’}、_LQ_)