PRELOADER

当前文章 : 《hadoop-HA安装》

5/5/2019 —— 

一、HA说明

HA指高可用,指当当前工作中的机器宕机后,会自动处理这个异常,并将工作无缝地转移到其他备用机器上去,以来保证服务的高可用。
HA分为NameNode HA (Hadoop 2.2.0后支持NameNode HA)和 ResourceManager HA。本次安装只实现了NameNode HA,因为NameNode非常重要,一旦NameNode挂掉会导致存储停止服务,无法进行数据的读写,基于此NameNode的计算(MR,Hive等)也无法完成。

二、集群规划

服务 centeros1 centeros2 centeros3
zookeeper
NameNode ×
DataNode
ResourceManage × ×
NodeManager
journalnode
zkfc ×

服务简介:

  • zookeeper:分布式应用程序协调服务。
  • Namenode:管理服务。管理元数据,维护目录树,响应请求。
  • Datanode:hadoop中存储数据。
  • journalnode:实现namenode数据共享,保持数据的一致性。
  • ResourceManager:yarn集群中资源的统一管理和分配
  • Nodemanager:ResourceManager在每台机器上的代理
  • zkfc:失效检测控制

三、环境准备

3.1、配置hosts,三台机器都需要配置

输入命令:

1
vi /etc/hosts

配置详情:

hadoop-HA安装

注:如有红圈内的内容需要加#注释掉,否则会引起:

1
2
java.net.ConnectException: Call From centeros2/192.168.0.176 to centeros2:8020 failed on connection exception: 
java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused

3.2、设置SSH无密码登录,三台机器都需要配置

3.2.1、生成公钥命令:ssh-keygen -t rsa

注:生成公钥过程中一直回车即可,过程中会提示输入密码,直接回车即可,否则使用ssh操作时还会让输入密码。
命令执行完成后会在.ssh目录下生成id_rsa(秘钥文件),id_rsa.pub(公钥文件)。.ssh目录是隐藏文件夹,查看.ssh目录下文件命令: ls .ssh

3.2.2、分发公钥命令:ssh-copy-id centeros1

注:每台机器生成公钥后,将公钥分发给需要操作的机器,同时也需要给自己分发。

3.3、配置NTP服务器

NTP服务器是用来进行时间同步的,来统一集群中各个机器系统时间。
3.3.1、查看是否已安装NTP
1
2
3
4
5
命令:rpm -qa | grep ntp

出现如下信息则说明已经安装了NTP服务否则需要安装NTP
ntpdate-4.2.6p5-28.el7.centos.x86_64
ntp-4.2.6p5-28.el7.centos.x86_64
3.3.2、安装NTP
1
在三台机器执行安装NTP命令:yum –y install ntp
3.3.3、配置ntp.conf
选择一台centeros3机器作为NTP服务器
修改ntp配置文件
1
vi /etc/ntp.conf
注释掉以下内容:
1
2
3
4
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
#server 3.centos.pool.ntp.org iburst
把以下内容注释去掉,如果内容不存在 手动添加
1
2
server  127.127.1.0     # local clock
fudge 127.127.1.0 stratum 10
去掉以下内容的# 192.168.30.0 修改自己的网段 192.168.0.0
1
restrict 192.168.30.0 mask 255.255.255.0 nomodify notrap
修改配置文件ntpd:
1
2
3
vi /etc/sysconfig/ntpd

添加一行配置:SYNC_CLOCK=yes
重启ntp服务:service ntpd restart
设置开机启动: chkconfig ntpd on
操作centeros1,centeros2通过contab进行定时同步:
制定定时计划命令:crontab –e
添加内容:
1
0-59/ 10  *  *  *  * /usr/sbin/ntpdate centeros3
测试配置是否有效:
查看系统时间命令:
1
date "+%Y-%m-%d %H:%M:%S"
修改centeros1的系统时间:
1
date -s '2025-01-01 00:00:00'
十分钟后查看centeros1时间是否同步

3.3.4、关闭防火墙

查看状态:

1
firewall-cmd --state

停止防火墙:

1
systemctl stop firewalld.service

开机禁止启动:

1
systemctl disable firewalld.service

四、安装zookeeper

4.1、配置环境变量

1
vi /etc/profilve

添加如下内容

1
2
export ZOOKEEPER_HOME = /home/zookeeper/zookeeper-3.4.13
export PATH = $PATH:$ZOOKEEPER_HOME/bin

4.2、拷贝conf下的zoo_sample.cfg副本,改名为zoo.cfg。

4.3、进入zookeeper目录执行命令:

1
cp conf/zoo_sample.cfg conf/zoo.cfg

4.4、修改zoo.cfg:

1
vi conf/zoo.cfg

4.5、修改zookeeper的数据文件存放的目录:

1
dataDir=/home/zookeeper/data

4.6、添加指定zookeeper集群中各个机器的信息:

1
2
3
server.1=centeros1:2888:3888
server.2=centeros2:2888:3888
server.3=centeros3:2888:3888

4.7、创建节点ID,在配置的 dataDir 路径中添加myid文件

1
echo 1 >> /home/zookeeper/data/myid

4.8、分发到其他机器

1
scp -r / home / zookeeper /zookeeper-3.4.13  centeros1: /home/zookeeper/

4.9、修改每台机器上的myid文件

1
echo 2 > /home/zookeeper/data/myid

注:myid的值对应着zoo.cfg中的配置信息,如server.3=centeros3:2888:3888
则centeros3机器上的myid的值为3,myid的值对应着server后面的数字

4.10、在各个机器上分别启动zookeeper

  • 启动命令:bin/zkServer.sh start
  • 停止命令:bin/zkServer.sh stop
  • 查看zookeeper 启动状态:bin/zkServer.sh status

注:正常状态:一个learder 两个follower

五、配置Hadoop

5.1、配置环境变量

1
vi /etc/profile

添加hadoop环境变量

1
2
3
4
5
6
7
8
export HADOOP_HOME = /home/hadoop/hadoop-3.1.1
export PATH = $PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
```

启用环境变量

```shell
source /etc/profile

5.2、配置Hadoop JDK路径

修改hadoop-env.sh、mapred-env.sh、yarn-env.sh文件中的JDK路径

1
export  JAVA_HOME= /home/java/jdk1.8.0_191

注:如文件中有export JAVA_HOME则去掉注释修改路径,没有则手动添加

5.3、修改slaves文件,指定slave服务器

1
2
3
cd $HADOOP_HOME/etc/hadoop

vi slaves

添加内容:

1
2
3
centeros1
centeros2
centeros3

5.4、修改workers文件添加datanode节点

1
vi workers

添加内容:

1
2
3
centeros1
centeros2
centeros3

5.5、配置core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<configuration>

<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop</value>
<description>HDFS的逻辑服务名,hadoop可以写成任何东西</description>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value> /home/hadoop/data/tmp </value>
<description>hadoop临时文件存放目录</description>
</property>

<property>
<name>io.file.buffer.size</name>
<value>4096</value>
<description>指定执行文件IO缓存区大小,机器好可以设置大些</description>
</property>

<property>
<name>ha.zookeeper.quorum</name>
<value> centeros3:2181,centeros2:2181,centeros1:2181 </value>
<description>指定zookeeper地址</description>
</property>

</configuration>

5.6、配置hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<configuration>

<property>
<name>dfs.nameservices</name>
<value>hadoop</value>
<description>HDFS NN的逻辑名称,需要与core-site.xml中的HDFS的逻辑服务名一致,这里使用上面的hadoop</description>
</property>

<property>
<name>dfs.ha.namenodes.hadoop</name>
<value> centeros3,centeros2 </value>
<description>hadoop逻辑名namenode节点列表,hadoop对应逻辑名</description>
</property>

<property>
<name>dfs.namenode.rpc-address.hadoop.centeros3</name>
<value>centeros3:8020</value>
<description>hadoop中centeros3的rpc通信地址</description>
</property>

<property>
<name>dfs.namenode.http-address.hadoop.centeros3</name>
<value>centeros3:50070</value>
<description>hadoop中centeros3的http通信地址</description>
</property>

<property>
<name>dfs.namenode.rpc-address.hadoop.centeros2</name>
<value>centeros2:8020</value>
<description>hadoop中centeros2的rpc通信地址</description>
</property>

<property>
<name>dfs.namenode.http-address.hadoop. centeros2</name>
<value> centeros2:50070</value>
<description>hadoop中centeros2的http通信地址</description>
</property>

<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal:// centeros3:8485;centeros2:8485;centeros1:8485/hadoop</value>
<description> journalNode 的 URI 地址,活动的namenode会将edit log写入journalNode</description>
</property>

<property>
<name>dfs.journalnode.edits.dir</name>
<value> /home/hadoop/data/dfs/jn</value>
<description>用于存放 editlog 和其他状态信息的目录</description>
</property>

<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>启动自动failover </description>
</property>

<property>
<name>dfs.client.failover.proxy.provider.hadoop</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>实现客户端与 active NameNode 进行交互的 Java类</description>
</property>

<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<description>解决HA集群脑裂问题,只允许一个nn写数据</description>
</property>

<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
<description>the location stored ssh key,指定用户密匙,建议不要用root,用于故障转移,可以不设置</description>
</property>

<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>5000</value>
<description>ssh连接超时时间,上面秘钥没设置这个也可以不设置</description>
</property>

<property>
<name>dfs.namenode.name.dir</name>
<value> /home/hadoop/data/dfs/name</value>
<description>namenode数据存放目录</description>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value> /home/hadoop/data/dfs/data</value>
<description>datanode数据存放目录</description>
</property>

<property>
<name>dfs.replication</name>
<value>2</value>
<description>client参数,node level参数,指定一个文件在hdfs中有几个副本,设置2或3即可,不能多过datanode节点数</description>
</property>

<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
<description>允许webhdfs,用于数据读取</description>
</property>

</configuration>

5.7、配置mapred-site.xml

1
2
3
4
5
6
7
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>mapreduce框架,一般用yarn</description>
</property>
</configuration>

5.8、配置yarm-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<configuration>

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>nodemanager启动时加载services的方式为mapreduce分配</description>
</property>

<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
<description>实现mapreduce_shuffle的java类</description>
</property>

<property>
<name>yarn.resourcemanager.hostname</name>
<value>centeros3</value>
<description>resourcemanager节点列表,一个namenode上有即可</description>
</property>

</configuration>

5.9、分发到其他机器

1
scp -r / home / hadoop /Hadoop-3.1.1 centeros1: /home/ hadoop /

六、启动Hadoop集群

第一次运行hadoop是需要格式化数据,启动会比较麻烦,之后的启动只需要start-all.sh停止stop-all.sh

前提:zookeeper状态正常,jdk状态正常,环境变量设置正常

6.1、启动zookeeper集群,每台机器都执行

1
/home/zookeeper/zookeeper-3.4.13/bin/zkServer.sh start

6.2、主节点centeros3

  1. 创建命名空间:bin/hdfs zkfc -formatZK
  2. 启动journalnode:sbin/hadoop-daemon.sh start journalnode(三个节点一起启动)
  3. 格式化namenode:bin/hdfs namenode -format hadoop
  4. 启动namenode:sbin/hadoop-daemon.sh start namenode
  5. 启动zfkc:sbin/hadoop-daemon.sh start zkfc

6.3、主节点二centeros2

  1. 启动journalnode:sbin/hadoop-daemon.sh start journalnode
  2. 从hdfs namenode -bootstrapStandby获取格式化后的元数据:bin/hdfs namenode -bootstrapStandby
  3. 启动namenode:sbin/hadoop-daemon.sh start namenode
  4. 启动zfkc:sbin/hadoop-daemon.sh start zkfc

    6.4、从节点一centeros1

启动journalnode

1
sbin/hadoop-daemon.sh start journalnode

上面三个节点命令运行完成后重启hadoop集群

6.5、关闭集群

1
sbin/stop-all.sh

6.6、启动集群

1
sbin/start-all.sh

6.7、成功后页面

6.7.1、centeros3:

hadoop-HA安装

6.7.2、centeros2:

hadoop-HA安装

6.8、测试HA

  1. 在centeros3执行命令:jps
  2. 查看namenode进程pid
  3. 执行命令:kill -9 pid
  4. 打开centeros3 hdfs web已经无法访问,而centeros2已切换为active状态

七、问题解决

错误:

1
2
3
4
5
6
7
8
9
10
11
ERROR: Attempting to operate on hdfs journalnode as root
ERROR: but there is no HDFS_JOURNALNODE_USER defined. Aborting operation.
Starting ZK Failover Controllers on NN hosts [centeros3 centeros2]
ERROR: Attempting to operate on hdfs zkfc as root
ERROR: but there is no HDFS_ZKFC_USER defined. Aborting operation.
Stopping journal nodes [centeros3 centeros1 centeros2]
ERROR: Attempting to operate on hdfs journalnode as root
ERROR: but there is no HDFS_JOURNALNODE_USER defined. Aborting operation.
Stopping ZK Failover Controllers on NN hosts [centeros3 centeros2]
ERROR: Attempting to operate on hdfs zkfc as root
ERROR: but there is no HDFS_ZKFC_USER defined. Aborting operation.

解决办法:

是因为缺少用户定义造成的,所以分别编辑stop-yarn.sh、start-yarn.sh加入

1
2
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root

start-dfs.sh,stop-dfs.sh加入

1
2
3
4
HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root

stop-all.sh、start-all.sh加入

1
2
3
4
5
6
HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root

问题:子节点没有datanode进程。

解决办法:

  • 在sbin下发起./stop-all.sh关闭集群
  • 删除存放hdfs数据块的文件夹(hadoop/data/tmp/),然后重建该文件夹
  • 删除hadoop下的日志文件logs
  • 在bin文件夹下./hadoop namenode -format格式化hadoop
  • 重启hadoop集群