3.3-Hadoop HA高可用搭建

前提:基于hadoop 完全分布式的配置
环境准备
三台虚拟机
jdk
zookeeper
hadoop

配置zookeeper集群

  1. 在${zookeeper_home}下创建zkData
mkdir -p zkData
  1. 将${zookeeper_home}/conf下的zoo_sample.cfg重命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg
  1. 配置zoo.cfg文件
#修改dataDir
dataDir=${zookeeper_home}/zkData
#append cluster config
server.1=hostname1:2888:3888
server.2=hostname2:2888:3888
server.3=hostname3:2888:3888

配置参数解读
server.A=B:C:D
A是一个数字,表示这是第几号服务器
B是这个服务器的IP地址
C是这个服务器与集群中的Leader服务器交换信息的端口
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选举出一个新的leader,而这个端口就是用来执行选举时服务器相互通信的端口
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server

  1. 集群操作

(1). 在${zookeeper_home}/zkData目录下创建一个myid文件,并编辑,在myid文件中添加与server对应的编号,如1

vim myid

每台机器中的myid的值不能相同
(2). 启动zookeeper

${zookeeper_home}/bin/zkServer.sh start

(3). 查看状态

${zookeeper_home}/bin/zkServer.sh status

如没有leader或follower出现,则配置可能出错

HDFS-HA集群配置

  1. 配置hadoop-env.sh
export JAVA_HOME=${JAVA_HOME}
  1. 配置core-site.xml
#把两个NameNode的地址组装成一个集群mycluster
<property>
	<name>fs.defaultFS</name>
	<value>hdfs://mycluster</value>
</property>
#指定hadoop运行时产生文件的存储目录
<property>
	<name>hadoop.tmp.dir</name>
	<value>${hadoop_home}/data/tmp</value>
</property>
  1. 配置hdfs-site.xml
# 完全分布式集群名称
<property>
	<name>dfs.nameservices</name>
	<value>mycluster</value>
</property>
# 集群中NameNode节点
<property>
	<name>dfs.ha.namenodes.mycluster</name>
	<value>nn1,nn2</value>
</property>
# nn1的RPC通信地址
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn1</name>
	<value>${namenode1_hostname}:9000</value>
</property>
# nn2的RPC通信地址
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn2</name>
	<value>${namenode2_hostname}:9000</value>
</property>
# nn1的http通信地址
<property>
	<name>dfs.namenode.http-address.mycluster.nn1</name>
	<value>${namenode1_hostname}:50070</value>
</property>
# nn2的http通信地址
<property>
	<name>dfs.namenode.http-address.mycluster.nn2</name>
	<value>${namenode2_hostname}:50070</value>
</property>
# 指定namenode元数据在journalnode上的存放位置
<property>
	<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://${hostname1}:8485;${hostname2}:8485;${hostname3}:8485/mycluster</value>
</property>
# 配置隔离机制,即同一时刻只能有一台服务器对外响应
<property>
	<name>dfs.ha.fencing.methods</name>
	<value>sshfence</value>
</property>
# 使用隔离机制时需要ssh无秘钥登录
<property>
	<name>dfs.ha.fencing.ssh.private-key-files</name>
	<value>/home/clown/.ssh/id_rsa</value>
</property>
# 声明journalnode服务器存储目录
<property>
	<name>dfs.journalnode.edits.dir</name>
	<value>${hadoop_home}/data/jn</value>
</property>
# 关闭权限检查
<property>
	<name>dfs.permissions.enable</name>
	<value>false</value>
</property>
# 访问代理类:client,mycluster,active配置失败自动切换实现方式
<property>
	<name>dfs.client.failover.proxy.provider.mycluster</name
	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

集群分发至各节点

  1. 启动hdfs-ha集群

(1). 在各个JournalNode节点上,启动journalnode服务

${hadoop_home}/sbin/hadoop-daemon.sh start journalnode

(2). 在[nn1]上,对其进行格式化,并启动

${hadoop_home}/bin/hdfs namenode -format
${hadoop_home}/sbin/hadoop-daemon.sh start namenode

(3). 在[nn2]上,同步nn1的元数据信息

${hadoop_home}/bin/hdfs namenode -bootstrapStandby

(4). 启动nn2

${hadoop_home}/sbin/hadoop-daemon.sh start namenode

(5). webUI显示
nn1:50070
nn2:50070
(6). 在nn1上,启动所有datanode

${hadoop_home}/sbin/hadoop-daemons.sh start datanode

(7). 将[nn1]切换为active

${hadoop_home}/bin/hdfs haadmin -transitionToActive nn1

(8). 查看是否active

${hadoop_home}/bin/hdfs haadmin -getServiceState nn1
  1. 配置hdfs-ha自动故障转移

(1). hdfs-site.xml配置

#####append####
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>

(2). core-site.xml

#####append#####
<property>
	<name>ha.zookeeper.quorum</name>
	<value>${hostname1}:2181,${hostname2}:2181,${hostname3}:2181</value>
</property>

(3). 启动
a. 关闭所有hdfs服务

${hadoop_home}/sbin/stop-dfs.sh

b. 启动zookeeper集群

${zookeeper_home}/bin/zkServer.sh start

c. 初始化ha在zookeeper中的状态

${hadoop_home}/bin/hdfs zkfc -formatZK

d. 启动hdfs服务

${hadoop_home}/sbin/start-dfs.sh

f. 在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode

${hadoop_home}/sbin/hadoop-daemin.sh start zkfc

(4). 验证
a. 将Active NameNode进程kill

kill -9 namenode的进程id

b. 将Active NameNode机器断开网络

service network stop

YARN-HA集群配置

yarn-ha工作机制

  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的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>
    
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>${hostname1}</value>
    </property>
    
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>${hostname2}</value>
    </property>
    
    <!--指定zookeeper集群的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>${hostname1}:2181,${hostname2}:2181,${hostname3}: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>

</configuration>
  1. 启动hdfs

(1). 在各个JournalNode节点上,启动journalnode服务

${hadoop_home}/sbin/hadoop-daemon.sh start journalnode

(2). 在[nn1]上,对其进行格式化,并启动

${hadoop_home}/bin/hdfs namenode -format
${hadoop_home}/sbin/hadoop-daemon.sh start namenode

(3). 在[nn2]上,同步nn1的元数据信息

${hadoop_home}/bin/hdfs namenode -bootstrapStandby

(4). 启动[nn2]

${hadoop_home}/sbin/hadoop-daemon.sh start namenode

(5). 启动所有DataNode

${hadoop_home}/sbin/hadoop-daemons.sh start datanode

(6). 将[nn1]切换为Active

${hadoop_home}/bin/hdfs haadmin -transitionToActive nn1
  1. 启动yarn
    (1). rm1
${hadoop_home}/sbin/start-yarn.sh

(2). rm2

${hadoop_home}/sbin/yarn-daemon.sh start resourcemanager

(3). 查看服务状态

${hadoop_home}/bin/yarn rmadmin -getServiceState rm1

(4). webUI
rm1:8088

HDFS-HA工作机制

通过双NameNode消除单点故障

  1. hdfs-ha工作要点

    (1). 元数据管理方式需要改变
    内存中各自保存一份元数据;
    edits日志只有active状态的NameNode节点可以做写操作;
    两个namenode都可以读取edits;
    共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)。
    (2). 需要一个状态管理功能模块
    实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在的namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要放置brain split现象的发生。
    (3). 必须保证两个NameNode之间能够ssh无密码登录
    (4). 隔离(fence),即同一时刻仅仅有一个NameNode对外提供服务

  2. hdfs-ha自动故障转移工作机制

手动故障转移

hdfs haadmin -failover

自动故障转移
自动故障转移为hdfs部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。

hdfs-ha故障转移机制
zookeeper是维护少量协调数据,通知客户端这些数据的改变和见识客户端故障的高可用服务。HA的自动故障转移依赖于zookeeper的一下功能:

  • 故障检测:集群中每个namenode在zookeeper中维护了一个持久会话,如果机器崩溃,zookeeper中的会话将终止,zookeeper通知另一个namenode需要出发故障转移。
  • 现役namenode选择:zookeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役namenode崩溃,另一个节点可能从zookeeper获得特殊的排外锁已表明它应该成为现役namenode。

ZKFC是自动转移中的另一个新组件,是zookeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程。
ZKFC负责:

  • 健康监测:ZKFC使用一个健康命令定期地ping与之在相同主机的namenode,只要该namenode及时地恢复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点喂非健康的。
  • zookeeper会话管理:当本地namenode是健康的,ZKFC保持在一个zookeeper中打开的会话。如果本地namenode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了zookeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。
  • 基于zookeeper的选择:如果本地namenode是健康的,且ZKFC发现没有其他的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地namenode为active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役namenode,然后本地namenode转换为active状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值