天天看點

Hadoop筆記之七——hadoop HA高可用搭建0、規劃好機器1、先在其中一台伺服器上修改配置檔案

0、規劃好機器

3台 虛拟機Linux

hadoop.lele.org  4G 記憶體 40G (機子配置較差 1G) NameNode  ResourceManager   DataNode  NodeManager  zk

hadoop.lele.org02   2G 記憶體 40G (1G)               DataNode                            NodeManager    zk   journalNode

hadoop.lele.org03   2G 記憶體 40G (1G)               DataNode                             NodeManager  zk   journalNode

hadoop.lele.org04   2G 記憶體 40G                      NameNode                     DataNode                     journalNode                    

1、先在其中一台伺服器上修改配置檔案

            hadoop.lele.org

1)hdfs-site.xml 

<property>

    <name>dfs.nameservices</name>

    <value>dragon</value>

</property>

<property>

<!-- 注意namenodes後面需要與上面dfs.nameservices的屬性值保持一緻-->

  <name>dfs.ha.namenodes.dragon</name>

  <value>nn1,nn2</value>

</property>

<property>

  <name>dfs.namenode.rpc-address.dragon.nn1</name>

  <value>hadoop.lele.org:8020</value>

</property>

<property>

  <name>dfs.namenode.rpc-address.dragon.nn2</name>

  <value>hadoop.lele.org02:8020</value>

</property>

<property>

  <name>dfs.namenode.http-address.dragon.nn1</name>

  <value>hadoop.lele.org:50070</value>

</property>

<property>

  <name>dfs.namenode.http-address.dragon.nn2</name>

  <value>hadoop.lele.org02:50070</value>

</property>

<!-- JournalNode存儲edits檔案的本地路徑

    journalnode的作用是在HA的兩個namenode之間保持editlog的共享同步。

    zookeeper用于兩個namenode之間互相的錯誤感覺(active的掉了,standby的可以看見)。

-->

<property>

  <name>dfs.namenode.shared.edits.dir</name>

  <value>qjournal://hadoop.lele.org:8485;hadoop.lele.org02:8485;hadoop.lele.org03:8485/dragon</value>

</property>

<property>

  <name>dfs.client.failover.proxy.provider.dragon</name>

  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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.permissions</name>

  <value>false</value>

</property>

<!--這裡的namenode可能不一樣,這是使用者目錄,如果保證使用者名都一樣就不必在意了-->        

2)core-site.xml

将fs.defaultFS屬性改為與hdfs-site.xml裡面的dfs.nameservices值一緻

<property>

  <name>fs.defaultFS</name>

  <value>hdfs://dragon</value>

</property>

3)先啟動叢集

            scp分發到其他節點

            a.新增節點 從其他節點scp hadoop安裝檔案的時候

            注意要把原節點上的資料存放目錄先删掉

            $ rm -r -f tmp/

            b.舊節點:

            $ scp core-site.xml hdfs-site.xml [email protected]:/opt/modules/hadoop-2.5.0/etc/hadoop/

            c. 删除masters檔案

            $ rm -rf masters

            d.修改slaves

            $ vim slaves

            $ scp slaves [email protected]:/opt/modules/hadoop-2.5.0/etc/hadoop/

slaves

            e.先啟動JournalNode(在2,3,4)

            $ sbin/hadoop-daemon.sh start journalnode

            f.初始化journalnode

            在原來的NameNode節點上執行初始化指令

            bin/hdfs namenode -initializeSharedEdits

            初始化過程

            其實journalnode從 /opt/modules/hadoop/hadoop-2.5.0/tmp/data/dfs/name

            NameNode中繼資料目錄中拿到edits檔案

            初始化時NameNode程序一定是關閉的,否則

        16/06/04 11:21:26 INFO common.Storage: Cannot lock storage /opt/modules/hadoop/hadoop-2.5.0/tmp/data/dfs/name. The directory is already locked

16/06/04 11:21:26 WARN namenode.FSNamesystem: Encountered exception loading fsimage

java.io.IOException: Cannot lock storage /opt/modules/hadoop/hadoop-2.5.0/tmp/data/dfs/name. The directory is already locked

    at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.lock(Storage.java:674)

    at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.analyzeStorage(Storage.java:493)

    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:306)

    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:202)

    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:955)

    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:700)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.initializeSharedEdits(NameNode.java:1007)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1384)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1473)

16/06/04 11:21:26 ERROR namenode.NameNode: Could not initialize shared edits dir

java.io.IOException: Cannot lock storage /opt/modules/hadoop/hadoop-2.5.0/tmp/data/dfs/name. The directory is already locked

    at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.lock(Storage.java:674)

    at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.analyzeStorage(Storage.java:493)

    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:306)

    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:202)

    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:955)

    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:700)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.initializeSharedEdits(NameNode.java:1007)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1384)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1473)

16/06/04 11:21:26 INFO util.ExitUtil: Exiting with status 1

    防火牆未關閉導緻異常:

        192.168.199.152:8485: No Route to Host from  s-hadoop01.beifeng.com/192.168.199.144 to s-hadoop04.beifeng.com:8485 failed on socket timeout exception: java.net.NoRouteToHostException: No route to host; For more details see:  http://wiki.apache.org/hadoop/NoRouteToHost

    at org.apache.hadoop.hdfs.qjournal.client.QuorumException.create(QuorumException.java:81)

    at org.apache.hadoop.hdfs.qjournal.client.QuorumCall.rethrowException(QuorumCall.java:223)

    at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.hasSomeData(QuorumJournalManager.java:232)

    at org.apache.hadoop.hdfs.server.common.Storage.confirmFormat(Storage.java:875)

    at org.apache.hadoop.hdfs.server.namenode.FSImage.confirmFormat(FSImage.java:171)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.initializeSharedEdits(NameNode.java:1020)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1384)

    at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1473)

16/06/04 11:24:16 INFO util.ExitUtil: Exiting with status 1

            g.另外一台namenode進行fsiamge檔案同步

            (如果原來的namenode之前沒有格式化(從頭搭建),那麼先

            對該NameNode進行格式化

            如果基于完全分布式進行更新到HA就不允許再格式化)

            先啟動原先的namenode

            $ sbin/hadoop-daemon.sh start namenode

            然後在第二的namenode上面,到第一個作為NameNode的伺服器上進行fsiamge檔案同步

            $ bin/hdfs namenode -bootstrapStandby

            啟動namenode

            sbin/hadoop-daemon.sh start namenode

            異常:原因:安全模式@解決辦法是在hdfs.site中加入dfs.permissions屬性,設定為false。:

17/07/14 03:31:58 FATAL ha.BootstrapStandby: Unable to fetch namespace information from active NN at namenode/192.168.1.196:8020: Access denied for user namenode2. Superuser privilege is required

    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkSuperuserPrivilege(FSPermissionChecker.java:109)

    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkSuperuserPrivilege(FSNamesystem.java:5873)

    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.versionRequest(NameNodeRpcServer.java:1113)

    at org.apache.hadoop.hdfs.protocolPB.NamenodeProtocolServerSideTranslatorPB.versionRequest(NamenodeProtocolServerSideTranslatorPB.java:218)

    at org.apache.hadoop.hdfs.protocol.proto.NamenodeProtocolProtos$NamenodeProtocolService$2.callBlockingMethod(NamenodeProtocolProtos.java:11216)

    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585)

    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928)

    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2013)

    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2009)

    at java.security.AccessController.doPrivileged(Native Method)

    at javax.security.auth.Subject.doAs(Subject.java:415)

    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)

    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2007)17/07/14 03:31:58 INFO util.ExitUtil: Exiting with status 2

    17/07/14 03:31:58 INFO namenode.NameNode: SHUTDOWN_MSG: 

            h.把所有DataNode啟動起來

            通過web頁面通路發現兩個NameNode的狀态都是standby狀态

            i.手動進行active狀态切換

            $ bin/hdfs haadmin -transitionToActive nn1

            $ bin/hdfs haadmin -getServiceState nn1

            j.NameNode節點失效自動檢測配置(主從切換)

4)自動失效檢測配置

a.修改hdfs-site.xml

<!-- 打開自動失效檢測功能-->

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>true</value>

</property>

b.修改core-site.xml

<property>

<name>ha.zookeeper.quorum</name>

<value>namenode:2181,datanode:2181,datanode2:2181</value>

</property>

c.scp 分發改好後的配置檔案到其他節點

d.先啟動zk叢集,格式化zk的用戶端

             格式化:在zk叢集上建立好ha的znode,在其中一個NameNode上進行

              $ bin/hdfs zkfc -formatZK

                列印日志看下:

              Successfully created /hadoop-ha/beifeng in ZK.

e.啟動zkfc(在兩個NameNode上啟動)

              $ sbin/hadoop-daemon.sh start zkfc

              Request from ZK failover controller at 192.168.199.144 denied since automatic HA is not enabled

f.先關閉整個叢集

            $ sbin/stop-dfs.sh 

h.啟動$ sbin/start-dfs.sh

繼續閱讀