三台PC服务器部署Hadoop HA(Hadoop 高可用性架构)

写在前边的话:

        转载请注明出处:@http://blog.csdn.net/gamer_gyt,Thinkagmer 撰写

        之前是在自己电脑上部署的Hadoop集群,但并未涉及到HA配置,这次将集群迁移到PC服务器,但是问题来了,只有三台,但是我还想配置HA,PC服务器是CentOS6.5,原来想着在上边部署VM,从而部署HA集群,但经测试,未果,遂弃之,就想到了在三台机器上部署HA集群。

         hadoop伪分布部署参考:点击打开链接
         hadoop单机版部署参考:点击打开链接
         zookeeper,Hive,hbase的分布式部署参考:点击链接
         Spark,Sqoop,Mahout的分布式部署参考:点击链接

         步骤和部署hadoop集群(点击阅读)是一样的,只是这里加入了HA的一些配置,记录如下

         关于HA架构的知识请移步该篇博客:Hadoop 容错之1.X的单点故障 到 2.X的HA和HDFS Federation


一:架构说明

     IP                            hostname               role

    192.168.132.27       master1                  主节点

    192.168.132.28       master2                  备份主节点

    192.168.132.29       slaver1                    从节点


    zookeeper的三个节点集群,部署在这三台机子上


二:部署Zookeeper

       Hadoop HA的部署依赖于ZK来切换主节点,所以在部署Hadoop HA之前需要先把Zookeeper集群搞定,部署参考:点击阅读


三:部署HA

       1:文件配置

       除了配置文件mapred-site.xml,core-site.xml,hdfs-site.xml,yarn-site.xml之外和hadoo集群部署一样,这里不做陈述,可参考:点击阅读

       mapred-site.xml:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <configuration>  
  2.   <property>  
  3.     <name>mapreduce.framework.name</name>  
  4.     <value>yarn</value>  
  5.   </property>  
  6. </configuration>  

       core-site.xml:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <configuration>  
  2.   <!-- 指定hdfs的nameservice为ns -->  
  3.   <property>      
  4.       <name>fs.defaultFS</name>      
  5.       <value>hdfs://master</value>      
  6.       <!--1.x中为fs.default.name, 一定得是namenode的hostname或者 ip,并且不用加端口号(这里的名称与HA配置hdfs-site.xml中的dfs.nameservices必须保持一致) -->    
  7.   </property>  
  8.    
  9.   <property>    
  10.     <name>hadoop.tmp.dir</name>    
  11.     <value>/opt/bigdata/hadoop/tmp</value>    
  12.     <!-- 指定hadoop临时目录 -->  
  13.   </property>     
  14.   
  15.   <!-- 配置HA时才用配置该项 -->  
  16.   <property>  
  17.     <name>ha.zookeeper.quorum</name>  
  18.     <value>master1:2181,master2:2181,slaver1:2181</value>  
  19.     <!--各个ZK节点的IP/host,及客户端连接ZK的端口,该端口需与zoo.cfg中的 clientPort一致! -->  
  20.   </property>  
  21. </configuration>  

       hdfs-site.xml:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <configuration>  
  2. <property>    
  3.     <name>dfs.replication</name>    
  4.     <value>2</value>    
  5.   </property>    
  6.   <property>    
  7.     <name>dfs.namenode.name.dir</name>    
  8.     <value>file:///opt/bigdata/hadoop/dfs/name</value>    
  9.   </property>    
  10.   <property>    
  11.     <name>dfs.datanode.data.dir</name>    
  12.     <value>file:///opt/bigdata/hadoop/dfs/data</value>    
  13.   </property>    
  14.   <property>  
  15.     <name>dfs.webhdfs.enabled</name>  
  16.     <value>true</value>  
  17.     <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->   
  18.   </property>  
  19.   
  20.   <!-- HA配置需要加如下配置-->  
  21.   <property>  
  22.     <name>dfs.nameservices</name>  
  23.     <value>master</value>  
  24.     <!--给hdfs集群起名字,这个名字必须和core-site中的统一,且下面也会用到该名字,需要和core-site.xml中的保持一致 -->  
  25.   </property>  
  26.   
  27.   <property>  
  28.     <name>dfs.ha.namenodes.master</name>  
  29.     <value>nn1,nn2</value>  
  30.     <!-- master1下面有两个NameNode,分别是nn1,nn2,指定NameService是cluster1时的namenode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可 -->  
  31.   </property>  
  32.   
  33.   <property>  
  34.     <name>dfs.namenode.rpc-address.master.nn1</name>  
  35.     <value>master1:9000</value>  
  36.     <!-- nn1的RPC通信地址 -->  
  37.   </property>  
  38.   
  39.   <property>  
  40.     <name>dfs.namenode.rpc-address.master.nn2</name>  
  41.     <value>master2:9000</value>  
  42.     <!-- nn2的RPC通信地址 -->  
  43.   </property>  
  44.   
  45.   <property>  
  46.     <name>dfs.namenode.http-address.master.nn1</name>  
  47.     <value>master1:50070</value>  
  48.     <!-- nn1的http通信地址 -->  
  49.   </property>  
  50.   <property>  
  51.     <name>dfs.namenode.http-address.master.nn2</name>  
  52.     <value>master2:50070</value>  
  53.     <!-- nn2的http通信地址 -->  
  54.   </property>  
  55.   
  56.   <property>  
  57.     <name>dfs.namenode.servicerpc-address.master.nn1</name>  
  58.     <value>master1:53310</value>  
  59.   </property>  
  60.   
  61.   <property>  
  62.     <name>dfs.namenode.servicerpc-address.master.nn2</name>  
  63.     <value>master2:53310</value>  
  64.   </property>  
  65.   
  66.   <property>  
  67.     <name>dfs.namenode.shared.edits.dir</name>  
  68.     <value>qjournal://master1:8485;master2:8485;slaver1:8485/master</value>  
  69.     <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->  
  70.   </property>   
  71.   
  72.   <property>  
  73.     <name>dfs.journalnode.edits.dir</name>  
  74.     <value>/opt/bigdata/hadoop/dfs/jndata</value>  
  75.     <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  
  76.   </property>  
  77.   
  78.   <property>  
  79.     <name>dfs.ha.automatic-failover.enabled</name>    
  80.     <value>true</value>  
  81.     <!-- 开启NameNode失败自动切换 -->  
  82.   </property>  
  83.   
  84.   <property>  
  85.     <name>dfs.client.failover.proxy.provider.master</name>  
  86.     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
  87.     <!-- 配置失败自动切换实现方式 -->  
  88.   </property>  
  89.   
  90.   <property>  
  91.     <name>dfs.ha.fencing.methods</name>  
  92.     <value>  
  93.       sshfence  
  94.       shell(/bin/true)  
  95.     </value>  
  96.     <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->  
  97.   </property>  
  98.   
  99.   <property>  
  100.     <name>dfs.ha.fencing.ssh.private-key-files</name>  
  101.     <value>/root/.ssh/id_rsa</value>  
  102.     <!-- 使用sshfence隔离机制时需要ssh免登陆 -->  
  103.   </property>  
  104.   
  105.   <property>  
  106.     <name>dfs.ha.fencing.ssh.connect-timeout</name>  
  107.     <value>3000</value>  
  108.     <!-- 配置sshfence隔离机制超时时间 -->  
  109.   </property>  
  110.   
  111. </configuration>  

       yarn-site.xml:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <configuration>  
  2.   
  3. <!-- Site specific YARN configuration properties -->  
  4.   
  5.   <property>  
  6.     <name>yarn.resourcemanager.ha.enabled</name>  
  7.     <value>true</value>  
  8.     <!-- 开启RM高可用 -->  
  9.   </property>  
  10.     
  11.   <property>  
  12.     <!--启动自动故障转移,默认为false-->  
  13.     <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>  
  14.     <value>true</value>  
  15.   </property>  
  16.   
  17.   <property>  
  18.     <!--启用一个内嵌的故障转移,与ZKRMStateStore一起使用。-->  
  19.     <name>yarn.resourcemanager.ha.automatic-failover.embedded</name>  
  20.     <value>true</value>  
  21.   </property>  
  22.    
  23.   <property>  
  24.     <name>yarn.resourcemanager.cluster-id</name>  
  25.     <value>yrc</value>  
  26.     <!-- 指定RM的cluster id -->  
  27.   </property>  
  28.   
  29.   <property>  
  30.     <name>yarn.resourcemanager.ha.rm-ids</name>  
  31.     <value>rm1,rm2</value>  
  32.     <!-- 指定RM的名字 -->  
  33.   </property>  
  34.    
  35.   <property>  
  36.     <name>yarn.resourcemanager.hostname.rm1</name>  
  37.     <value>master1</value>  
  38.     <!-- 分别指定RM的地址 -->  
  39.   </property>  
  40.     
  41.   <property>  
  42.     <name>yarn.resourcemanager.hostname.rm2</name>  
  43.     <value>master2</value>  
  44.     <!-- 分别指定RM的地址 -->  
  45.   </property>  
  46.   
  47.   <property>  
  48.     <name>yarn.resourcemanager.ha.id</name>  
  49.     <value>rm1</value>       
  50.     <!--<span style="font-size:18px;color:#ff0000;"><strong>如果是在主NN上 这里写rm1   如果这个配置文件是在备NN上 这里写rm2,否则RM的高可用会出问题</strong></span>-->  
  51.     <description>If we want to launch more than one RM in single node, we need this configuration</description>  
  52.   </property>   
  53.   
  54.   <property>    
  55.     <name>yarn.resourcemanager.recovery.enabled</name>    
  56.     <value>true</value>    
  57.   </property>    
  58.   
  59.   <property>    
  60.     <name>yarn.resourcemanager.store.class</name>    
  61.     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>    
  62.   </property>      
  63.   
  64.   <property>  
  65.     <name>yarn.resourcemanager.zk-address</name>  
  66.     <value>master1:2181,master2:2181,slaver1:2181</value>  
  67.     <!-- 指定zk集群地址 -->  
  68.   </property>  
  69.   
  70.   <property>  
  71.     <name>yarn.nodemanager.aux-services</name>  
  72.     <value>mapreduce_shuffle</value>  
  73.   </property>  
  74.   
  75. </configuration>  

       2:启动服务,测试NameNode的自动切换

       PS:一定要注意启动的顺序,否则会出现各种各样的错误,亲测

       每台机器上启动Zookeeper:bin/zkServer.sh start 

       zookeeper集群格式化(任意一个主节点上执行即可):bin/hdfs zkfc -formatZK 

       每台机器上启动 journalnode:sbin/hadoop-daemon.sh start journalnode (如果这里不启动的话,在进行hdfs格式化的时候就会报错,同时这个进程只需在格式化的时候启动,后续启动服务则不需要)

       hdfs集群格式化(master1上进行):bin/hadoop namenode -format

       看到 “0” 表示成功了

       

       master1机器上启动服务:sbin/start-dfs.sh      sbin/start-yarn.sh

       执行jps查看进行如下(master1,master2,slaver1):

            

       master1(192.168.132.27)的web界面显示如下:

       

         备用NN同步主NN的元数据信息(master2上执行): bin/hdfs namenode -bootstrapStandby

         启动备用NN(master2上执行): sbin/hadoop-daemon.sh start namenode

         执行jps(master2上执行):

         

         Web访问:



         测试主NN和备用NN的切换:kill掉主NN进程  kill namenode_id

         再次刷新master2对应的web,实现自动切换:

    


         3:测试Resourcemanager自动切换

              访问主NN的8088端口如下:

    

            备用NN的8088端口:

      

       kill 掉主NN的resourcemanager服务再次访问从NN的8088端口

       

        OK!大功告成

四:遇见的问题

       1:NameNode格式化失败

            错误:failed on connection exception: Java.NET.ConnectException: Connection refused

            解决办法:先启动Zookeeper集群,在用sbin/hadoop-daemon.sh start journalnode 启动各个NameNode上的JournalNode进程,然后再进行格式化

            该错误参考博客:http://blog.csdn.Net/u014729236/article/details/44944773

     2:Web显示live nodes 为 0

        

        解决办法:注释掉机子上 hosts文件中的原本的两行

        

     3:master2的NameNode和 ResourceManager不能启动

          查看日志发现错误
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 2016-08-30 06:10:57,558 INFO org.apache.hadoop.http.HttpServer2: HttpServer.start() threw a non Bind IOException  
  2. java.net.BindException: Port in use: master1:8088  
  3.         at org.apache.hadoop.http.HttpServer2.openListeners(HttpServer2.java:919)  
  4.         at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:856)  
  5.         at org.apache.hadoop.yarn.webapp.WebApps$Builder.start(WebApps.java:274)  
  6.         at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.startWepApp(ResourceManager.java:974)  
  7.         at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.serviceStart(ResourceManager.java:1074)  
  8.         at org.apache.hadoop.service.AbstractService.start(AbstractService.java:193)  
  9.         at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.main(ResourceManager.java:1208)  
  10. Caused by: java.net.BindException: Cannot assign requested address  
  11.         at sun.nio.ch.Net.bind0(Native Method)  
  12.         at sun.nio.ch.Net.bind(Net.java:444)  
  13.         at sun.nio.ch.Net.bind(Net.java:436)  
  14.         at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)  
  15.         at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)  
  16.         at org.mortbay.jetty.nio.SelectChannelConnector.open(SelectChannelConnector.java:216)  
  17.         at org.apache.hadoop.http.HttpServer2.openListeners(HttpServer2.java:914)  
  18.         ... 6 more  
          端口被占用了,这时候要修改yarn-site.xml 中
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <property>  
  2.    <name>yarn.resourcemanager.ha.id</name>  
  3.    <value>rm2</value>  
  4.    <description>If we want to launch more than one RM in single node, we need this configuration</description>  
  5.  </property>  
         此时再次启动OK

      4:NameNode不能自动切换

           hdfs-site.xml通过dfs.ha.fencing.methods控制自动切换的方法, sshfence是系统默认的并不能自动切换,这里可以换成
[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <property>  
  2.     <name>dfs.ha.fencing.methods</name>  
  3.     <value>shell(/bin/true)</value>  
  4.     <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->  
  5.   </property>  
 

五:总结

       在配置的过程中遇到了很多问题,参考了很多资料,但很多事情就是看着别人很顺利的完成,可是到了你这里就会出现各种错误,殊不知别人也是经历过各种调试才出的结果,所以不要灰心,在配置的过程中多看看日志,所有的错误都会在日志中显示,相信你会成功的。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值