Hadoop HA简介

HDFS HA架构图如下:

HA: High Availabilty 高可用的意思; ZK: ZooKeeper 分布式应用程序服务的组件; NN: NameNode 管理文件系统的元数据信息; DN: DataNode 存储数据的; JN: JournalNode 主要用于NN的数据共享; ZKFC: ZooKeeperFailoverControl 监控和管理NN的状态。

HA 使用 active NN 和 standby NN两个节点解决单点问题,两个 NN 节点通过 JN 集群共享状态,通过 ZKFC 选举 active,监控 NN 的状态,实现自动备源,DN 会同时向两个 NN 节点发送心跳

Yarn HA架构图:

ResourceManager(RM) a: 启动的时候 RM 会向 zookeeper 的目录 /hadoop-ha 写一个 lock 文件,如果成功则为 active,否则为 standby,standby RM 会一直监控lock文件是否存在,如果不存在,则尝试创建 lock 文件,争取成为active RM。 b: 会接受客户端的任务请求,接受和监控nm的资源报告,负责资源的分配和调用,并启动和监控ApplicationMaster(AM)。

NodeManager(NM)

a. 负责节点上资源的管理,启动 container 容器,task 任务计算,上报资源给 RM。 b. container 情况汇报给 RM。 c. task任务处理的情况汇报给 ApplicationMaster(AM)。

ApplictionMaster(AM) a. 负责每个 appliction(job) 的 task 管理和调度,并向rm发送资源申请,资源申请到之后,向 nm 发动 launch container 指令,接口 task 的处理状态信息。

RMstatestore a. RM 的作业信息存储在 /rmstore下,active RM 会向这个目录写一些 app 信息。 b. 当 active RM 挂掉之后,standby RM 转换为 active RM 之后,会从 /rmstore 目录下读取相应的作业信息,重新构建内存的作业信息,然后启动内部服务,开始接受 NM 的心跳,构建集群资源信息,并接受客户端的提交作业等。

ZKFC 自动故障转移 ,作为 RM 进程的一个线程,并非独立的守护进程。

示例集群信息

以下表格为本教程所用示例集群节点信息:

我们准备了三台虚拟服务器,连接方式如下:

服务器SSH密码ip
masterssh 172.18.0.2123123172.18.0.2
slave1ssh 172.18.0.3123123172.18.0.3
slave2ssh 172.18.0.4123123172.18.0.4

第一步我们需要在 evassh 服务器初始化虚拟服务器:

cd /opt
wrapdocker
ulimit -f unlimited
docker load -i ubuntu16-ssh.tar
docker-compose up -d

注意:请不要在各个虚拟服务器之间进行 ssh 登录,这种操作会导致无法保存配置数据。正确方法是:在虚拟服务器里执行 exit 后回到 evassh 服务器,再按上述方法登录各虚拟服务器。

文件传输

通过 scp 命令将 evassh 上面的 Java 安装包、Zookeeper安装包 与 Hadoop 安装包放入 master 服务器上的/opt 目录下。

scp /opt/jdk-8u141-linux-x64.tar.gz root@172.18.0.2:/opt
scp /opt/hadoop-3.1.0.tar.gz root@172.18.0.2:/opt
scp /opt/zookeeper-3.4.5.tar.gz root@172.18.0.2:/opt

第一次连接,会询问是否继续连接。键盘输入 yes 并输入密码 123123 即可进行传输。

配置免密登录

在集群搭建过程中,我们会频繁的在各个服务器之间跳转,此过程是通过 SSH 去连接的,为了避免启动过程输入密码,我们可以配置免密登录。

1、分别在 master、slave1、slave2 生成密钥,命令如下:

在 master 服务器生成秘钥:

# 进入 master 服务器,键盘输入 yes 与 密码 123123
ssh 172.18.0.2
ssh-keygen -t rsa
# 执行命令之后,连着按三个回车键即可生成秘钥。

在 salve1 服务器生成秘钥:

进入 salve1 服务器,键盘输入 yes 与 密码 123123
ssh 172.18.0.3
ssh-keygen -t rsa

在 salve2 服务器生成秘钥:

进入 salve2 服务器,键盘输入 yes 与 密码 123123
ssh 172.18.0.4
ssh-keygen -t rsa

master、slave1和slave2直接已经做了映射,所以这里不需要再做映射。

2、 在 master 复制 master、slave1、slave2 的公钥。

cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
ssh slave1 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
ssh slave2 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys

密码为:123123

3、 在 slave1 复制 master 的 authorized_keys 文件。

ssh master cat ~/.ssh/authorized_keys>> ~/.ssh/authorized_keys

4、 在 slave2 复制 master 的 authorized_keys 文件。

ssh master cat ~/.ssh/authorized_keys>> ~/.ssh/authorized_keys

集群之间免密至此设置成功

集群安装 JavaJDK

在 master 服务器的 /opt 目录下有 evassh 服务器传过来的 Java 安装包与 Hadoop 安装包。解压 Java 安装包至/usr/local目录下。

tar -zxvf /opt/jdk-8u141-linux-x64.tar.gz -C /usr/local/

解压好JDK之后还需要在环境变量中配置JDK,才可以使用,接下来就来配置JDK。 输入命令:vim /etc/profile 编辑配置文件; 在文件末尾输入如下代码(不可以有空格):

export JAVA_HOME=/usr/local/jdk1.8.0_141
export PATH=$PATH:$JAVA_HOME/bin

然后,保存并退出。

最后:source /etc/profile使刚刚的配置生效。

输入:java -version 出现如下界面代表配置成功。

将解压好的JDK与配置文件通过 scp 命令发送至 slave1、slave2 中。

发送JDK
scp -r /usr/local/jdk1.8.0_141/ root@slave1:/usr/local/
scp -r /usr/local/jdk1.8.0_141/ root@slave2:/usr/local/
#发送配置文件
scp /etc/profile root@slave1:/etc/
scp /etc/profile root@slave2:/etc/

slave1 和 slave2 服务器上分别执行source /etc/profile使发送来的配置生效。

Zookeeper 安装

在 master上解压 evassh 传输过来的 Zookeeper 安装包,并将解压后的文件夹改名为zookeeper。

zookeeper 官网:Apache ZooKeeper
下载地址: Apache ZooKeeper

tar -zxvf /opt/zookeeper-3.4.5.tar.gz -C /usr/local/
cd /usr/local
mv zookeeper-3.4.5/ zookeeper

进入 Zookeeper 配置文件存放的文件夹中,将 zoo_sample.cfg 模板文件 修改名字为 zoo.cfg,并修改:

cd /usr/local/zookeeper/conf/
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg

dataDir:设置数据文件目录和数据持久化路径

修改
dataDir=/usr/local/zookeeper/zkdata
#并添加(提供的虚拟机内部,已经做了ip映射)
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

添加的配置为zookeeper集群的服务器编号以及对应的主机名 选举端口号和通信端口号 (server .1 代表对应服务器编号)

创建 zkdata 文件夹,并创建 myid 文件夹,内容为 1。

cd /usr/local/zookeeper
mkdir zkdata
cd zkdata
echo 1 > myid
查看
cat myid

通过 scp 命令将zookeeper的文件夹发送至 slave1 和 slave2 的 /usr/local 中。

scp -r /usr/local/zookeeper slave1:/usr/local/
scp -r /usr/local/zookeeper slave2:/usr/local/

slave1 和 slave2 服务器分别将 /usr/local/zookeeper/zkdata 中myid 改为 2 和 3。

slave1上执行
cd /usr/local/zookeeper/zkdata/
echo 2 > myid
#slave2上执行
cd /usr/local/zookeeper/zkdata/
echo 3 > myid

配置环境变量 vi /etc/profile

export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

source /etc/profile并使得生效。

另外 2 台服务器也配置环境变量,source /etc/profile并使得生效

scp /etc/profile root@slave1:/etc/
scp /etc/profile root@slave2:/etc/

3 台虚拟机分别使用命令zkServer.sh start启动 Zookeeper 服务启动成功后,使用命令zkServer.sh status查看状态 其中 leader 代表集群主节点,follower 代表从节点。

jps查看 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐