hadoop2.6.0 HA高信頼クラスタ環境構築


Hadoop 2.0.0の前に、HDFSクラスタでNamenodeは単一の障害(SPOF)であった.各クラスタにはノードがあり、マシンまたはプロシージャが使用不可になった場合、nnが再起動する前または別のクラスタに配備される前にクラスタは使用できません.
主にクラスタが不可能になる2つの方法:
  • マシンがハングアップするまでクラスタは使用できません.
  • ソフトウェアやハードウェアなどの修理プロジェクトのアップグレードを計画しているNamenodeマシンは、クラスタのダウンタイムを引き起こす可能性があります.

  • HDFSの高可用性機能は、上記の問題を解決し、2つの冗長ノードを同じクラスタで実行するアクティブ/パッシブ構成デュアルマシンホットスペアオプションを提供することによって解決される.これにより、次の新しいノード、マシンのクラッシュ、または優雅な管理者が開始した計画的な点検の目的のフェイルオーバに迅速に切り替えることができます.
    HA環境は主に2つのマスタスイッチNNによって高い信頼性を実現し,スタンバイノードはJNSによって同期マスタノード状態を維持し,マスタノードが取り外されるとスタンバイノードはマスタノードとなる.
    HAクラスタを配備するには、次の手順に従います.
    NameNodeマシン-マシン上で実行されるアクティブおよびスタンバイノードは、同じハードウェアと同等のハードウェアをHA以外のクラスタで使用する必要があります.
    journalnodeマシン-マシン上でjournalnodesを実行するjournalnodeデーモンは比較的軽いので、ノード、JobTracker、ResourceManagerなどの他のHadoopデーモンとのマシンを合理的に構成できます.注意:editlogの変更には多くのJNSが必要であるため、少なくとも3つのjournalnodeデーモンプロセスが必要です.これにより、システムがシングルマシンの障害を許容できます.3 journalnodesを超えることもできますが、本当に障害システムが許容できる数を高めるためには、JNS奇数(3、5、7など)を実行する必要があります.なお、N journalnodesを実行すると、システムは最大(n−1)/2の失敗を許容し、正常に継続することができる.
    Secondary Nameノードを起動しないでください.エラーが発生します.
    いくつかの構成の説明:
    hdfs-site.xml
    dfs.nameservices-ネーミングスペースの論理名
     <property>  
            <name>dfs.nameservices</name>
            <value>hacluster</value> 
        </property>

    dfs.ha.namenodes.[nameserviceID]-ネーミングスペース内の各namenodeの一意のID
    <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
    </property>

    dfs.namenode.rpc-address.[nameservice ID].[name node ID]-namenodeが傍受するrpcポート
    property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>machine1.example.com:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>machine2.example.com:8020</value>
    </property>

    dfs.namenode.http-address.[nameservice ID].[name node ID]-namenodeが傍受するhttpポート
    <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>machine1.example.com:50070</value>
    </property>
    <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>machine2.example.com:50070</value>
    </property>

    dfs.namenode.shared.edits.dir-NameNode読み書きJNsグループのuri
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
    </property>

    dfs.client.failover.proxy.provider.[nameserviceID]-HDFS CLIENTSアクティブnnに接続するj'avaメソッド
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    sshfence-sshからアクティブNNへとプロセスを殺します
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/exampleuser/.ssh/id_rsa</value>
    </property>

    The configuration of automatic failover requires the addition of two new parameters to your configuration. In your hdfs-site.xml file, add:
     <property>
       <name>dfs.ha.automatic-failover.enabled</name>
       <value>true</value>
     </property>

    This specifies that the cluster should be set up for automatic failover. In your core-site.xml file, add:
     <property>
       <name>ha.zookeeper.quorum</name>
       <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
     </property>

    This lists the host-port pairs running the ZooKeeper service.
    core-site.xml
    fs.defaultFS-ネーミングスペース
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value>
    </property>

    dfs.journalnode.edits.dir-JNストレージデータローカルパス
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/path/to/journal/node/local/data</value>
    </property>

    OS:centos 7
    jdk:          1.7
    hadoop:    2.6.0
    zk :          3.4.6
    ssh免登をしっかりと行い、zookeeperは仕事を開始します.
    ノードプロセスのリスト:
    ノード
    NameNode
    DataNode
    JournalNode
    DFSZKFailoverController
    ResourceManager
    NodeManager
    QuorumPeerMain
    zoo1
    Y
    Y
    Y
    Y
    zoo2
    Y
    Y
    Y
    Y
    Y
    Y
    Y
    zoo3
    Y
    Y
    Y
    Y
    zoo4
    Y
    Y
    Y
    リファレンスプロファイルの内容は次のとおりです.
    core-site.xml
    <configuration>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/app/tmp</value>
            <description>Abase for other temporary directories.</description>
        </property>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://hacluster</value>
        </property>
        <property>
            <name>io.file.buffer.size</name>
            <value>1031072</value>
        </property>
        <property>
            <name>hadoop.native.lib</name>
            <value>true</value>
            <description>Should native hadoop libraries, if present, be used.</description>
        </property>
        <property>
            <name>ha.zookeeper.quorum</name>
            <value>zoo1:2181,zoo2:2181,zoo3:2181</value>
        </property>
        <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/app/hadoop-2.6.0/jnd</value>
        </property>
    </configuration>

    hdfs-site.xml
    <configuration>
     <property>  
            <name>dfs.namenode.name.dir</name>  
            <value>/app/dfs/name</value>  
        </property>  
        <property>  
            <name>dfs.datanode.data.dir</name>  
            <value>/app/dfs/data</value>  
        </property>  
        <property>  
            <name>dfs.replication</name>  
            <value>2</value>  
        </property>  
        <property>  
            <name>dfs.webhdfs.enabled</name>  
            <value>true</value>  
        </property>
         <property> 
                   <name>dfs.datanode.max.xcievers</name> 
                   <value>4096</value> 
         </property>      
         <property>
                   <name>dfs.nameservices</name>
                   <value>hacluster</value>
         </property>
         <property>
                   <name>dfs.ha.namenodes.hacluster</name>
                   <value>nn1,nn2</value>
         </property>
         <property>
                   <name>dfs.namenode.rpc-address.hacluster.nn1</name>
                   <value>zoo1:8020</value>
         </property>
         <property>
                    <name>dfs.namenode.rpc-address.hacluster.nn2</name>
                    <value>zoo2:8020</value>
         </property>
          <property>
                    <name>dfs.namenode.http-address.hacluster.nn1</name>
                    <value>zoo1:50070</value>
          </property>
          <property>
                    <name>dfs.namenode.http-address.hacluster.nn2</name>
                   <value>zoo2:50070</value>
          </property>
          <property>
                    <name>dfs.namenode.shared.edits.dir</name>
                    <value>qjournal://zoo2:8485;zoo3:8485;zoo4:8485/hacluster</value>
          </property>
          <property>
                     <name>dfs.client.failover.proxy.provider.hacluster</name>
                     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
          </property>
          <property>
                     <name>dfs.namenode.shared.edits.dir</name>
                     <value>qjournal://zoo2:8485;zoo3:8485;zoo4:8485/mycluster</value>
          </property>
          <property>
                     <name>dfs.ha.fencing.methods</name>
                     <value>sshfence</value>
          </property>
          <property>
                     <name>dfs.ha.fencing.ssh.private-key-files</name>
                     <value>/home/hadoop/.ssh/id_rsa</value>
          </property>
          <property>
                      <name>dfs.ha.automatic-failover.enabled</name>
                      <value>true</value>
          </property>
    </configuration>

    yarn-site.xml
    <configuration>
    <!-- Site specific YARN configuration properties -->
            <property>
                   <name>yarn.resourcemanager.ha.enabled</name>
                    <value>true</value>
            </property>
            <property>
                    <name>yarn.resourcemanager.cluster-id</name>
                    <value>yarn-ha</value>
            </property>
            <property>
                    <name>yarn.resourcemanager.ha.rm-ids</name>
                    <value>rm1,rm2</value>
            </property>
            <!-- RM-->
            <property>
                    <name>yarn.resourcemanager.hostname.rm1</name>
                    <value>zoo1</value>
            </property>
            <property>
                    <name>yarn.resourcemanager.hostname.rm2</name>
                    <value>zoo2</value>
            </property>
            <property>
                    <name>yarn.resourcemanager.recovery.enabled</name>
                    <value>true</value>
            </property>
            <property>
                     <name>yarn.resourcemanager.zk-address</name>
                     <value>zoo1:2181,zoo2:2181,zoo3:2181</value>
            </property>
             
            <property>
                    <name>yarn.resourcemanager.store.class</name>
                    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
    </configuration>

    maperd-site.xml
    <configuration>
       <property>
           <name>mapreduce.framework.name</name>
           <value>yarn</value>
       </property>
    </configuration>

     slaves 
    zoo2
    zoo3
    zoo4

    起動順序(厳密には順序)
    1.jnの起動
    hadoop-daemon.sh start journalnode

    2.最初のnn上zoo 1上でhdfsをフォーマットする
    hdfs namenode -format

    3.起動前にフォーマットしたnn,zoo 1で実行
    hadoop-daemon.sh start namenode

    4.別のnnでzoo 2運転
    hdfs namenode -bootstrapStandby

    5.hdfsのすべてのサービスを停止する
    stop-dfs.sh

    6.zk nodeを初期化し、そのうちの1つのnnで実行
    hdfs zkfc -formatZk

    7.hdfsのすべてのサービスを開始する
     start-dfs.sh

    8.実行
    start-yarn.sh

    これで各ノードのサービスはすべて起動して完了するはずです.
    まずzoo 1のhdfsページを見てみましょう.
    http://zoo1:50070
    zoo 1がactiveであることがわかります
    そしてzoo 2のページstandybyを見て
    次のテストでは、プライマリ・スタンバイの切り替えを行います.
    zoo 1でkillがnamenodeを落とす過程でzoo 2がactiveになったことがわかります.
    環境構築に成功