hadoop2.6.0高可靠及yarn 高可靠搭建

时间:2022-01-30 04:45:27
以前用hadoop2.2.0只搭建了hadoop的高可用,但在hadoop2.2.0中始终没有完成YARN HA的搭建,直接下载了hadoop最新稳定版本2.6.0完成了YARN HA及HADOOP HA的搭建流程,没有仔细看hadoop的官方文档,貌似hadoop2.2.0不支持YARN HA,如果说错了谢谢指正呀,下面总结一下我的搭建流程:
首先完成虚拟机的搭建:
机器名 IP 安装软件 运行进程
namenode1 192.168.3.161 hadoop NameNode、DFSZKFailoverController、ResourceManager
namenode2 192.168.3.162 hadoop NameNode、DFSZKFailoverController、ResourceManager
datanode1 192.168.3.163 hadoop,zookeeper DataNode、QuorumPeerMain、JournalNode、NodeManager
datanode2 192.168.3.164 hadoop,zookeeper DataNode、QuorumPeerMain、JournalNode、NodeManager
datanode3 192.168.3.165 hadoop DataNode、NodeManager
datanode4 192.168.3.166 hadoop,zookeeper DataNode、QuorumPeerMain、JournalNode、NodeManager
说明:
在hadoop2.X中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM(由cloudra提出,原理类似zookeeper)。这里我使用QJM完成。主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode
虚拟机安装linux系统,我这里用的是centos6.4
使用root用户修改/etc/hosts文件,如下:
  1. 192.168.3.161 namenode1
  2. 192.168.3.162 namenode2
  3. 192.168.3.163 datanode1
  4. 192.168.3.164 datanode2
  5. 192.168.3.165 datanode3
  6. 192.168.3.166 datanode4
安装jdk1.7和hadoop并配置环境变量,可以配置全局的(修改/etc/profile)也可以配置当前用户的(修改~/.bashrc文件),这里我配置是全局的环境变量
安装jdk的过程直接解压tar xzvf jdk.tar, 这里不做说明了,列出/etc/profile文件中末尾添加的内容如下:
  1. export JAVA_HOME=/usr/java/jdk1.7.0_67
  2. export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  3. export PATH=$PATH:$JAVA_HOME/bin
  4. export HADOOP_HOME=/home/hadoop/hadoop_installs/hadoop-2.6.0
使用root用户关闭防火墙和selinux
  1. service iptables stop

centos7好像把防火墙修改成firewalld,可以试试service firewalld stop

  1. chkconfig iptables off
修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器
创建hadoop用户组及hadoop用户并完成.ssh免密码登录
在每台虚拟机中通过hadoop用户执行ssh-keygen -t rsa会在~/.ssh/目录中生成两个文件id_rsa和id_rsa.pub,
如果想从namenode1免密码登录到namenode2中要在namenode1中执行ssh-copy-id -i ~/.ssh/id_rsa.pubhadoop@namenode2
(注意:些命令中的-i一定加上否则之后的一些操作会出现ssh_exchange_identification: Connection closed by remote host这样的错误),
这个命令完成后会在namenode2的~/.ssh/目录下生成文件authorized_keys,此时可以从namenode1直接ssh到namenode2了,建议在每台机器包括namenode2本身都执行ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@namenode2然后把生成的authorized_keys复制到集群中每个机器上实现任何机器之间都可以免密码登录。
完成安装zookeeper3.4.5集群:主要作用是用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态
解压zookeeper包在zookeeper3.4.5/conf/目录执行mv zoo_sample.cfg zoo.cfg,之后修改zoo.cfg文件,如下:
修改dataDir=/hadoop/zookeeper-3.4.5/tmp(zookeeper修改源数据的地方,包括myid文件)
文件最后添加
  1. server.1=datanode1:2888:3888
  2. server.2=datanode2:2888:3888
  3. server.3=datanode4:2888:3888
保存退出 
然后分别在datanode1,2,4节点中创建一个tmp文件夹 ,mkdir /hadoop/zookeeper-3.4.5/tmp ,再创建一个空文件  touch /hadoop/zookeeper-3.4.5/tmp/myid 最后向该文件写入ID,datanode1执行echo 1 > /hadoop/zookeeper-3.4.5/tmp/myid,datanode1执行echo 2 > /hadoop/zookeeper-3.4.5/tmp/myid,datanode3执行echo 3 > /hadoop/zookeeper-3.4.5/tmp/myid
安装配置hadoop2.6.0集群:
解压文件后配置HDFS(注意:hadoop2.X之后所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下),需要修改文件如下:
修改文件hadoo-env.sh
  1. export JAVA_HOME=/usr/java/jdk1.7.0_67
  2. export HADOOP_LOG_DIR=/data/log/hadoop
指定日志存放目录
修改文件core-site.xml
  1. <configuration>
  2.   <!-- 指定hdfs的nameservice为ns1,是NameNode的URI。hdfs://主机名:端口/ -->
  3. <property>
  4. <name>fs.defaultFS</name>
  5. <value>hdfs://gagcluster</value>
  6. </property>
  7. <property>
  8. <name>io.file.buffer.size</name>
  9. <value>131072</value>
  10. </property>
  11. <!-- 指定hadoop临时目录 -->
  12. <property>
  13. <name>hadoop.tmp.dir</name>
  14. <value>file:/data/hadoop/tmp</value>
  15. <description>Abase for other temporary directories.</description>
  16. </property>
  17. <!--指定可以在任何IP访问-->
  18. <property>
  19. <name>hadoop.proxyuser.hduser.hosts</name>
  20. <value>*</value>
  21. </property>
  22. <!--指定所有用户可以访问-->
  23. <property>
  24. <name>hadoop.proxyuser.hduser.groups</name>
  25. <value>*</value>
  26. </property>
  27. <!-- 指定zookeeper地址 -->
  28. <property>
  29. <name>ha.zookeeper.quorum</name>
  30. <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value>
  31. </property>
  32. </configuration>
修改文件hdfs-site.xml
  1. <configuration>
  2. <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
  3. <property>
  4. <name>dfs.nameservices</name>
  5. <value>gagcluster</value>
  6. </property>
  7. <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
  8. <property>
  9. <name>dfs.ha.namenodes.gagcluster</name>
  10. <value>nn1,nn2</value>
  11. </property>
  12. <!-- nn1的RPC通信地址 -->
  13. <property>
  14. <name>dfs.namenode.rpc-address.gagcluster.nn1</name>
  15. <value>namenode1:9000</value>
  16. </property>
  17. <!-- nn2的RPC通信地址 -->
  18. <property>
  19. <name>dfs.namenode.rpc-address.gagcluster.nn2</name>
  20. <value>namenode2:9000</value>
  21. </property>
  22. <!-- nn1的http通信地址 -->
  23. <property>
  24. <name>dfs.namenode.http-address.gagcluster.nn1</name>
  25. <value>namenode1:50070</value>
  26. </property>
  27. <!-- nn2的http通信地址 -->
  28. <property>
  29. <name>dfs.namenode.http-address.gagcluster.nn2</name>
  30. <value>namenode2:50070</value>
  31. </property>
  32. <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
  33. <property>
  34. <name>dfs.namenode.shared.edits.dir</name>
  35. <value>qjournal://dataNode1:8485;datanode2:8485;datanode4:8485/gagcluster</value>
  36. </property>
  37. <!-- 配置失败自动切换实现方式 -->
  38. <property>
  39. <name>dfs.client.failover.proxy.provider.gagcluster</name>
  40. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  41. </property>
  42. <!-- 配置隔离机制 -->
  43. <property>
  44. <name>dfs.ha.fencing.methods</name>
  45. <value>sshfence</value>
  46. </property>
  47. <!-- 使用隔离机制时需要ssh免密码登陆 -->
  48. <property>
  49. <name>dfs.ha.fencing.ssh.private-key-files</name>
  50. <value>/home/hadoop/.ssh/id_rsa</value>
  51. </property>
  52. <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
  53. <property>
  54. <name>dfs.journalnode.edits.dir</name>
  55. <value>/data/hadoop/tmp/journal</value>
  56. </property>
  57. <!--指定支持高可用自动切换机制-->
  58. <property>
  59. <name>dfs.ha.automatic-failover.enabled</name>
  60. <value>true</value>
  61. </property>
  62. <!--指定namenode名称空间的存储地址-->
  63. <property>
  64. <name>dfs.namenode.name.dir</name>
  65. <value>file:/data/hadoop/dfs/name</value>
  66. </property>
  67. <!--指定datanode数据存储地址-->
  68. <property>
  69. <name>dfs.datanode.data.dir</name>
  70. <value>file:/data/hadoop/dfs/data</value>
  71. </property>
  72. <!--指定数据冗余份数-->
  73. <property>
  74. <name>dfs.replication</name>
  75. <value>3</value>
  76. </property>
  77. <!--指定可以通过web访问hdfs目录-->
  78. <property>
  79. <name>dfs.webhdfs.enabled</name>
  80. <value>true</value>
  81. </property>
  82. <!--保证数据恢复 -->
  83. <property>
  84. <name>dfs.journalnode.http-address</name>
  85. <value>0.0.0.0:8480</value>
  86. </property>
  87. <property>
  88. <name>dfs.journalnode.rpc-address</name>
  89. <value>0.0.0.0:8485</value>
  90. </property>
  91. <property>
  92. <name>ha.zookeeper.quorum</name>
  93. <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value>
  94. </property>
  95. </configuration>
修改文件yarn-site.xml
  1. <configuration>
  2. <!--rm失联后重新链接的时间-->
  3. <property>
  4. <name>yarn.resourcemanager.connect.retry-interval.ms</name>
  5. <value>2000</value>
  6. </property>
  7. <!--开启resource manager HA,默认为false-->
  8. <property>
  9. <name>yarn.resourcemanager.ha.enabled</name>
  10. <value>true</value>
  11. </property>
  12. <!--配置resource manager -->
  13. <property>
  14. <name>yarn.resourcemanager.ha.rm-ids</name>
  15. <value>rm1,rm2</value>
  16. </property>
  17. <property>
  18. <name>ha.zookeeper.quorum</name>
  19. <value>dataNode1:2181,dataNode2:2181,dataNode4:2181</value>
  20. </property>
  21. <!--开启故障自动切换-->
  22. <property>
  23. <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
  24. <value>true</value>
  25. </property>
  26. <property>
  27. <name>yarn.resourcemanager.hostname.rm1</name>
  28. <value>namenode1</value>
  29. </property>
  30. <property>
  31. <name>yarn.resourcemanager.hostname.rm2</name>
  32. <value>namenode2</value>
  33. </property>
  34. <!--在namenode1上配置rm1,在namenode2上配置rm2,注意:一般都喜欢把配置好的文件远程复制到其它机器上,但这个在YARN的另一个机器上一定要修改-->
  35. <property>
  36. <name>yarn.resourcemanager.ha.id</name>
  37. <value>rm1</value>
  38. <description>If we want to launch more than one RM in single node, we need this configuration</description>
  39. </property>
  40. <!--开启自动恢复功能-->
  41. <property>
  42. <name>yarn.resourcemanager.recovery.enabled</name>
  43. <value>true</value>
  44. </property>
  45. <!--配置与zookeeper的连接地址-->
  46. <property>
  47. <name>yarn.resourcemanager.zk-state-store.address</name>
  48. <value>datanode1:2181,datanode2:2181,datanode4:2181</value>
  49. </property>
  50. <property>
  51. <name>yarn.resourcemanager.store.class</name>
  52. <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  53. </property>
  54. <property>
  55. <name>yarn.resourcemanager.zk-address</name>
  56. <value>datanode1:2181,datanode2:2181,datanode4:2181</value>
  57. </property>
  58. <property>
  59. <name>yarn.resourcemanager.cluster-id</name>
  60. <value>gagcluster-yarn</value>
  61. </property>
  62. <!--schelduler失联等待连接时间-->
  63. <property>
  64. <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
  65. <value>5000</value>
  66. </property>
  67. <!--配置rm1-->
  68. <property>
  69. <name>yarn.resourcemanager.address.rm1</name>
  70. <value>namenode1:8132</value>
  71. </property>
  72. <property>
  73. <name>yarn.resourcemanager.scheduler.address.rm1</name>
  74. <value>namenode1:8130</value>
  75. </property>
  76. <property>
  77. <name>yarn.resourcemanager.webapp.address.rm1</name>
  78. <value>namenode1:8188</value>
  79. </property>
  80. <property>
  81. <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
  82. <value>namenode1:8131</value>
  83. </property>
  84. <property>
  85. <name>yarn.resourcemanager.admin.address.rm1</name>
  86. <value>namenode1:8033</value>
  87. </property>
  88. <property>
  89. <name>yarn.resourcemanager.ha.admin.address.rm1</name>
  90. <value>namenode1:23142</value>
  91. </property>
  92. <!--配置rm2-->
  93. <property>
  94. <name>yarn.resourcemanager.address.rm2</name>
  95. <value>namenode2:8132</value>
  96. </property>
  97. <property>
  98. <name>yarn.resourcemanager.scheduler.address.rm2</name>
  99. <value>namenode2:8130</value>
  100. </property>
  101. <property>
  102. <name>yarn.resourcemanager.webapp.address.rm2</name>
  103. <value>namenode2:8188</value>
  104. </property>
  105. <property>
  106. <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
  107. <value>namenode2:8131</value>
  108. </property>
  109. <property>
  110. <name>yarn.resourcemanager.admin.address.rm2</name>
  111. <value>namenode2:8033</value>
  112. </property>
  113. <property>
  114. <name>yarn.resourcemanager.ha.admin.address.rm2</name>
  115. <value>namenode2:23142</value>
  116. </property>
  117. <property>
  118. <name>yarn.nodemanager.aux-services</name>
  119. <value>mapreduce_shuffle</value>
  120. </property>
  121. <property>
  122. <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  123. <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  124. </property>
  125. <property>
  126. <name>yarn.nodemanager.local-dirs</name>
  127. <value>/data/hadoop/yarn/local</value>
  128. </property>
  129. <property>
  130. <name>yarn.nodemanager.log-dirs</name>
  131. <value>/data/log/hadoop</value>
  132. </property>
  133. <property>
  134. <name>mapreduce.shuffle.port</name>
  135. <value>23080</value>
  136. </property>
  137. <!--故障处理类-->
  138. <property>
  139. <name>yarn.client.failover-proxy-provider</name>
  140. <value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
  141. </property>
  142. <property>
  143. <name>yarn.resourcemanager.ha.automatic-failover.zk-base-path</name>
  144. <value>/yarn-leader-election</value>
  145. <description>Optional setting. The default value is /yarn-leader-election</description>
  146. </property>
  147. </configuration>
修改文件mapred-site.xml
  1. <configuration>
  2. <property>
  3. <name>mapreduce.framework.name</name>
  4. <value>yarn</value>
  5. </property>
  6. <!-- 配置 MapReduce JobHistory Server 地址 ,默认端口10020 -->
  7. <property>
  8. <name>mapreduce.jobhistory.address</name>
  9. <value>0.0.0.0:10020</value>
  10. </property>
  11. <!-- 配置 MapReduce JobHistory Server web ui 地址, 默认端口19888 -->
  12. <property>
  13. <name>mapreduce.jobhistory.webapp.address</name>
  14. <value>0.0.0.0:19888</value>
  15. </property>
  16. </configuration>
修改文件slaves
  1. atanode1
  2. datanode2
  3. datanode3
  4. datanode4

修改文件yarn-env.sh

  1. export JAVA_HOME=/usr/java/jdk1.7.0_67
  2. export YARN_LOG_DIR=/data/log/hadoop指定日志存放目录
把配置好的文件远程scp到集群其它节点相应目录中,注意修改YARN高可用的yarn-site.xml文件中的yarn.resourcemanager.ha.id项
启动zookeeper集群(分别在datanode1、datanode2、datanode4上启动zk) 
            进入到 zookeeper-3.4.5/bin/
  1. ./zkServer.sh start

查看状态:

  1. ./zkServer.sh status

(一个leader,两个follower)

启动journalnode(在namenode1上启动所有journalnode) 
            进入到hadoop-2.6.0
  1. sbin/hadoop-daemons.sh start journalnode
    或者单独进入到datanode1,datanode2,datanode4执行
  1.     sbin/hadoop-daemon.sh start journalnode

(运行jps命令检验,多了JournalNode进程)

格式化HDFS 
            在namenode1上执行命令:
  1. hadoop namenode -format

格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,之后通过sbin/hadoop-daemon.sh start namenode启动namenode进程在namenode2上执行hdfs namenode -bootstrapStandby完成主备节点同步信息

格式化ZK(在namenode1上执行即可)
  1. hdfs zkfc -formatZK

启动HDFS(在namenode1上执行)

  1. sbin/start-dfs.sh

启动YARN(在namenode1和namenode2上执行)

  1. sbin/start-yarn.sh
    注意在namenode2上执行此命令时会提示NodeManager已存在等信息不用管这些,主要是启动namenode2上的resourceManager完成与namenode1的互备作用,目前没有找到单独启动resourceManager的方法
启动完成之后可以在浏览器中输入http://192.168.3.161:50070http://192.168.3.162:50070查看namenode分别为Active和Standby

在namenode1上执行${HADOOP_HOME}/bin/yarn rmadmin -getServiceState rm1查看rm1和rm2分别为active和standby状态,也可以通过浏览器访问http://192.168.3.161:8188查看状态