一、HA概述

  1.引言 

    正式引入HA机制是从hadoop2.0开始,之前的版本中没有HA机制

  2.运行机制   

     实现高可用最关键的是消除单点故障

    hadoop-ha严格来说应该分成各个组件的HA机制——HDFS的HA、YARN的HA

    详解:     

    通过双namenode消除单点故障

    双namenode协调工作的要点:

      A、元数据管理方式需要改变:

        内存中各自保存一份元数据

        Edits日志只能有一份,只有Active状态的namenode节点可以做写操作

        两个namenode都可以读取edits

        共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)

      B、需要一个状态管理功能模块

        实现了一个zkfailover,常驻在每一个namenode所在的节点

        每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识

        当需要进行状态切换时,由zkfailover来负责切换

        切换时需要防止brain split现象的发生

    原理图:

    

  3.水平拓展namenode的联邦机制

    

  4.高可用的解决方案

    从官网介绍来看,主要有2种:

      

  5.更多参考

    完整介绍与实践,参考http://blog.csdn.net/bingduanlbd/article/details/51946540

二、实践配置

   完整流程:

  1. hadoop2.0已经发布了稳定版本了,增加了很多特性,比如HDFS HAYARN等。最新的hadoop-2.6.4又增加了YARN HA
  2.  
  3. 注意:apache提供的hadoop-2.6.4的安装包是在32位操作系统编译的,因为hadoop依赖一些C++的本地库,
  4. 所以如果在64位的操作上安装hadoop-2.6.4就需要重新在64操作系统上重新编译
  5. (建议第一次安装用32位的系统,我将编译好的64位的也上传到群共享里了,如果有兴趣的可以自己编译一下)
  6.  
  7. 前期准备就不详细说了,课堂上都介绍了
  8. .修改Linux主机名
  9. .修改IP
  10. .修改主机名和IP的映射关系 /etc/hosts
  11. ######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机、阿里云主机等)
  12. /etc/hosts里面要配置的是内网IP地址和主机名的映射关系
  13. .关闭防火墙
  14. .ssh免登陆
  15. .安装JDK,配置环境变量等
  16.  
  17. 集群规划:
  18. 主机名 IP 安装的软件 运行的进程
  19. mini1 192.168.1.200 jdkhadoop NameNodeDFSZKFailoverController(zkfc)
  20. mini2 192.168.1.201 jdkhadoop NameNodeDFSZKFailoverController(zkfc)
  21. mini3 192.168.1.202 jdkhadoop ResourceManager
  22. mini4 192.168.1.203 jdkhadoop ResourceManager
  23. mini5 192.168.1.205 jdkhadoopzookeeper DataNodeNodeManagerJournalNodeQuorumPeerMain
  24. mini6 192.168.1.206 jdkhadoopzookeeper DataNodeNodeManagerJournalNodeQuorumPeerMain
  25. mini7 192.168.1.207 jdkhadoopzookeeper DataNodeNodeManagerJournalNodeQuorumPeerMain
  26.  
  27. 说明:
  28. .在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
  29. hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode
  30. 这里还配置了一个zookeeper集群,用于ZKFCDFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNodestandby状态
  31. .hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop-2.6.4解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调
  32. 安装步骤:
  33. .安装配置zooekeeper集群(在hadoop05上)
  34. .1解压
  35. tar -zxvf zookeeper-3.4..tar.gz -C /home/hadoop/app/
  36. .2修改配置
  37. cd /home/hadoop/app/zookeeper-3.4./conf/
  38. cp zoo_sample.cfg zoo.cfg
  39. vim zoo.cfg
  40. 修改:dataDir=/home/hadoop/app/zookeeper-3.4./tmp
  41. 在最后添加:
  42. server.=hadoop05::
  43. server.=hadoop06::
  44. server.=hadoop07::
  45. 保存退出
  46. 然后创建一个tmp文件夹
  47. mkdir /home/hadoop/app/zookeeper-3.4./tmp
  48. echo > /home/hadoop/app/zookeeper-3.4./tmp/myid
  49. .3将配置好的zookeeper拷贝到其他节点(首先分别在hadoop06hadoop07根目录下创建一个hadoop目录:mkdir /hadoop)
  50. scp -r /home/hadoop/app/zookeeper-3.4./ hadoop06:/home/hadoop/app/
  51. scp -r /home/hadoop/app/zookeeper-3.4./ hadoop07:/home/hadoop/app/
  52.  
  53. 注意:修改hadoop06hadoop07对应/hadoop/zookeeper-3.4./tmp/myid内容
  54. hadoop06
  55. echo > /home/hadoop/app/zookeeper-3.4./tmp/myid
  56. hadoop07
  57. echo > /home/hadoop/app/zookeeper-3.4./tmp/myid
  58.  
  59. .安装配置hadoop集群(在hadoop00上操作)
  60. .1解压
  61. tar -zxvf hadoop-2.6..tar.gz -C /home/hadoop/app/
  62. .2配置HDFShadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
  63. #将hadoop添加到环境变量中
  64. vim /etc/profile
  65. export JAVA_HOME=/usr/java/jdk1..0_55
  66. export HADOOP_HOME=/hadoop/hadoop-2.6.
  67. export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
  68.  
  69. #hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下
  70. cd /home/hadoop/app/hadoop-2.6./etc/hadoop
  71.  
  72. 2.2.1修改hadoo-env.sh
  73. export JAVA_HOME=/home/hadoop/app/jdk1..0_55
  74.  
  75. ###############################################################################
  76.  
  77. 2.2.2修改core-site.xml
  78. <configuration>
  79. <!-- 指定hdfsnameservicens1 -->
  80. <property>
  81. <name>fs.defaultFS</name>
  82. <value>hdfs://bi/</value>
  83. </property>
  84. <!-- 指定hadoop临时目录 -->
  85. <property>
  86. <name>hadoop.tmp.dir</name>
  87. <value>/home/hadoop/app/hdpdata/</value>
  88. </property>
  89.  
  90. <!-- 指定zookeeper地址 -->
  91. <property>
  92. <name>ha.zookeeper.quorum</name>
  93. <value>mini5:,mini6:,mini7:</value>
  94. </property>
  95. </configuration>
  96.  
  97. ###############################################################################
  98.  
  99. 2.2.3修改hdfs-site.xml
  100. <configuration>
  101. <!--指定hdfsnameservicebi,需要和core-site.xml中的保持一致 -->
  102. <property>
  103. <name>dfs.nameservices</name>
  104. <value>bi</value>
  105. </property>
  106. <!-- bi下面有两个NameNode,分别是nn1nn2 -->
  107. <property>
  108. <name>dfs.ha.namenodes.bi</name>
  109. <value>nn1,nn2</value>
  110. </property>
  111. <!-- nn1RPC通信地址 -->
  112. <property>
  113. <name>dfs.namenode.rpc-address.bi.nn1</name>
  114. <value>mini1:</value>
  115. </property>
  116. <!-- nn1http通信地址 -->
  117. <property>
  118. <name>dfs.namenode.http-address.bi.nn1</name>
  119. <value>mini1:</value>
  120. </property>
  121. <!-- nn2RPC通信地址 -->
  122. <property>
  123. <name>dfs.namenode.rpc-address.bi.nn2</name>
  124. <value>mini2:</value>
  125. </property>
  126. <!-- nn2http通信地址 -->
  127. <property>
  128. <name>dfs.namenode.http-address.bi.nn2</name>
  129. <value>mini2:</value>
  130. </property>
  131. <!-- 指定NameNodeedits元数据在JournalNode上的存放位置 -->
  132. <property>
  133. <name>dfs.namenode.shared.edits.dir</name>
  134. <value>qjournal://mini5:8485;mini6:8485;mini7:8485/bi</value>
  135. </property>
  136. <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
  137. <property>
  138. <name>dfs.journalnode.edits.dir</name>
  139. <value>/home/hadoop/journaldata</value>
  140. </property>
  141. <!-- 开启NameNode失败自动切换 -->
  142. <property>
  143. <name>dfs.ha.automatic-failover.enabled</name>
  144. <value>true</value>
  145. </property>
  146. <!-- 配置失败自动切换实现方式 -->
  147. <property>
  148. <name>dfs.client.failover.proxy.provider.bi</name>
  149. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  150. </property>
  151. <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
  152. <property>
  153. <name>dfs.ha.fencing.methods</name>
  154. <value>
  155. sshfence
  156. shell(/bin/true)
  157. </value>
  158. </property>
  159. <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
  160. <property>
  161. <name>dfs.ha.fencing.ssh.private-key-files</name>
  162. <value>/home/hadoop/.ssh/id_rsa</value>
  163. </property>
  164. <!-- 配置sshfence隔离机制超时时间 -->
  165. <property>
  166. <name>dfs.ha.fencing.ssh.connect-timeout</name>
  167. <value></value>
  168. </property>
  169. </configuration>
  170.  
  171. ###############################################################################
  172.  
  173. 2.2.4修改mapred-site.xml
  174. <configuration>
  175. <!-- 指定mr框架为yarn方式 -->
  176. <property>
  177. <name>mapreduce.framework.name</name>
  178. <value>yarn</value>
  179. </property>
  180. </configuration>
  181.  
  182. ###############################################################################
  183.  
  184. 2.2.5修改yarn-site.xml
  185. <configuration>
  186. <!-- 开启RM高可用 -->
  187. <property>
  188. <name>yarn.resourcemanager.ha.enabled</name>
  189. <value>true</value>
  190. </property>
  191. <!-- 指定RMcluster id -->
  192. <property>
  193. <name>yarn.resourcemanager.cluster-id</name>
  194. <value>yrc</value>
  195. </property>
  196. <!-- 指定RM的名字 -->
  197. <property>
  198. <name>yarn.resourcemanager.ha.rm-ids</name>
  199. <value>rm1,rm2</value>
  200. </property>
  201. <!-- 分别指定RM的地址 -->
  202. <property>
  203. <name>yarn.resourcemanager.hostname.rm1</name>
  204. <value>mini3</value>
  205. </property>
  206. <property>
  207. <name>yarn.resourcemanager.hostname.rm2</name>
  208. <value>mini4</value>
  209. </property>
  210. <!-- 指定zk集群地址 -->
  211. <property>
  212. <name>yarn.resourcemanager.zk-address</name>
  213. <value>mini5:,mini6:,mini7:</value>
  214. </property>
  215. <property>
  216. <name>yarn.nodemanager.aux-services</name>
  217. <value>mapreduce_shuffle</value>
  218. </property>
  219. </configuration>
  220.  
  221. 2.2.6修改slaves(slaves是指定子节点的位置,因为要在hadoop01上启动HDFS、在hadoop03启动yarn,所以hadoop01上的slaves文件指定的是datanode的位置,hadoop03上的slaves文件指定的是nodemanager的位置)
  222. mini5
  223. mini6
  224. mini7
  225.  
  226. 2.2.7配置免密码登陆
  227. #首先要配置hadoop00到hadoop01、hadoop02、hadoop03、hadoop04、hadoop05、hadoop06、hadoop07的免密码登陆
  228. #在hadoop01上生产一对钥匙
  229. ssh-keygen -t rsa
  230. #将公钥拷贝到其他节点,包括自己
  231. ssh-coyp-id hadoop00
  232. ssh-coyp-id hadoop01
  233. ssh-coyp-id hadoop02
  234. ssh-coyp-id hadoop03
  235. ssh-coyp-id hadoop04
  236. ssh-coyp-id hadoop05
  237. ssh-coyp-id hadoop06
  238. ssh-coyp-id hadoop07
  239. #配置hadoop02到hadoop04、hadoop05、hadoop06、hadoop07的免密码登陆
  240. #在hadoop02上生产一对钥匙
  241. ssh-keygen -t rsa
  242. #将公钥拷贝到其他节点
  243. ssh-coyp-id hadoop03
  244. ssh-coyp-id hadoop04
  245. ssh-coyp-id hadoop05
  246. ssh-coyp-id hadoop06
  247. ssh-coyp-id hadoop07
  248. #注意:两个namenode之间要配置ssh免密码登陆,别忘了配置hadoop01到hadoop00的免登陆
  249. hadoop01上生产一对钥匙
  250. ssh-keygen -t rsa
  251. ssh-coyp-id -i hadoop00
  252.  
  253. .4将配置好的hadoop拷贝到其他节点
  254. scp -r /hadoop/ hadoop02:/
  255. scp -r /hadoop/ hadoop03:/
  256. scp -r /hadoop/hadoop-2.6./ hadoop@hadoop04:/hadoop/
  257. scp -r /hadoop/hadoop-2.6./ hadoop@hadoop05:/hadoop/
  258. scp -r /hadoop/hadoop-2.6./ hadoop@hadoop06:/hadoop/
  259. scp -r /hadoop/hadoop-2.6./ hadoop@hadoop07:/hadoop/
  260.  
  261. ###注意:严格按照下面的步骤!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  262. .5启动zookeeper集群(分别在mini5mini6mini7上启动zk
  263. cd /hadoop/zookeeper-3.4./bin/
  264. ./zkServer.sh start
  265. #查看状态:一个leader,两个follower
  266. ./zkServer.sh status
  267.  
  268. .6启动journalnode(分别在在mini5mini6mini7上执行)
  269. cd /hadoop/hadoop-2.6.
  270. sbin/hadoop-daemon.sh start journalnode
  271. #运行jps命令检验,hadoop05、hadoop06、hadoop07上多了JournalNode进程
  272.  
  273. .7格式化HDFS
  274. #在mini1上执行命令:
  275. hdfs namenode -format
  276. #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/hadoop/hadoop-2.6./tmp,然后将/hadoop/hadoop-2.6./tmp拷贝到hadoop02的/hadoop/hadoop-2.6./下。
  277. scp -r tmp/ hadoop02:/home/hadoop/app/hadoop-2.6./
  278. ##也可以这样,建议hdfs namenode -bootstrapStandby
  279.  
  280. .8格式化ZKFC(在mini1上执行一次即可)
  281. hdfs zkfc -formatZK
  282.  
  283. .9启动HDFS(在mini1上执行)
  284. sbin/start-dfs.sh
  285.  
  286. .10启动YARN(#####注意#####:是在hadoop02上执行start-yarn.sh,把namenoderesourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
  287. sbin/start-yarn.sh
  288.  
  289. 到此,hadoop-2.6.4配置完毕,可以统计浏览器访问:
  290. http://hadoop00:50070
  291. NameNode 'hadoop01:9000' (active)
  292. http://hadoop01:50070
  293. NameNode 'hadoop02:9000' (standby)
  294.  
  295. 验证HDFS HA
  296. 首先向hdfs上传一个文件
  297. hadoop fs -put /etc/profile /profile
  298. hadoop fs -ls /
  299. 然后再killactiveNameNode
  300. kill - <pid of NN>
  301. 通过浏览器访问:http://192.168.1.202:50070
  302. NameNode 'hadoop02:9000' (active)
  303. 这个时候hadoop02上的NameNode变成了active
  304. 在执行命令:
  305. hadoop fs -ls /
  306. -rw-r--r-- root supergroup -- : /profile
  307. 刚才上传的文件依然存在!!!
  308. 手动启动那个挂掉的NameNode
  309. sbin/hadoop-daemon.sh start namenode
  310. 通过浏览器访问:http://192.168.1.201:50070
  311. NameNode 'hadoop01:9000' (standby)
  312.  
  313. 验证YARN
  314. 运行一下hadoop提供的demo中的WordCount程序:
  315. hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4..jar wordcount /profile /out
  316.  
  317. OK,大功告成!!!
  318.  
  319. 测试集群工作状态的一些指令
  320. bin/hdfs dfsadmin -report 查看hdfs的各节点状态信息
  321.  
  322. bin/hdfs haadmin -getServiceState nn1 获取一个namenode节点的HA状态
  323.  
  324. sbin/hadoop-daemon.sh start namenode 单独启动一个namenode进程
  325.  
  326. ./hadoop-daemon.sh start zkfc 单独启动一个zkfc进程

搭建HA

   完整过程,参考https://www.cnblogs.com/yxysuanfa/p/7105180.html

   配置,参考  http://linxiao.iteye.com/blog/2271362

大数据入门第十天——hadoop高可用HA的更多相关文章

  1. 大数据入门第十九天——推荐系统与mahout(一)入门与概述

    一.推荐系统概述 为了解决信息过载和用户无明确需求的问题,找到用户感兴趣的物品,才有了个性化推荐系统.其实,解决信息过载的问题,代表性的解决方案是分类目录和搜索引擎,如hao123,电商首页的分类目录 ...

  2. 大数据学习(7)Hadoop高可用

    HDFS高可用 通过主从切换实现单NameNode高可用.通过Federation:水平扩展来联合多NameNode个: NameNode高可用 把edits日志从原来的nameNode中分离出来,存 ...

  3. 大数据入门第十四天——Hbase详解(三)hbase基本原理与MR操作Hbase

    一.基本原理 1.hbase的位置 上图描述了Hadoop 2.0生态系统中的各层结构.其中HBase位于结构化存储层,HDFS为HBase提供了高可靠性的底层存储支持, MapReduce为HBas ...

  4. 大数据入门第十四天——Hbase详解(一)入门与安装配置

    一.概述 1.什么是Hbase 根据官网:https://hbase.apache.org/ Apache HBase™ is the Hadoop database, a distributed, ...

  5. 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装

    一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...

  6. 大数据入门第十六天——流式计算之storm详解(三)集群相关进阶

    一.集群提交任务流程分析 1.集群提交操作 参考:https://www.jianshu.com/p/6783f1ec2da0 2.任务分配与启动流程 参考:https://www.cnblogs.c ...

  7. 大数据入门第十四天——Hbase详解(二)基本概念与命令、javaAPI

    一.hbase数据模型 完整的官方文档的翻译,参考:https://www.cnblogs.com/simple-focus/p/6198329.html 1.rowkey 与nosql数据库们一样, ...

  8. 大数据入门第十六天——流式计算之storm详解(二)常用命令与wc实例

    一.常用命令 1.提交命令 提交任务命令格式:storm jar [jar路径] [拓扑包名.拓扑类名] [拓扑名称] torm jar examples/storm-starter/storm-st ...

  9. 大数据入门第十五天——HBase整合:云笔记项目

    一.功能简述 1.笔记本管理(增删改) 2.笔记管理 3.共享笔记查询功能 4.回收站 效果预览: 二.库表设计 1.设计理念 将云笔记信息分别存储在redis和hbase中. redis(缓存):存 ...

随机推荐

  1. centos7.2+php7.2+nginx1.12.0+mysql5.7配置

    一. 源码安装php7.2 选择需要的php版本 从 php官网: http://cn2.php.net/downloads.php 选择需要的php版本,选择.tar.gz 的下载包,点击进入,选择 ...

  2. Week3——书上的分析

    1.long before=System.currentTimeMills();      long after=System.currentTimeMills(); 该l两句是分别记录了开始过滤和结 ...

  3. JavaScript Web 应用最佳实践分析

    [编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ...

  4. LeetCode题解之Unique Morse Code Words

    1.题目描述 2.题目分析 将words 中的每一个string  直接翻译成对应的Morse 码,然后将其放入 set 中,最后返回set的大小即可,此处利用的set 中元素不重复的性质. 3.代码 ...

  5. Oracle EBS 查询客户报错 查询已超出 200 行。可能存在更多的行,请限制查询。

  6. Oracle ALL DBA表

    select * from all_tab_comments -- 查询所有用户的表,视图等 select * from user_tab_comments -- 查询本用户的表,视图等 select ...

  7. 在asp.net一般应用程序中使用session

    通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝尝存放在Session中. 在页面我们很容易的得到Session的值,但在类中就会遇到一些问题.也知道通过下面的方法得到 ...

  8. Shell: extract more from listener.log (分析oracle监听日志)

    最近遇到了两起数据库连接数不足的问题, 通常都会预留一些会话增加的情况, 但在一些特殊情况下如连接风暴(logon storm), 如果在监听中没有做rate限流,对数据库来说巨大的冲击可能会导致数据 ...

  9. @private、@protected与@public三者之间的区别

    @private.@protected与@public三者之间的区别 类之间关系图 @private只能够使用在声明的类当中,其子类也不能够使用用@private声明的实例变量 @protected只 ...

  10. November 16th 2016 Week 47th Wednesday

    Success is falling nine times and getting up ten. 成功就是哪怕跌倒九次,也要在第十次爬起来. For most of us, we may choos ...