文章目录
1. hadoop ha 原理描述
为什么会有 hadoopHA机制呢?
HA:High Available,高可用
在Hadoop2.0之前,在HDFS 集群中NameNode 存在单点故障 (SPOF:ASinglePointofFailure)。 对于只有一个NameNode 的集群,如果NameNode 机器出现故障(比如宕机或是软件、硬件 升级),那么整个集群将无法使用,直到 NameNode 重新启动
那如何解决呢?
HDFS 的 HA 功能通过配置 Active/Standby 两个 NameNodes 实现在集群中对 NameNode 的 热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器。
在一个典型的 HDFS(HA) 集群中,使用两台单独的机器配置为 NameNodes 。在任何时间点, 确保 NameNodes 中只有一个处于 Active 状态,其他的处在 Standby 状态。其中 ActiveNameNode 负责集群中的所有客户端操作,StandbyNameNode 仅仅充当备机,保证一 旦 ActiveNameNode 出现问题能够快速切换。
为了能够实时同步 Active 和 Standby 两个 NameNode 的元数据信息(实际上 editlog),需提供一个共享存储系统,可以是 NFS、QJM(Quorum Journal Manager)或者 Zookeeper,Active Namenode 将数据写入共享存储系统,而 Standby 监听该系统,一旦发现有新数据写入,则 读取这些数据,并加载到自己内存中,以保证自己内存状态与 Active NameNode 保持基本一 致,如此这般,在紧急情况下 standby 便可快速切为 active namenode。为了实现快速切换, Standby 节点获取集群的最新文件块信息也是很有必要的。为了实现这一目标,DataNode 需要配置 NameNodes 的位置,并同时给他们发送文件块信息以及心跳检测。
2. 集群规划
组件\节点 | hdp01 | hdp02 | hdp03 |
---|---|---|---|
namenode | √ | √ | |
zkfc(和namenode同节点) | √ | √ | |
datanode | √ | √ | √ |
resourcemananger | √ | √ | |
nodemanager | √ | √ | √ |
QuorumPeerMain(zookeeper) | √ | √ | √ |
journalnode(QJM) | √ | √ | √ |
3. 集群服务器准备
hdoop-2.7.7.tar.gz (清华镜像下载)
1. 配置IP和主机名称映射
hdp01/hdp02/hdp03
vi /etc/hosts
10.211.55.20 hdp01
10.211.55.21 hdp02
10.211.55.22 hdp03
2. 关闭防火墙
hdp01/hdp02/hdp03
[root@hdp01 ~]# systemctl stop firewalld.service
[root@hdp01 ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
[root@hdp01 ~]# firewall-cmd --state
not running
3. 关闭selinux
hdp01/hdp02/hdp03
[root@hdp01 ~]# vi /etc/selinux/config
SELINUX=disabled
4. 同步时间
hdp01/hdp02/hdp03
[root@hdp01 ~]# yum install -y ntp
[root@hdp01 ~]# ntpdate cn.pool.ntp.org
17 Nov 20:51:55 ntpdate[6057]: adjust time server 144.76.76.107 offset -0.056250 sec
5. 配置sudo权限
所有节点添加用户hdp01
以hdp01节点为例添加sudo权限,hdp02/hdp03同样操作
#文件/etc/sudoers需要写权限
[root@hdp01 ~]# chmod u+w /etc/sudoers
[root@hdp01 ~]# vi /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
hdp01 ALL=(ALL) ALL
#添加完撤销文件/etc/sudoers的写权限
[root@hdp01 ~]# chmod u-w /etc/sudoers
注:
youuser ALL=(ALL) ALL
%youuser ALL=(ALL) ALL
youuser ALL=(ALL) NOPASSWD: ALL
%youuser ALL=(ALL) NOPASSWD: ALL
第一行:允许用户youuser执行sudo命令(需要输入密码)。
第二行:允许用户组youuser里面的用户执行sudo命令(需要输入密码)。
第三行:允许用户youuser执行sudo命令,并且在执行的时候不输入密码。
第四行:允许用户组youuser里面的用户执行sudo命令,并且在执行的时候不输入密码。
6. 安装jdk环境
/hdp01/hdp02/hdp03
export JAVA_HOME=/usr/local/jdk1.8.0_211
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
7. 切换用户配置ssh免密登录
hdp01到hdp02为例,hdp02/hdp03同样,同时也要ssh-copy-id 到自己
[hdp01@hdp01 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hdp01/.ssh/id_rsa):
Created directory '/home/hdp01/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hdp01/.ssh/id_rsa.
Your public key has been saved in /home/hdp01/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gQ7xVHxRW8FYEUBHNtLBOEMQE75ztajBZ8Sa++8IK/0 hdp01@hdp01
The key's randomart image is:
+---[RSA 2048]----+
| . .o. *O*X%= |
| + ....o=*+. |
| . o ... +o. |
| o o = o . |
| . S B = . |
| O |
| .+ |
| . .+ . |
| ...Eoo |
+----[SHA256]-----+
[hdp01@hdp01 ~]$ ssh-copy-id hdp01@hdp02
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/hdp01/.ssh/id_rsa.pub"
The authenticity of host 'hdp02 (10.211.55.21)' can't be established.
ECDSA key fingerprint is SHA256:fZz+As5buFupBNAVjz3YKv6el8NaIMsqRmwl3mUUcv0.
ECDSA key fingerprint is MD5:8b:b5:09:6a:41:f1:5d:7a:0c:18:4c:ca:bb:3e:35:f0.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
hdp02@hdp02's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'hdp02@hdp02'"
and check to make sure that only the key(s) you wanted were added.
[hdp01@hdp01 ~]$ ssh hdp01@hdp02
Last login: Sun Nov 17 21:08:21 2019
[hdp01@hdp02 ~]$ exit
登出
Connection to hdp02 closed.
[hdp01@hdp01 ~]$ ssh hdp01@hdp01
8. 安装zookeeper集群
4. 集群安装
1. 下载包hdoop-2.7.7.tar.gz
cd /home/hdp01/apps
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
tar zxvf hadoop-2.7.7.tar.gz
2. 配置hadoop文件
#切换目录
cd /home/hdp01/apps/hadoop-2.7.7/etc/hadoop
hadoop-env.sh
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/local/jdk1.8.0_211
core-site.xml
<configuration>
<!-- 指定 hdfs 的 nameservice 为 bd1809 hdfs的访问入口 -->
<property>
<