hadoop HA(热备)

冷备:实时或者周期性从业务服务器备份重要数据,
当该业务服务器宕机时,手动启动备份服务器
** 业务切换间隔时间比较长
热备:实时备份业务服务器备份重要数据,
当该业务服务器宕机时,集群会自动切换业务服务器,从而替换掉宕机的服务器
** 业务切换间隔时间比较短(秒级)

==================NameNode HA===============================

Namenode 要考虑热备HA --- 借助zookeeper
hadoop 0.2+ 1.0+ 不支持配置HA
** 借助keepalived + drbd
hadoop 2.0+ 支持配置HA
** 借助zookeeper
思考问题:
如何保证两台namenode服务器的元数据保持一致?
** 专业的存储设备: 比较昂贵
** NFS : 成本低、效率也比较低
** QJM (Quorum Journal Manager) 分布式日志系统

----Namenode HA部署-------------

目标: 防止单个Namenode宕机后,整个HDFS集群无法访问

规划:
blue01 blue02 blue03
Namenode Namenode
datanode datanode datanode
journalnode journalnode journalnode
zookeeper zookeeper zookeeper


** 备注:建议在配置前,把之前服务器配置备份一次,方便以后使用
$ cp -ra hadoop-2.5.0/ cluster-hadoop-2.5.0/


1、配置hdfs-site.xml(替换掉原来的内容)

<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--声明集群名称-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--声明集群有几个namenode节点-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>blue01.mydomain:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>blue02.mydomain:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>blue01.mydomain:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>blue02.mydomain:50070</value>
</property>
<!--声明journalnode集群服务器-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://blue01.mydomain:8485;blue02.mydomain:8485;blue03.mydomain:8485/mycluster</value>
</property>
<!--声明journalnode服务器数据存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-2.5.0/data/jn</value>
</property>
<!--访问代理类: client通过代理类访问active namenode -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</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/tom/.ssh/id_rsa</value>
</property>
</configuration>


2、配置core-site.xml,修改如下属性 ----->替换
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>

3、拷贝文件给其他服务器
$ rm -rf data/ --删除三台服务器的数据目录
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml blue02.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml blue03.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/

4、启动服务
1、在各个JournalNode节点上,输入以下命令启动journalnode服务
$ sbin/hadoop-daemon.sh start journalnode
2、在[nn1]上,对其进行格式化,并启动
$ bin/hdfs namenode -format
$ sbin/hadoop-daemon.sh start namenode
3、在[nn2]上,同步nn1的元数据信息,并启动
$ bin/hdfs namenode -bootstrapStandby
$ sbin/hadoop-daemon.sh start namenode
4、查看每个服务器进程信息(如果有问题,就把datanode和zookeeper也启动起来)
在[nn1]上
$ jps
3796 JournalNode
3917 NameNode
在[nn2]上
$ jps
2910 JournalNode
3046 NameNode
打开浏览器:
http://192.168.122.128:50070/
http://192.168.122.130:50070/
** 此时两个namenode都是standby
5、手动把nn1设置为active
$ bin/hdfs haadmin -transitionToActive nn1
** 再次查看http://192.168.122.128:50070/,变为active

5、启动故障自动转移功能
** 借助zookeeper
** 选举某台namenode为active
** 监控namenode的状态信息
** 如果active的namenode宕机,zookeeper会自动切换服务器状态(standby-->active)
** zkfc (ZK Failover Controllers) 客户端程序

a)
在hdfs-site.xml文件里,添加如下属性:
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

PS:
1.dfs.ha.automatic-failover.enabled —– 启动自动failover。自动failover依赖于zookeeper集群和ZKFailoverController(ZKFC),
后者是一个zookeeper客户端,用来监控NN的状态信息。每个运行NN的节点必须要运行一个zkfc。
2.zkfc提供了下面的功能:
Health monitoring zkfc:定期对本地的NN发起health-check的命令,如果NN正确返回,那么这个NN被认为是OK的。否则被认为是失效节点。
ZooKeeper session management: 当本地NN是健康的时候,zkfc将会在zk中持有一个session。
如果本地NN又正好是active的,那么zkfc还有持有一个”ephemeral”的节点作为锁,一旦本地NN失效了,那么这个节点将会被自动删除。
ZooKeeper-based election: 如果本地NN是健康的,并且zkfc发现没有其他的NN持有那个独占锁。
那么他将试图去获取该锁,一旦成功,那么它就需要执行Failover,然后成为active的NN节点。Failover的过程是:第一步,对之前的NN执行fence,如果需要的话。第二步,将本地NN转换到active状态。
启动zkfc的方法如下:hadoop-daemon.sh start zkfc。不过,通过start-dfs.sh会自动启动该进程,一般无需手动起停。

b)
在core-site.xml里添加如下属性:
<property>
<name>ha.zookeeper.quorum</name>
<value>blue01.mydomain:2181,blue02.mydomain:2181,blue03.mydomain:2181</value>
</property>

c)
拷贝文件给后面两台服务器:
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml blue02.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml blue03.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/

6、启动响应服务
1、关闭所有HDFS服务
在[nn1]执行:
$ sbin/stop-dfs.sh
2、启动三个节点上的zookeeper
3、初始化HA在Zookeeper中状态
在[nn1]执行:
$ bin/hdfs zkfc -formatZK

4、启动HDFS服务
在[nn1]执行:
$ sbin/start-dfs.sh
blue01:
6049 NameNode
7755 DataNode
7942 JournalNode
7441 QuorumPeerMain
8104 DFSZKFailoverController
blue02:
6856 DFSZKFailoverController
6486 QuorumPeerMain
6660 DataNode
6752 JournalNode
6591 NameNode
blue03:
5588 DataNode
5674 JournalNode
5492 QuorumPeerMain
7、测试观察
http://192.168.122.128:50070/ --active
http://192.168.122.130:50070/ --standby

模拟nn1故障:
杀掉nn1上面的namenode、关闭网卡 ...
$ kill -9 6049
通过浏览器观察nn2的状态 standby --> active


=================resourcemanager HA==================

hadoop 2.x

YARN HA部署:
目标: 防止单个resourcemanager宕机以后,整个YARN集群失效

zookeeper集群:
** 监控resourcemanager的状态[是否宕机]
** 故障转移
** 保存resourcemanager的状态信息
** 任务运行的状态(进度)
** 资源分配的状态

集群规划:
blue01 blue02 blue03
resourcenanager resourcenanager
nodemanager nodemanager nodemanager
zookeeper zookeeper zookeeper

----部署-------------

1.配置yarn-site.xml文件:
** 历史日志服务配置存在问题,需要调整(自己尝试)

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--指定两台resourcemanager的cluster-id-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>blue02.mydomain</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>blue03.mydomain</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>blue01.mydomain:2181,blue02.mydomain:2181,blue03.mydomain:2181</value>
</property>

<!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!--启用日志聚合功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--日志保存时间,单位秒-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
</configuration>

2.复制配置文件给其他服务
$ scp -r etc/hadoop/yarn-site.xml blue02.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp -r etc/hadoop/yarn-site.xml blue03.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/

3.启动各个服务器的服务
** zookeeper
** HDFS
** resourcemanager和nodemanager
在blue02:
$ sbin/start-yarn.sh
在blue03:
$ sbin/yarn-daemon.sh start resourcemanager
4.测试:
** 检查状态
$ bin/yarn rmadmin -getServiceState rm1
active
$ bin/yarn rmadmin -getServiceState rm2
standby

** 运行一个jar包进行测试
$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /input /output

** 在job运行的同时,把active服务器的resourcemanager进程杀掉,观察job任务运行状态
$ kill -9 8179

注意:会抛出如下异常,但是仍能得到正确的结果,想想为什么?
java.net.ConnectException: Call From blue02.mydomain/192.168.122.130 to blue02.mydomain:8032 failed on connection exception: java.net.ConnectException: 拒绝连接;


===================================================

PS:
面试题:
hadoop1 与 hadoop2 的区别?
1、hadoop1里没有yarn,jobtracker和tasktracker集成在mapreduce
hadoop2单独把任务管理和资源管理抽出来命名为yarn, resourcemanager和nodemanager
2、hadoop1里没有Namenode HA和resourcemanager HA,存在单点故障
3、hadoop2在性能和安全性方面有所加强


hadoop(HDFS)如何保证数据安全?
1、HDFS采用的是分布式架构,datanode数据存储采用block的形式,把文件存入分布式文件系统
2、每个block默认有3个副本,第一个副本本地机器,第二个副本放在同机架的不同服务器,第三个副本放置在不同机架的其他服务器
3、hdfs集群设计了safemode安全模式,当集群坏块太多,触发了阀值整个集群会进入安全模式,只能读,不能写;
启动过程中也会进入安全模式,等待datanode向namenode发送块报告和心跳
4、HDFS里面的文件也有类似linux系统的权限
5、针对HDFS和YARN的高可用,设计HA功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值