1. 程式人生 > >配置NameNode HA

配置NameNode HA

1. 安裝zookeeper
請見http://blog.csdn.net/kiwi_kid/article/details/53496992

2,修改相關配置檔案

core-site.xml 檔案

<configuration>
    <property>
          <name>fs.defaultFS</name>
          <value>hdfs://mycluster</value>
    </property>
    <property>    
              <name>ha.zookeeper.quorum</name>    
              <value>rdb01:2181,rdb02:2181,rdb03:2181</value>   
       </property>
        <property>  
               <name>dfs.ha.automatic-failover.enabled</name>  
               <value>true</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/root/.ssh/id_rsa</value>
        </property>
        <property>
          <name>ha.zookeeper.session-timeout.ms</name>
          <value>60000</value>
        </property>
        <property>
          <name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
          <value>60000</value>
        </property>
        <property>
          <name>ipc.client.connect.timeout</name>
          <value>20000</value>
        </property>

</configuration>


hdfs-site.xml

<configuration>
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
     <value>rdb01:9000</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>rdb02:9000</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
       <value>rdb01:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>rdb02:50070</value>
    </property>
    <property>
       <name>dfs.namenode.servicerpc-address.mycluster.nn1</name>
       <value>rdb01:53310</value>
    </property>
    <property>
       <name>dfs.namenode.servicerpc-address.mycluster.nn2</name>
       <value>rdb02:53310</value>
    </property>
    <property>  
       <name>dfs.ha.automatic-failover.enabled</name>  
       <value>true</value>  
    </property> 
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://rdb9¥01:8485;rdb02:8485;rdb03:8485/mycluster</value>
    </property>
     <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/hadoop/journal/data</value>
     </property>
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <name>dfs.replication</name> 
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>       
        <value>file:///hadoop/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///hadoop/data</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property> 
    <property>
    <name>dfs.permissions.enable</name>
    <value>false</value>
    </property>
    <property>
       <name>dfs.permissions</name>
       <value>false</value>
    </property>
    <property>
       <name>dfs.image.transfer.bandwidthPerSec</name>
       <value>1048576</value>
    </property>
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>shell(/bin/true)</value>
    </property>


    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/root/.ssh/id_rsa</value>
    </property>


yarn-site.xml

        <property>
                <name>yarn.resourcemanager.connect.retry-interval.ms</name>
                <value>60000</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>rm-cluster</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.id</name>   
                <value>rm1</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>rdb01</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>rdb02</value>
        </property>
        <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.resourcemanager.store.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>rdb01:2181,rdb02:2181,rdb03:2181</value>
        </property>
        <property>
                <name>yarn.resourcemanager.address.rm1</name>
                <value>${yarn.resourcemanager.hostname.rm1}:23140</value>
        </property>
        <property>
                <name>yarn.resourcemanager.scheduler.address.rm1</name>
                <value>${yarn.resourcemanager.hostname.rm1}:23130</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.https.address.rm1</name>
                <value>${yarn.resourcemanager.hostname.rm1}:23189</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address.rm1</name>
                <value>${yarn.resourcemanager.hostname.rm1}:23188</value>
        </property>
        <property>
                <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
                <value>${yarn.resourcemanager.hostname.rm1}:23125</value>
        </property>
        <property>
                <name>yarn.resourcemanager.admin.address.rm1</name>
                <value>${yarn.resourcemanager.hostname.rm1}:23141</value>
        </property>


        <property>
                <name>yarn.resourcemanager.address.rm2</name>
                <value>${yarn.resourcemanager.hostname.rm2}:23140</value>
        </property>
        <property>
                <name>yarn.resourcemanager.scheduler.address.rm2</name>
                <value>${yarn.resourcemanager.hostname.rm2}:23130</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.https.address.rm2</name>
                <value>${yarn.resourcemanager.hostname.rm2}:23189</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address.rm2</name>
                <value>${yarn.resourcemanager.hostname.rm2}:23188</value>
        </property>
        <property>
                <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
                <value>${yarn.resourcemanager.hostname.rm2}:23125</value>
        </property>
        <property>
                <name>yarn.resourcemanager.admin.address.rm2</name>
                <value>${yarn.resourcemanager.hostname.rm2}:23141</value>
        </property>
        <property>
                <name>yarn.nodemanager.local-dirs</name>
                <value>/home/hadoop/logs/yarn_local</value>
        </property>
        <property>
                <name>yarn.nodemanager.log-dirs</name>
                <value>/home/hadoop/logs/yarn_log</value>
        </property>
        <property>
                <name>yarn.nodemanager.remote-app-log-dir</name>
                <value>/home/hadoop/logs/yarn_remotelog</value>
        </property>
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.nodemanager.resource.memory-mb</name>
                <value>2048</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-pmem-ratio</name>
                <value>4.2</value>
        </property>
        <property>
                <name>yarn.nodemanager.resource.cpu-vcores</name>
                <value>2</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
                <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>
</configuration>


mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>rdb01:10020,rdb02:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>rdb01:19888,rdb02:19888</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.staging-dir</name>
        <value>/tmp/hadoop-yarn/staging</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.intermediate-done-dir</name>
        <value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value>
    </property>
    <property>
        <name>mapreduce.task.io.sort.factor</name>
        <value>100</value>
    </property>
    <property>
        <name>mapreduce.reduce.shuffle.parallelcopies</name>
        <value>10</value>
    </property>
</configuration>


3, 啟動相關服務
  (1)首先啟動zookeeper叢集
  由於我的節點是5個,所以我是將所有的節點都用來作為zookeeper來作為zookeeper的叢集。因此在各節點上執行如下命令即可。
  zkServer.sh start
  所有的節點都啟動zookeeper服務之後,zookeeper叢集就已經啟動了。
  (2)對zookeeper叢集進行格式化
    hdfs zkfc -formatZK
  (3)啟動JournalNode程序,注意這個在第一次的時候必須要按照這個順序執行。否則後面hdfs格式化不了。
    同樣,我也是將所有的節點都作為了journalnode的節點,於是在所有的節點上執行下面的命令來啟動journalnode。
      hadoop-daemon.sh  start journalnode
  (4)格式化hadoop的叢集,注意,第一次格式化必須首先啟動上面的journalnode程序。並且,hadoop格式化的執行在某一個namenode節點上進行,在這裡我選擇的是hadoop1上執行。
        hdfs  namenode -format mycluster
  (5)啟動第(4)步格式化之後的namenode。
      也就是說在第(4)步上面格式化後的namenode節點上啟動namenode程序。
        hadoop-daemon.sh start namenode
  (6)在另外一個namenode節點上按順序執行如下兩個命令來啟動namenode程序。(本文中是hadoop5上執行)
      hdfs namenode -bootstrapStandby
      hadoop-daemon.sh start namenode
  (7)在一個namenode節點上執行一下兩個命令啟動所有的程序:
      start-dfs.sh
      start-yarn.sh
  (8)此時啟動完之後,我們可以通過下面的命令來檢視兩個namenode的狀態是否是standby或者是active
[[email protected] data]# hdfs haadmin -getServiceState nn1
active
[[email protected] data]# hdfs haadmin -getServiceState nn2
standby
這裡的nn1和nn2就是上面的配置檔案中所設定的。nn1對應的就是hadoop1,nn2對應的就是hadoop5。
4、檢驗自動切換,通過kill active的namenode來驗證namenode是否能自動切換。
  (1)通過上面步驟(8)檢視到對應的那個namenode的狀態是active,在該namenode節點上檢視所有的程序。如下所示:
  (2)在active的namenode節點上,執行 kill -9 7048  。實際上這一步可以直接將該節點重啟也可以。
  (3)在standby的namenode節點上檢視其狀態的改變。
     hdfs haadmin -getServiceState nn1 
   我們可以看到其對應的狀態從standby的狀態轉變為active的狀態了。
5、通過上傳檔案來檢測HDFS的健康狀態
  執行 :hadoop fs -put /hadoop-2.6.0/etc/hadoop/hdfs-site.xml /
  然後可以通過web檢視hdfs-site.xml


6、測試在作業執行時,namendoe掛掉了是否能自動切換,並且還能正常執行作業?
準備一個2G的檔案,我準備了一不電影zr.MP4,2.13G準備上傳上HDFS中,在上傳的過程中kill 掉active的namenode 檢視最終的執行結果。
  通過在在standby的namenode節點上執行:hadoop fs -put zr.mp4 /  。
  在它執行的過程中,在active的namenode節點上執行:kill -9  7048  (這裡的7048就是namenode程序ID)。在執行過程中,我們可以看到如下圖所示:




通過上圖可以看出,最終zr.mp4上傳成功了。至此HDFS的HA方案已經完成。完全可以投入使用。