Hadoop集群 (HA高可用) 完全分布式安装教程

操作系统 - CentOS 7 集群昵称 - hadoopCluster

0 环境准备

下载虚拟机软件和操作系统镜像

CentOS 7 下载地址:Index of /7.9.2009/isos/x86_64 选择CentOS-7-x86_64-DVD-2207-02.iso下载

VMware 下载地址:Fusion and Workstation | VMware

为VMware设置虚拟网络 -> 编辑 -> 虚拟网络编辑器 -> 选中VMnet8 -> 更改设置 -> NAT模式; 子网ip 改为192.168.170.0

1 安装第一个CentOS系统

创建新的虚拟机 -> 自定义 -> 下一步 -> 稍后安装操作系统 -> Linux, 版本选择 CentOS 7 64位 -> 下一步 -> 虚拟机昵称hadoop101 -> 下一步 -> 内存设置为1024 (或2048) -> 使用网络地址转接(NAT) -> 下一步 -> 下一步 -> 创建新虚拟硬盘 -> 20-40GB, 拆分成多个文件 -> 下一步 ->完成

点击新建的虚拟机hadoop101 -> 编辑虚拟机设置 -> 选择 CD/DVD (IDE) -> 使用ISO映像文件, 选择新下载的CentOS镜像

启动虚拟机 -> 选择Install CentOS 7 -> 选择语言(English - US) Next -> 设置时间(ShangHai) SYSTEM区会有感叹号提示, 点击"INSTALLATION DESTINATION"后点击左上角"Done"即可 -> (可以跳过)在"NETWORK & HOST NAME"设置主机昵称Host name -> Begin Installation 开始安装 -> 点击 “ROOT PASSWORD” 设置root用户密码 -> Reboot

2 配置Hostname、IP、防火墙

登录root用户

修改主机名

1
hostnamectl set-hostname hadoop101

配置网络

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# ifcfg-ens33 中的 33 需要替换成实际的文件名, 大多数为33 或 32
vi /etc/sysconfig/network-scripts/ifcfg-ens33

# 修改成下面的值(没提到的不用动)
# 注意 IPADDR和GATEWAY的值需要和VMware虚拟网络配置匹配
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.170.101
NETMASK=255.255.255.0
GATEWAY=192.168.170.2
DNS1=114.114.114.114
DNS2=8.8.8.8

# 修改完成后重启网络
systemctl restart network

此时就可以正常连接网络了,可以 ping baidu.com 进行测试

更新和下载软件包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 下载阿里云源配置文件
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 更新缓存
yum clean all
yum makecache
# 更新软件
yum update -y
# 下载必须软件
yum -y install openssh-server vim net-tools
# (可选)下载其他常用软件
yum -y install gcc gcc-c++ autoconf automake cmake make \
 zlib zlib-devel openssl openssl-devel pcre-devel \
 rsync man zip unzip tcpdump lrzsz tar wget nano

配置hosts

1
2
3
4
5
6
vi /etc/hosts

# 添加以下内容
192.168.170.101	hadoop101
192.168.170.102	hadoop102
192.168.170.103	hadoop103

关闭防火墙

1
2
3
4
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

systemctl stop firewalld
systemctl disable firewalld

同步时间

1
2
3
4
5
6
yum install chrony -y
# 启动服务
systemctl start chronyd
systemctl enable chronyd
# 同步时间
chronyc makestep

(可选)3 创建hadoop用户

对于生产环境, 通常推荐单独创建一个hadoop用户进行权限限制, 如果只是用于学习开发可以跳过此环节 如果未跳过此环节,后面的步骤需全部使用新创建的hadoop用户执行,并将配置文件中的用户设置为hadoop

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建用户
sudo useradd -m hadoop
# 设置密码
sudo passwd hadoop

# 将 Hadoop 用户添加到 wheel 组
sudo usermod -aG wheel hadoop

# 为 Hadoop 用户设置权限
sudo chown -R hadoop:hadoop /opt
sudo chmod -R 755 /opt

4 安装JDK

openjdk下载地址 Java Downloads | Oracle 选择 x64 Compressed Archive下载 下载完成后 使用shell工具 将文件传输到系统的/opt中;或者直接进入/opt目录执行 wget \<下载链接\>

1
2
3
4
5
6
7
mkdir /usr/local/software

# 解压 (此处需要替换为上传的jdk压缩包)
tar -zxvf /opt/jdk-8u451-linux-x64.tar.gz -C /usr/local/software

# 更改文件夹昵称
mv /usr/local/software/jdk1.8.0_451/ /usr/local/software/jdk

配置环境变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 此处可以修改/etc/profile,下面方法可以起到隔离的作用
vim /etc/profile.d/my_env.sh

# 添加以下内容
export JAVA_HOME=/usr/local/software/jdk
export PATH=$PATH:$JAVA_HOME/bin

# 激活
source /etc/profile.d/my_env.sh

# 检查是否安装成功
java -version

5 配置Zookeeper

zookeeper下载地址 Apache ZooKeeper 推荐选择下载latest stable release版本 (书写该文档时为3.8.4)

上传至/opt文件夹后 ->

1
2
3
4
# 解压
tar -zxvf /opt/apache-zookeeper-3.8.4-bin.tar.gz -C /usr/local/software/
# 重命名
mv /usr/local/software/apache-zookeeper-3.8.4-bin/ /usr/local/software/zookeeper

配置环境变量

1
2
3
4
5
vim /etc/profile.d/my_env.sh

# 添加以下内容
export ZOOKEEPER_HOME=/usr/local/software/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

​ 使用 source /etc/profile.d/my_env.sh 激活

创建 快照数据和日志 存储需要的文件夹

1
2
mkdir -p /home/zookeeper/data
mkdir -p /home/zookeeper/datalog

创建配置文件

 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
vim /usr/local/software/zookeeper/conf/zoo.cfg

# 添加以下内容:

# 心跳单位,2s
tickTime=2000
# zookeeper-3初始化的同步超时时间,10个心跳单位,也即20s
initLimit=10
# 普通同步:发送一个请求并得到响应的超时时间,5个心跳单位也即10s
syncLimit=5
# 内存快照数据的存储位置
dataDir=/home/zookeeper/data
# 事务日志的存储位置
dataLogDir=/home/zookeeper/datalog
# 当前zookeeper-3节点的端口 
clientPort=2181
# 单个客户端到集群中单个节点的并发连接数,通过ip判断是否同一个客户端,默认60
maxClientCnxns=1000
# 保留7个内存快照文件在dataDir中,默认保留3个
autopurge.snapRetainCount=7
# 清除快照的定时任务,默认1小时,如果设置为0,标识关闭清除任务
autopurge.purgeInterval=1
#允许客户端连接设置的最小超时时间,默认2个心跳单位
minSessionTimeout=4000
#允许客户端连接设置的最大超时时间,默认是20个心跳单位,也即40s,
maxSessionTimeout=300000
#zookeeper-3 3.5.5启动默认会把AdminService服务启动,这个服务默认是8080端口
admin.serverPort=9001
#集群地址配置
server.1=hadoop101:2888:3888
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888

6 安装Hadoop

Hadoop下载地址 Apache Hadoop 推荐下载主流的3.3.x版本 选择Binary download - binary 进行下载 (文档书写时为3.3.6)

上传至/opt后 ->

1
2
3
4
# 解压
tar -zxvf /opt/hadoop-3.3.6.tar.gz -C /usr/local/software/
# 重命名
mv /usr/local/software/hadoop-3.3.6/ /usr/local/software/hadoop

配置环境变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vim /etc/profile.d/my_env.sh

# 添加以下内容: (root 为使用集群的 系统用户)

export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
export HADOOP_SHELL_EXECNAME=root

export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

export HADOOP_HOME=/usr/local/software/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

​ 使用 source /etc/profile.d/my_env.sh 激活

7 编辑Hadoop配置文件

编辑/usr/local/software/hadoop/etc/hadoop/ 中的配置文件 hadoopCluster 为集群的名字(可自由更改)

hadoop-env.sh vim /usr/local/software/hadoop/etc/hadoop/hadoop-env.sh 追加 ↓

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
export JAVA_HOME=/usr/local/software/jdk

export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
export HADOOP_SHELL_EXECNAME=root

export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

core-site.xml vim /usr/local/software/hadoop/etc/hadoop/core-site.xml 将<configuration>标签替换为↓

 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
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoopCluster</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/data</value>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
  </property>
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
  </property>
  <property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
  </property>
  <property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
  </property>
  <property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
  </property>
</configuration>

hdfs-site.xml vim /usr/local/software/hadoop/etc/hadoop/hdfs-site.xml 将<configuration>标签替换为↓ 注:倒数第4个 <property> 标签,如果使用新建用户 需要替换为实际的系统用户昵称

 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
<configuration>
  <property>
    <name>dfs.nameservices</name>
    <value>hadoopCluster</value>
  </property>
  
  <!-- HA模式有两个NameNode,分别是nn1,nn2 -->
  <property>
    <name>dfs.ha.namenodes.hadoopCluster</name>
    <value>nn1,nn2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hadoopCluster.nn1</name>
    <value>hadoop101:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hadoopCluster.nn2</name>
    <value>hadoop102:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hadoopCluster.nn1</name>
    <value>hadoop101:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hadoopCluster.nn2</name>
    <value>hadoop102:9870</value>
  </property>
  
 <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/hadoopCluster</value>
  </property>
  
  <!-- 指定该集群出故障时,哪个实现类负责执行故障切换 -->
  <property>
    <name>dfs.client.failover.proxy.provider.hadoopCluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  
 <!-- 配置隔离机制方法-->
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  
  <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
  </property>
  
  <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/journalnode/data</value>
  </property>
  
  <!-- 开启NameNode失败自动切换 -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.safemode.threshold.pct</name>
    <value>1</value>
  </property>
</configuration>

workers vim /usr/local/software/hadoop/etc/hadoop/workers 清空内容并替换为↓

1
2
3
hadoop101
hadoop102
hadoop103

mapred-site.xml vim /usr/local/software/hadoop/etc/hadoop/mapred-site.xml 将<configuration>标签替换为↓

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  
  <!-- yarn历史服务端口 -->
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop101:10020</value>
  </property>
  
  <!-- yarn历史服务web访问端口 -->
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop101:19888</value>
  </property>
</configuration>

yarn-site.xml vim /usr/local/software/hadoop/etc/hadoop/yarn-site.xml 将<configuration>标签替换为↓

 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
<configuration>
    <!-- 启用resourcemanager -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    
    <!-- 集群ID设置的名字-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>hadoopCluster</value>
    </property>
    
    <!--resourcemanager设置了两台互为备份-->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    
    <!--rm1与rm2的地址-->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop101</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop102</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hadoop101:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>hadoop102:8088</value>
    </property>
    <!--配置zookeeper的地址-->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
    <!-- 是否将对容器实施物理内存限制 -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
 
    <!-- 是否将对容器实施虚拟内存限制。 -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <!-- 开启日志聚集 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
 
    <!-- 设置yarn历史服务器地址 -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://hadoop101:19888/jobhistory/logs</value>
    </property>
 
    <!-- 保存的时间7天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
</configuration>

8 克隆虚拟机

此时可以关闭虚拟机,保存快照,完整克隆2次虚拟机 分别为hadoop102、hadoop103

克隆完毕后分别为两个新建的虚拟机修改 Hostname 和 IP

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 修改主机名 替换NewName
hostnamectl set-hostname NewName

# 修改ip (ifcfg-ens33 替换为实际的文件名 一般为ens33)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
	# 修改 IPADDR 条目
IPADDR=192.168.170.10x

# 重启网络
systemctl restart network
# 重启电脑
reboot

9 配置免密登录

hadoop101

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

# 复制密钥
ssh-copy-id root@hadoop101
ssh-copy-id root@hadoop102
ssh-copy-id root@hadoop103

# 测试连接
ssh root@hadoop102
ssh root@hadoop103

# 分发密钥
scp -r ~/.ssh/ root@hadoop102:~/
scp -r ~/.ssh/ root@hadoop103:~/

10 配置zookeeper myid

hadoop101

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

hadoop102

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

hadoop103

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

11 Hadoop初始化

①启动zookeeper服务 hadoop101、hadoop102、hadoop103

1
zkServer.sh start

②启动JournalNode hadoop101、hadoop102、hadoop103

1
hdfs --daemon start journalnode

③初始化hdfs hadoop101 (选择有namenode的一台机器即可)

1
hdfs namenode -format

④将初始化后的元数据拷贝到另一个namenode节点 -> hadoop102, 目录是core-site.xml中hadoop.tmp.dir配置的数据源 hadoop101

1
scp -r /home/hadoop/data root@hadoop102:/home/hadoop

⑤启动namenode hadoop101

1
hdfs --daemon start namenode

⑥在没有格式化的namenode服务器执行 -> hadoop102

1
hdfs namenode -bootstrapStandby

⑦启动第二个namenode hadoop102

1
hdfs --daemon start namenode

⑧将namenode信息注册到zookeeper, 在任意以爱namenode节点执行-> hadoop101

1
hdfs zkfc -formatZK

⑨结束全部进程 -> hadoop101

1
stop-dfs.sh

到此,Hadoop HA 集群就已经部署完毕了!

12 开启与关闭集群

开启

hadoop101、hadoop102、hadoop103

1
2
3
4
# 开启zookeeper服务
zkServer.sh start
# 开启journalnode服务
hdfs --daemon start journalnode

hadoop101

1
2
# 启动集群
start-all.sh

启动历史服务器(应该在配置好历史服务器的服务器进行启动) -> jobhistory服务 hadoop101

1
mapred --daemon start historyserver

此时 hadoop101 执行jps 应该出现以下进程:

1
2
3
4
5
6
7
8
9
16674 QuorumPeerMain
47330 JobHistoryServer
43347 ResourceManager
43556 NodeManager
47928 Jps
42842 DFSZKFailoverController
40635 JournalNode
42315 DataNode
42109 NameNode

关闭

hadoop101

1
2
mapred --daemon stop historyserver
stop-all.sh

hadoop101、hadoop102、hadoop103

1
zkServer.sh stop

x 参考文献

Hadoop3.x完全分布式详细配置_hadoop3部署-CSDN博客

Hadoop高可用集群搭建(超详细)_docker搭建hadoop高可用集群-CSDN博客