1. 前期准备

1.1 安装Ubuntu

在VM导入Ubuntu的镜像源

1.2 导入必要的包

因为新安装的Ubuntu缺少很多组件,在这里先安装必要的包

1、更新软件源

1
sudo apt-get update

2、安装Vim

1
sudo apt-get install vim

3、安装ssh

1
2
3
sudo apt-get install openssh-client
sudo apt-get install openssh-server
sudo /etc/init.d/ssh restart

4、安装git

1
sudo apt-get install git

5、安装zlib

1
2
3
sudo apt-get install zlib1g-dev
sudo apt-get install libx32z1-dev
sudo apt-get install lib32z1

6、安装网络工具

1
sudo apt install net-tools

1.3 配置网络

首先输入,查看目前的Gateway

1
route -n

输入(Ubuntu22版本)

1
sudo vim /etc/netplan/01-network-manager-all.yaml

修改内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## Let NetworkManager manage all devices on this system
network: ## 网络
version: 2 ## 版本
renderer: NetworkManager ## 渲染器
ethernets: ## 以太网
ens33:
addresses: [192.168.10.101/24] #你要配置的IP地址
dhcp4: false
dhcp6: false
routes:
- to: default
via: 192.168.10.2 ## 默认网关(刚刚获取到的)
nameservers: ## 域名服务器
addresses: [8.8.8.8, 114.114.114.114]

保存后,输入指令,修改执行权限

1
sudo chmod 0600 /etc/netplan/01-network-manager-all.yaml

然后输入指令,应用配置

1
sudo netplan apply

最后输入指令,查看是否生效

1
ifconfig

并ping ip,查看是否联网

1
ping baidu.com

1.4 修改节点名称

打开主机名字文件,修改本台主机的主机名称

1
vim /etc/hostname
1
Node01

1.5 JDK的安装

输入指令查看是否存在jdk,如果存在,则卸载(高于1.8版本的java不适配NameNode)

1
java -version

然后输入

1
sudo apt install openjdk-8-jdk-headless

等待安装完成后,输入指令查看java地址

1
update-alternatives --config java

输入以下指令,打开文件

1
sudo vim ~/.bashrc

根据显示的java地址,在文件末尾加上

1
2
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

保存配置文件后,需要重新加载配置文件以使更改生效。

1
source ~/.bashrc

然后输入指令,查看环境变量是否生效.

1
echo $JAVA_HOME

2. Hadoop的安装

2.1 创建地址目录

输入指令,创建存放Hadoop的文件

1
mkdir -n ~/software

然后进入该目录

1
cd ~/software

2.2 下载Hadoop

输入指令,从镜像源那边下载Hadoop,这里从清华镜像源下载(注意文件有将近1个G,流量党谨慎),原地址为清华镜像源

1
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.4.0/hadoop-3.4.0.tar.gz

输入指令,解压Hadoop文件

1
tar -zxvf hadoop-3.4.0.tar.gz

2.3 配置Hadoop环境变量

输入以下指令,打开文件

1
sudo vim ~/.bashrc

在文件末尾加上

1
2
export HADOOP_HOME=~/software/hadoop-3.4.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

重新加载配置文件以使更改生效

1
source ~/.bashrc

然后查看是否配置生效

1
echo $HADOOP_HOME

查看Hadoop版本是否一致

1
hadoop version

3. 三台主机的配置

3.1 hosts文件配置

在Node1主机中输入

1
sudo vim /etc/hosts

然后在文件中加入3台主机的IP和主机名称

1
2
3
192.168.10.101 Node01
192.168.10.102 Node02
192.168.10.103 Node03

3.2 其余两台虚拟机克隆

关闭Node01主机,然后进行克隆,分别在Node01的基础上,创建Node02和Node03,然后分别更改各自主机名称以及IP地址,更改完成后,3台主机之间互ping,看看是否能连通

1
2
3
ping Node01
ping Node02
ping Node03

3.3 SSH免密登录

在3台主机之间相互ssh(每台主机之间都要互相ssh)

1
2
3
ssh Node01
ssh Node02
ssh Node03

这时候就会发现,在该主机用户的目录下,生成了’.ssh’文件,然后一次在每台主机输入指令

1
ssh-keygen -t rsa

并且一直回车键,直到完成后,输入以下指令

1
2
3
ssh-copy-id Node01
ssh-copy-id Node02
ssh-copy-id Node03

每台主机都要执行上述指令,直至可以相互免密ssh访问为止

3.4 文件分发脚本编写

创建bin文件夹下的xsync脚本

1
mkdir ~/bin/xsync

在脚本中输入

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
#!/bin/bash 

#1. 判断参数个数
## 判断参数是否小于1
if [ $## -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi

#2. 遍历集群所有机器
## 对Node01,Node02,Node03都进行分发
for host in Node01 Node02 Node03
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do

#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)

#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
## 如果不存在
else
echo $file does not exists!
fi
done
done

4. 集群配置

4.1 NameNode配置

在HOME_HADOOP/etc/hadoop/core-site.xml中,指定Node01为NameNode节点

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
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://Node01:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/ldy/software/hadoop-3.4.0/data</value>
</property>

<!-- 配置HDFS网页登录使用的静态用户为ldy -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>ldy</value>
</property>

<!-- 配置该ldy(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.ldy.hosts</name>
<value>*</value>
</property>
<!-- 配置该ldy(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.ldy.groups</name>
<value>*</value>
</property>
<!-- 配置该ldy(superUser)允许通过代理的用户-->
<property>
<name>hadoop.proxyuser.ldy.users</name>
<value>*</value>
</property>
</configuration>

4.2 HDFS配置

在HADOOP_HOME/etc/hadoop/hdfs-site.xml中配置

1
2
3
4
5
6
7
8
9
10
11
12
13
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>Node01:9870</value>
</property>

<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Node03:9868</value>
</property>
</configuration>

4.3 Yarn配置

在yarn-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
<configuration>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Node02</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>

<!--yarn单个容器允许分配的最大最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>

<!-- yarn容器允许管理的物理内存大小 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>

<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>

4.4 环境变量配置

输入指令

1
vim etc/hadoop/hadoop-env.sh

在开头加入

1
2
3
4
5
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

export HADOOP_HOME=~/software/hadoop-3.4.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

4.5 MapReduce配置

在mapred-site.xml中配置

1
2
3
4
5
6
7
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

4.6 workers配置

打开workers文件,输入以下内容

1
2
3
Node01
Node02
Node03

4.7 历史服务器配置

在mapred-site.xml中配置以下内容

1
2
3
4
5
6
7
8
9
10
11
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>Node01:10020</value>
</property>

<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Node01:19888</value>
</property>

4.8 日志聚集的配置

在yarn-site.xml中配置以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://Node01:19888/jobhistory/logs</value>
</property>

<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>

4.9 分发更改内容

1
xsync /home/ldy/software/hadoop-3.4.0/etc/hadoop/

5. 群起集群

5.1 格式化节点

如果是第一次启动集群,要在Node01格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)

1
bin/hdfs namenode -format

5.2 启动HDFS

输入指令

1
sbin/start-dfs.sh

然后在Node02输入

1
sbin/start-yarn.sh

到网页上进入网址http://Node01:9870/
如果页面正常显示,则说明启动成功

5.3 启动Yarn

输入

1
sbin/start-yarn.sh

进入Web端http://Node03:9868/status.html
如果页面正常显示,则说明启动成功

5.4 集群启动脚本

进入home下的bin目录

1
cd ~/bin/

输入指令,创建脚本

1
vim hadoop.sh

输入以下代码

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
#!/bin/bash
if [ $## -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="

echo " --------------- 启动 hdfs ---------------"
ssh Node01 "$HADOOP_HOME/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh Node02 "$HADOOP_HOME/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh Node01 "$HADOOP_HOME/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="

echo " --------------- 关闭 historyserver ---------------"
ssh Node01 "$HADOOP_HOME/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh Node02 "$HADOOP_HOME/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh Node01 "$HADOOP_HOME/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac

保存退出后设置权限

1
chmod 777 hadoop.sh

然后启动集群

1
hadoop start

输入jps

1
jps

观察到

2468 JobHistoryServer
2294 NodeManager
1879 NameNode
2535 Jps
2014 DataNode

说明集群启动成功

5.5 进程查看脚本

同理,在home/bin目录下创建指令文件

1
vim all.sh

在文件中输入代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

## 定义节点列表
nodes=("Node01" "Node02" "Node03")

## 遍历每个节点,执行 jps 命令
for node in "${nodes[@]}"; do
echo "---- jps on $node ----"

## 使用 SSH 执行 jps 命令并获取结果
ssh "$node" "jps"

echo ""
done

保存后更改权限

1
chmod 777 all.sh

然后执行该指令

1
all.sh

如果显示以下内容,则说明集群和脚本都成功执行

---- jps on Node01 ----
2468 JobHistoryServer
2294 NodeManager
1879 NameNode
2668 Jps
2014 DataNode

---- jps on Node02 ----
9266 Jps
8660 ResourceManager
8488 DataNode
8794 NodeManager

---- jps on Node03 ----
87143 Jps
86648 DataNode
86874 NodeManager
86765 SecondaryNameNode