Hadoop 2.x高可用性部署
2016-11-12 21:36
267 查看
一、HDFS HA(高可用性)原理
在Hadoop2.0.0之前,NameNode(NN)在HDFS集群中存在单点故障(single point of failure),每一个集群中存在一个NameNode,如果NN所在的机器出现了故障,那么将导致整个集群无法利用,直到NN重启或者在另一台主机上启动NN守护线程。主要在两方面影响了HDFS的可用性:
(1)在不可预测的情况下,如果NN所在的机器崩溃了,整个集群将无法利用,直到NN被重新启动;
(2)在可预知的情况下,比如NN所在的机器硬件或者软件需要升级,将导致集群宕机。
HDFS的高可用性将通过在同一个集群中运行两个NN(active NN & standby NN)来解决上面两个问题,这种方案允许在机器破溃或者机器维护快速地启用一个新的NN来恢复故障。
在典型的HA集群中,通常有两台不同的机器充当NN。在任何时间,只有一台机器处于Active状态;另一台机器是处于Standby状态。Active NN负责集群中所有客户端的操作;而Standby NN主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。
为了让 Standby NN的状态和Active NN保持同步,即元数据保持一致,它们都将会和JournalNodes守护进程通信。当Active NN执行任何有关命名空间的修改,它需要持久化到一半以上的JournalNodes上(通过edits log持久化存储),而Standby NN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间。一旦Active NN出现故障,Standby NN将会保证从JNs中读出了全部的Edits,然后切换成Active状态。Standby NN读取全部的edits可确保发生故障转移之前,是和Active NN拥有完全同步的命名空间状态。
为了提供快速的故障恢复,Standby NN也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的Database将配置好Active NN和Standby NN的位置,并向它们发送块文件所在的位置及心跳,如下图所示:
Hadoop2.2.0中HDFS的高可用性实现原理
在任何时候,集群中只有一个NN处于Active 状态是极其重要的。否则,在两个Active NN的状态下NameSpace状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs只允许一个 NN充当writer。在故障恢复期间,将要变成Active 状态的NN将取得writer的角色,并阻止另外一个NN继续处于Active状态。
为了部署HA集群,你需要准备以下事项:
(1)NameNode machines:运行Active NN和Standby NN的机器需要相同的硬件配置;
(2)JournalNode machines:也就是运行JN的机器。JN守护进程相对来说比较轻量,所以这些守护进程可以可其他守护线程(比如NN,YARN ResourceManager)运行在同一台机器上。在一个集群中,最少要运行3个JN守护进程,这将使得系统有一定的容错能力。当然,你也可以运行3 个以上的JN,但是为了增加系统的容错能力,你应该运行奇数个JN(3、5、7等),当运行N个JN,系统将最多容忍(N-1)/2个JN崩溃。
在HA集群中,Standby NN也执行namespace状态的checkpoints,所以不必要运行Secondary NN、CheckpointNode和BackupNode;事实上,运行这些守护进程是错误的。
二、HDFS HA配置步骤
首先在配置之前关闭已经启动的所有进程,(关闭集群)为了方便起见独立拷贝一份集群模式出来
主要是备份一下etc目录下的hadoop文件夹,data目录下的tmp
之后对etc/hadoop目录下文件做配置
配置文件
core-site.xml中将指定namenode所在机器的属性删除:
fs.defaultFS,重新配置默认文件系统
<configuration> <!-- 配置文件指定默认的文件系统,客户端会使用到 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/app/hadoop-2.5.0/data/tmp</value> </property> <property> <name>hadoop.http.staticuser.user</name> <value>beifeng</value> </property> </configuration>
hdfs-site.xml文件将SecondaryNameNode属性删除:
dfs.namenode.secondary.http-address
<configuration> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <!-- 指定namenode命名空间名称 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- 指定名称(命名空间)下的两个节点 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- 指定两台namenode所在的机器位置及交互端口号 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>hadoop-senior01.ibeifeng.com:8020</value> </property> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>hadoop-senior02.ibeifeng.com:8020</value> </property> <!-- 指定两台namenode外部访问的交互端口号 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>hadoop-senior01.ibeifeng.com:50070</value> </property> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>hadoop-senior02.ibeifeng.com:50070</value> </property> <!-- 指定JN日志节点的共享存储日志目录:不要忘记修改命名空间ns1 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop-senior01.ibeifeng.com:8485;hadoop-senior02.ibeifeng.com:8485;hadoop-senior03.ibeifeng.com:8485/ns1</value> </property> <!-- 指定JN本地真正存储日志的目录路径(需要自己手动创建) --> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/app/hadoop-2.5.0/data/dfs/jn</value> </property> <!-- 配置客户端代理访问属性 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 指定SSH协议方式隔离,并指定用户名 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/beifeng/.ssh/id_rsa</value> </property> </configuration>
对02.03电脑做相同的配置,创建一个目录,备份两个已存在的目录
将配置文件分发到各个节点机器上面
cp -r hadoop/ hadoop-senior03.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/
三、启动QJM HA
进入zookeeper目录cd /opt/app/zookeeper-3.4.5/
启动进程(每一台都要启动):
bin/zkServer.sh start
查看状态:
bin/zkServer.sh status
进程名称:QuorumPeerMain
然后再启动日志节点:cd /opt/app/hadoop-2.5.0/
sbin/hadoop-daemon.sh start journalnode
日志节点进程:journalnode
必须先启动日志节点,否则会导致格式化失败
格式化NameNode
bin/hdfs namenode -format
注意:只需要格式化第一台,第二台的namenode不需要格式化,因为管理的是同一个元数据(命名空间)
启动第一台的namenode
sbin/hadoop-daemon.sh start namenode
同步元数据(记住切换到第二台机器进行执行命令)
bin/hdfs namenode -bootstrapStandby
启动第二台的namenode
sbin/hadoop-daemon.sh start namenode
手动切换
目前两台都是standby状态
在第一台主机:
bin/hdfs haadmin -transitionToActive nn1
启动各个节点的datanode(三台)
sbin/hadoop-daemon.sh start datanode
测试文件数据是否共享
首先在文件系统上创建目录上传文件并读取
bin/hdfs dfs -mkdir -p tmp/conf bin/hdfs dfs -put etc/hadoop/hdfs-site.xml tmp/conf
然后杀掉其中一台对外提供服务的namenode进程
手动切换另外一台额namenode对外提供服务
bin/hdfs haadmin -transitionToActive nn2 --forceactive
尝试读取文件,查看是否共享数据
bin/hdfs dfs -text tmp/conf/hdfs-site.xml
四、HDFS高可用性HA自动故障转移环境部署
首先在配置之前关闭已经启动的所有进程,(关闭集群):sbin/stop-dfs.sh1
1
ZKFC作用:
进程名:DFSZKFailoverController
如果单独启动命令:
sbin/hadoop-daemon.sh start zkfc
发生故障,及时进行通知,帮助客户端定位哪个是对外提供服务的namenode,保证任意时刻只有一个namenode对外提供服务
首先要部署一个zookeeper集群
配置文件:hdfs-site.xml
<!-- 代表是否开启自动故障转移功能 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
配置文件:core-site.xml
<!-- 告知系统运行的是zookeeper的服务,配置zookeeper的地址 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop-senior01.ibeifeng.com:2181,hadoop-senior02.ibeifeng.com:2181,hadoop-senior03.ibeifeng.com:2181</value> </property>
分发配置文件
scp -r hadoop/core-site.xml hadoop/hdfs-site.xml hadoop-senior02.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/hadoop/
初始化zookeeper生成znode节点目录
bin/hdfs zkfc -formatZK
进入zookeeperClient查看目录:
bin/zkCli.sh
启动HDFS相关守护进程
sbin/start-dfs.sh
运行一个MR程序,杀掉其中一个进程,观察是否切换成功
创建输入目录:
bin/hdfs dfs -mkdir tmp/input
上传测试数据:
bin/hdfs dfs -put /opt/datas/wc.input /user/beifeng/tmp/input
启动yarn相关进程:
sbin/yarn-daemon.sh start resourcemanager(第二台) sbin/yarn-daemon.sh start nodemanager(三台全部)
杀死进程之前hadoop-senior01 的NameNode是active状态,hadoop-senior02的NameNode是standby状态
执行MR任务:
bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /user/beifeng/tmp/input /user/beifeng/tmp/output
在map跑完100%时,关掉hadoop-senior01 的NameNode
杀死进程之后hadoop-senior01 的NameNode是standby状态,hadoop-senior02的NameNode是active状态,MR程序能够正常运行结束
五、ResourceManager高可用性HA环境部署
首先在配置之前关闭已经启动的所有进程,(关闭集群)备份 Hadoop下etc目录下的hadoop文件夹,data目录下的tmp与dfs文件夹
应该是备份分布式集群的配置文件:之前放到了dist-hadoop中
机器02,03也要做备份
三台电脑建议:1,2配置NameNode,2,3配置ResourcesManager
配置文件:yarn-site.xml
将指定ResourceManager所在机器位置属性删除:yarn.resourcemanager.hostname
配置
<property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--指定YARN集群的ID名称--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-cluster</value> </property> <!--指定两台ResourceManager的ID名称--> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm142,rm143</value> </property> <!--指定两台ResourceManager所在的机器位置--> <property> <name>yarn.resourcemanager.hostname.rm142</name> <value>hadoop-senior02.ibeifeng.com</value> </property> <property> <name>yarn.resourcemanager.hostname.rm143</name> <value>hadoop-senior03.ibeifeng.com</value> </property> <!--指定配置zookeeper的信息,所在机器及端口号--> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop-senior01.ibeifeng.com:2181,hadoop-senior02.ibeifeng.com:2181,hadoop-senior03.ibeifeng.com:2181</value> </property> <!--指定重新恢复ResourceManager开启--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定ResourceManager信息状态存储的方式,默认在文件系统上,修改为zookeeper,大写的ZK--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property>
将配置文件分发到各个节点机器上面去
scp -r etc/hadoop/ hadoop-senior03.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/
注意:如果是重新拷贝一份部署环境的话,先要格式化namenode
bin/hdfs namenode -format 第一台
sbin/hadoop-daemon.sh start namenode 第一台
bin/zkServer.sh start 三台,进程名:QuorumPeerMain
sbin/hadoop-daemon.sh start datanode三台
sbin/yarn-daemon.sh start resourcemanager 第二,第三台
sbin/yarn-daemon.sh start nodemanager 三台
第二台与第三台进程一样
当在第三台运行http://hadoop-senior03.ibeifeng.com:8088 将重定向到第二台机器,
This is standby RM. Redirecting to the current active RM: http://hadoop-senior02.ibeifeng.com:8088/
测试
创建目录:bin/hdfs dfs -mkdir -p mapreduce/input
上传文件:bin/hdfs dfs -put /opt/datas/wc.input mapreduce/input
运行MR程序:
bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /user/beifeng/mapreduce/input /user/beifeng/mapreduce/output
杀掉第二台的ResourceManager进程
此时自动转到第三台机器上运行:
http://hadoop-senior03.ibeifeng.com:8088/cluster
等
相关文章推荐
- Hadoop大数据框架研究(2)——Hadoop的HA高可用性集群环境部署
- 三台PC服务器部署Hadoop HA(Hadoop 高可用性架构)
- Hadoop大数据框架研究(3)——Spark的HA高可用性集群环境部署
- 三台PC服务器部署Hadoop HA(Hadoop 高可用性架构)
- Hadoop2.x HA(High Avalability,高可用性) 安装部署
- Hadoop HDFS高可用性(HA) 部署篇
- Hadoop集群完全分布式模式环境部署
- Hadoop单机模式部署
- CRM部署 可用性已成为第一核心原则
- windows10 下不能访问Hadoop在虚拟机中部署的完全分布式的hdfs和mapreduce问题
- Exchange Server 2010 SP2 高可用性(一)---部署CAS/HUB服务器
- Hadoop 集群 Hive 部署,安装mysql metastore
- Hadoop-2.4.1学习之使用Quorum Journal Manager的HDFS的高可用性(三)
- 生产环境上的HADOOP安装部署注意事项(HDP版)
- Hadoop系列:在Linux下部署hadoop 0.20.1
- Hadoop安装部署
- Hadoop-2.2.0集群部署时live nodes数目不对的问题
- ambari部署hadoop HA
- hadoop伪分布式系统安装部署
- hadoop hdfs 图片服务器应用部署