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 |
---|---|---|---|
master | ssh 172.18.0.2 | 123123 | 172.18.0.2 |
slave1 | ssh 172.18.0.3 | 123123 | 172.18.0.3 |
slave2 | ssh 172.18.0.4 | 123123 | 172.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查看