Hadoop笔记之七——hadoop HA高可用搭建

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可能不一样,这是用户目录,如果保证用户名都一样就不必在意了-->        

扫描二维码关注公众号,回复: 3898028 查看本文章


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 secondarynamenode@snamenode:/opt/modules/hadoop-2.5.0/etc/hadoop/
            
            c. 删除masters文件
            $ rm -rf masters
            
            d.修改slaves
            $ vim slaves
            $ scp slaves secondarynamenode@snamenode:/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
            
 

猜你喜欢

转载自blog.csdn.net/qq_35946969/article/details/83653954