一:运行模式概述

  • Hadoop 官方网站:http://hadoop.apache.org/
  • Hadoop 运行模式包括:本地模式、伪分布式模式以及完全分布式模式。
    • 本地模式:单机运行,可以执行官方案例。生产环境不用。
    • 伪分布式模式:也是单机运行,但是具备 Hadoop 集群的所有功能,一台服务器模 拟一个分布式的环境。生产环境不用。
    • 完全分布式模式:多台服务器组成分布式环境。生产环境使用。

二:本地运行模式

演示官方WordCount案例:

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
# 创建目录
[root@hadoop100 hadoop-3.3.4]# mkdir wcinput
# 创建文件
[root@hadoop100 wcinput]# vim word.txt
# 查看文件内容
[root@hadoop100 wcinput]# cat word.txt
ghost ghost
sum moon
hadoop hdfs
mapreduce spark
hdfs hive
# 执行 wordcount 命令
[root@hadoop100 hadoop-3.3.4]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount wcinput/ wcoutput

# 查看输出文件
[root@hadoop100 wcoutput]# ll
总用量 4
-rw-r--r--. 1 root root 64 12月 13 18:48 part-r-00000
-rw-r--r--. 1 root root 0 12月 13 18:48 _SUCCESS
[root@hadoop100 wcoutput]# cat part-r-00000
ghost 2
hadoop 1
hdfs 2
hive 1
mapreduce 1
moon 1
spark 1
sum 1

三:完全分布式模式

3.1 三台虚拟机准备

hadoop100、hadoop101、hadoop102

1)准备 3 台客户机(关闭防火墙、静态 IP、主机名称)

2)安装 JDK

3)配置环境变量

4)安装 Hadoop

5)配置环境变量

6)配置集群

7)单点启动

8)配置 ssh

9)群起并测试集群

3.2 编写集群分发脚本 xsync

3.2.1 scp(secure copy)安全拷贝

(1)scp 定义

scp 可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)

(2)基本语法

(3)案例实操

前提:在 hadoop100、hadoop101、hadoop102 都已经创建好的/opt/module、 /opt/software 两个目录,并且已经把这两个目录修改为 ghost:ghost

1
2
[root@hadoop100 ~] # chown ghost:ghost -R /opt/module
[root@hadoop100 ~] # chown ghost:ghost -R /opt/software

在 hadoop100 上,将 hadoop100 中/opt/module/jdk1.8.0_301 目录拷贝到 hadoop101 上。(推)

1
[ghost@hadoop100 model]$ scp -r /opt/model/jdk1.8.0_301/ ghost@hadoop101:/opt/module/

在 hadoop101 上,将 hadoop100 中/opt/module/hadoop-3.3.4 目录拷贝到 hadoop101 上。(拉)

1
[ghost@hadoop101 ~]$ scp -r ghost@hadoop100:/opt/module/hadoop-3.3.4 /opt/module/

在hadoop101上,将hadoop100中的/opt/module 目录下所有目录拷贝到 hadoop102上。(中间人拷贝)

1
[ghost@hadoop101 ~]$ scp -r ghost@hadoop100:/opt/module/* ghost@hadoop102:/opt/module/

3.2.2 rsync 远程同步工具

  • rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
  • rsync 和 scp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更 新。scp 是把所有文件都复制过去。

(1)基本语法

(2)选项参数说明

(3)案例实操

删除hadoop101中/opt/module/hadoop-3.3.4/wcinput

1
[ghost@hadoop101 hadoop-3.3.4]$ rm -rf wcinput/

同步hadoop100中的/opt/module/hadoop-3.3.4/ 到 hadoop101

1
[ghost@hadoop101 hadoop-3.3.4]$ rsync -av  ghost@hadoop100:/opt/module/hadoop-3.3.4/ /opt/module/hadoop-3.3.4/

3.2.3 xsync 集群分发脚本

(1)需求分析

需求:循环复制文件到所有节点的相同目录下;

需求分析:rsync 命令原始拷贝;

期望脚本:xsync 要同步的文件名称

期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径)

1
2
3
4
5
[ghost@hadoop100 ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/model/jdk1.8.0_301/bin:/opt/model/hadoop-3.3.4/bin:/opt/model/hadoop-3.3.4/sbin:/home/ghost/.local/bin:/home/ghost/bin
[ghost@hadoop100 ~]$ pwd
/home/ghost
[ghost@hadoop100 ~]$ mkdir bin

(2)脚本实现

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

# 1. 判断参数个数
if [ $# -lt 1 ]
then
echo 请传入参数!
exit;
fi

# 2. 遍历集群所有机器
for host in hadoop100 hadoop101 hadoop102
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/$name $host:$pdir
else
echo $file 文件不存在!
fi
done
done

(3)赋权脚本

1
[ghost@hadoop100 bin]$ chmod +x xync

(4)设置全局调用

1
2
3
4
5
6
7
8
9
10
# 将脚本复制到 /bin 中,以便全局调用
[ghost@hadoop100 ~]$ sudo cp xsync /bin/

# 同步环境变量配置(root所有者)
# 注意:如果用了 sudo,那么 xsync 一定要给它的路径补全。
[ghost@hadoop100 ~]$ sudo ./bin/xsync /etc/profile.d/ghost_env.sh

# 环境变量生效
[ghost@hadoop101 ~]$ source /etc/profile
[ghost@hadoop102 ~]$ source /etc/profile

3.3 SSH 无密登录配置

3.3.1 配置 ssh

(1)基本语法

  • ssh 另一台电脑的 IP 地址

(2)ssh 连接时出现 Host key verification failed 的解决方法

  • Are you sure you want to continue connecting (yes/no)?
  • 输入 yes,并回车

(3)回到原来主机

  • exit

3.3.2 无密钥配置

(1)免密登录原理

(2)生成公钥和私钥

1
2
3
4
5
6
7
8
# 敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
[ghost@hadoop100 .ssh]$ ssh-keygen -t rsa

[ghost@hadoop100 .ssh]$ ll
总用量 12
-rw-------. 1 ghost ghost 1679 12月 14 01:17 id_rsa
-rw-r--r--. 1 ghost ghost 397 12月 14 01:17 id_rsa.pub
-rw-r--r--. 1 ghost ghost 555 12月 14 00:59 known_hosts

(3)讲公钥拷贝到要免密登录的目标机器上

1
2
3
4
5
6
7
8
9
10
11
12
[ghost@hadoop100 .ssh]$ ssh-copy-id hadoop100
[ghost@hadoop100 .ssh]$ ssh-copy-id hadoop101
[ghost@hadoop100 .ssh]$ ssh-copy-id hadoop102

[ghost@hadoop101 .ssh]$ ssh-copy-id hadoop100
[ghost@hadoop101 .ssh]$ ssh-copy-id hadoop101
[ghost@hadoop101 .ssh]$ ssh-copy-id hadoop102

[ghost@hadoop102 .ssh]$ ssh-copy-id hadoop100
[ghost@hadoop102 .ssh]$ ssh-copy-id hadoop101
[ghost@hadoop102 .ssh]$ ssh-copy-id hadoop102
# 此外分别进行登录操作;

(4).ssh 文件夹下(~/.ssh)的文件功能解释

3.4 集群配置

3.4.1 集群部署规划

  • 注意:
    • NameNode 和 SecondaryNameNode 不要安装在同一台服务器
    • ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在 同一台机器上。

3.4.2 配置文件说明

  • Hadoop 配置文件分两类:默认配置文件和自定义配置文件
  • 只有用户想修改某一默认 配置值时,才需要修改自定义配置文件,更改相应属性值。

(1)默认配置文件

find /opt/module/hadoop-3.3.4/ -name core-default.xml

要获取的默认文件 文件存放在 Hadoop 的 jar 包中的位置
[core-default.xml] /opt/module/hadoop-3.3.4/share/doc/hadoop/hadoop-project-dist/hadoop-common/core-default.xml
[hdfs-default.xml] /opt/module/hadoop-3.3.4/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
[yarn-default.xml] /opt/module/hadoop-3.3.4/share/doc/hadoop/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
[mapred-default.xml] /opt/module/hadoop-3.3.4/share/doc/hadoop/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml

(2)自定义配置文件

core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml

四个配置文件存放在 $HADOOP_HOME/etc/hadoop 这个路径上,用户可以根据项目需求重新进行修改配置。

3.4.3 配置集群

(1)核心配置文件

配置 core-site.xml

1
2
[ghost@hadoop100 hadoop]$ cd /opt/module/hadoop-3.3.4/etc/hadoop/
[ghost@hadoop100 hadoop]$ vim core-site.xml

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:8020</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.3.4/data</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 ghost -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>ghost</value>
</property>
</configuration>

(2)HDFS 配置文件

配置 hdfs-site.xml

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

(3)YARN 配置文件

配置 yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
<!-- 指定 MR 走 shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 ResourceManager 的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
<!-- 环境变量的继承(老版本BUG) -->
<!-- <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> -->
</configuration>

(4)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>

3.4.4 在集群上分发配置好的 Hadoop 配置文件

1
[ghost@hadoop100 hadoop]$ xsync /opt/module/hadoop-3.3.4/etc/hadoop/

3.4.5 查看文件分发情况

1
2
[ghost@hadoop101 ~]$ cat /opt/module/hadoop-3.3.4/etc/hadoop/core-site.xml
[ghost@hadoop102 ~]$ cat /opt/module/hadoop-3.3.4/etc/hadoop/core-site.xml

3.5 群起集群

3.5.1 配置 workers

注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。

1
2
3
4
5
6
7
8
9
10
[ghost@hadoop100 hadoop]$ pwd
/opt/module/hadoop-3.3.4/etc/hadoop
[ghost@hadoop100 hadoop]$ vim workers
[ghost@hadoop100 hadoop]$ cat workers
hadoop100
hadoop101
hadoop102

# 同步所有节点配置文件
[ghost@hadoop100 ~]$ xsync /opt/module/hadoop-3.3.4/etc/

3.5.2 启动集群

(1)初次启动

  • 需要在 hadoop100 节点格式化 NameNode
  • 注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到已往数据。
  • 如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式 化。
1
[ghost@hadoop100 hadoop-3.3.4]$ hdfs namenode -format

(2)启动 HDFS

1
[ghost@hadoop100 hadoop-3.3.4]# ./sbin/start-dfs.sh 

(3)在配置了 ResourceManager 的节点(hadoop101)启动 YARN

1
[ghost@hadoop101 hadoop-3.3.4]$ ./sbin/start-yarn.sh

(4)Web 端查看 HDFS 的 NameNode

(5)Web 端查看 YARN 的 ResourceManager

3.5.3 集群基本测试

(1)上传文件到集群

1
2
3
4
5
6
7
8
# 上传小文件
[ghost@hadoop100 hadoop-3.3.4]$ hadoop fs -mkdir /input
[ghost@hadoop100 hadoop-3.3.4]$ hadoop fs -put /opt/module/hadoop-3.3.4/wcinput/word.txt /input
[ghost@hadoop100 hadoop-3.3.4]$ hdfs dfs -du -h /input
59 177 /input/word.txt

# 上传大文件
[ghost@hadoop100 hadoop-3.3.4]$ hadoop fs -put /opt/software/jdk-8u301-linux-x64.tar.gz /

(2)上传文件后查看文件存放在什么位置

1
2
3
4
5
6
7
8
9
10
11
# 查看 HDFS 文件存储路径
[ghost@hadoop100 subdir0]$ pwd
/opt/module/hadoop-3.3.4/data/dfs/data/current/BP-32354581-172.31.58.100-1670994945067/current/finalized/subdir0/subdir0

# 查看 HDFS 在磁盘存储文件内容
[ghost@hadoop100 subdir0]$ cat blk_1073741825
ghost ghost
sum moon
hadoop hdfs
mapreduce spark
hdfs hive

(3)拼接文件

1
2
3
4
5
6
7
8
9
10
11
12
13
[ghost@hadoop100 subdir0]$ cat blk_1073741826 >> tmp.tar.gz
[ghost@hadoop100 subdir0]$ cat blk_1073741827 >> tmp.tar.gz
[ghost@hadoop100 subdir0]$ tar -zxvf tmp.tar.gz
[ghost@hadoop100 subdir0]$ ll
总用量 536452
-rw-rw-r--. 1 ghost ghost 59 12月 14 13:35 blk_1073741825
-rw-rw-r--. 1 ghost ghost 11 12月 14 13:35 blk_1073741825_1001.meta
-rw-rw-r--. 1 ghost ghost 134217728 12月 14 13:37 blk_1073741826
-rw-rw-r--. 1 ghost ghost 1048583 12月 14 13:37 blk_1073741826_1002.meta
-rw-rw-r--. 1 ghost ghost 11302570 12月 14 13:37 blk_1073741827
-rw-rw-r--. 1 ghost ghost 88311 12月 14 13:37 blk_1073741827_1003.meta
drwxr-xr-x. 8 ghost ghost 273 6月 9 2021 jdk1.8.0_301
-rw-rw-r--. 1 ghost ghost 145520298 12月 14 13:57 tmp.tar.gz

(4)下载

1
2
3
4
[ghost@hadoop100 tmp]$ hadoop fs -get /jdk-8u301-linux-x64.tar.gz /home/ghost/tmp/
[ghost@hadoop100 tmp]$ ll
总用量 142112
-rw-r--r--. 1 ghost ghost 145520298 12月 14 14:00 jdk-8u301-linux-x64.tar.gz

(5)执行 wordcount 程序

1
[ghost@hadoop100 ~]$ hadoop jar /opt/module/hadoop-3.3.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output

3.6 配置历史服务器

为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:

(1)配置 mapred-site.xml

1
2
3
[ghost@hadoop100 hadoop]$ pwd
/opt/module/hadoop-3.3.4/etc/hadoop
[ghost@hadoop100 hadoop]$ vim mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop100:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop100:19888</value>
</property>
</configuration>

(2)分发配置

1
[ghost@hadoop100 hadoop]$ xsync /opt/module/hadoop-3.3.4/etc/hadoop/

(3)在 hadoop100 启动历史服务器

1
[ghost@hadoop100 hadoop]$ mapred --daemon start historyserver

(4)查看历史服务器是否启动

1
2
3
4
5
6
[ghost@hadoop100 hadoop]$ jps
5850 Jps
3501 DataNode
3374 NameNode
5790 JobHistoryServer
3839 NodeManager

(5)查看 JobHistory

3.7 配置日志的聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。

日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试;

注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryServer。

开启日志聚集功能具体步骤如下:

(1)配置 yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop100:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>

(2)分发配置

1
[ghost@hadoop100 hadoop]$ xsync /opt/module/hadoop-3.3.4/etc/hadoop/

(3)关闭 NodeManager 、ResourceManager 和 HistoryServer

1
2
[ghost@hadoop102 hadoop-3.3.4]$ ./sbin/stop-yarn.sh
[ghost@hadoop100 hadoop-3.3.4]$ mapred --daemon stop historyserver

(4)启动 NodeManager 、ResourceManage 和 HistoryServer

1
2
[ghost@hadoop101 hadoop-3.3.4]$ start-yarn.sh
[ghost@hadoop100 hadoop-3.3.4]$ mapred --daemon start historyserver

(5)删除 HDFS 上已经存在的输出文件

1
2
[ghost@hadoop100 hadoop-3.3.4]$ hadoop fs -rm -r /output
Deleted /output

(6)执行 WordCount 程序

1
[ghost@hadoop100 hadoop-3.3.4]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /input /output

(7)查看日志

  • 查看任务运行日志

image-20221214143949428

  • 运行日志详情

3.8 集群启动/停止方式总结

(1)各个模块分开启动/停止(配置 ssh 是前提)常用

1
2
3
4
5
6
# 整体启动/停止 HDFS
[ghost@hadoop100 hadoop-3.3.4]$ start-dfs.sh
[ghost@hadoop100 hadoop-3.3.4]$ stop-dfs.sh
# 整体启动/停止 YARN
[ghost@hadoop101 hadoop-3.3.4]$ start-yarn.sh
[ghost@hadoop101 hadoop-3.3.4]$ stop-yarn.sh

(2)各个服务组件逐一启动/停止(不推荐使用)

1
2
3
4
# 分别启动/停止 HDFS 组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
# 启动/停止 YARN
yarn --daemon start/stop resourcemanager/nodemanager

3.9 编写 Hadoop 集群常用脚本

(1)Hadoop 集群启停脚本(包含 HDFS,Yarn,Historyserver):myhadoop.sh

1
2
3
[ghost@hadoop100 bin]$ vim myhadoop.sh
[ghost@hadoop100 bin]$ pwd
/home/ghost/bin
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
#!/bin/bash

if [ $# -lt 1 ]
then
echo "请输入参数!"
exit;
fi

case $1 in
"start")
echo "====== 启动 hadoop 集群 ======"

echo "------ 启动 hdfs ------"
ssh hadoop100 "/opt/module/hadoop-3.3.4/sbin/start-dfs.sh"
echo "------ 启动 yarn ------"
ssh hadoop101 "/opt/module/hadoop-3.3.4/sbin/start-yarn.sh"
echo "------ 启动 historyserver ------"
ssh hadoop100 "/opt/module/hadoop-3.3.4/bin/mapred --daemon start historyserver"
;;
"stop")
echo "====== 关闭 hadoop 集群 ======"

echo "------ 关闭 historyserver ------"
ssh hadoop100 "/opt/module/hadoop-3.3.4/bin/mapred --daemon stop historyserver"
echo "------ 关闭 yarn ------"
ssh hadoop101 "/opt/module/hadoop-3.3.4/sbin/stop-yarn.sh"
echo "------ 关闭 hdfs ------"
ssh hadoop100 "/opt/module/hadoop-3.3.4/sbin/stop-dfs.sh"
;;
*)
echo "参数错误!"
;;
esac
1
[ghost@hadoop100 bin]$ chmod +x myhadoop.sh

(2)查看三台服务器 Java 进程脚本:jpsall

1
2
3
[ghost@hadoop100 bin]$ vim jpsall
[ghost@hadoop100 bin]$ pwd
/home/ghost/bin
1
2
3
4
5
6
7
#!/bin/bash

for host in hadoop100 hadoop101 hadoop102
do
echo ====== $host ======
ssh $host jps
done
1
[ghost@hadoop100 bin]$ chmod +x jpsall 

(3)分发/home/ghost/bin 目录,保证自定义脚本在三台机器上都可以使用

1
[ghost@hadoop100 hadoop-3.3.4]$ xsync /home/ghost/bin/

3.10 常用端口号说明

3.11 集群时间同步

  • 如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期 和公网时间进行校准;
  • 如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差, 导致集群执行任务时间不同步。

(1)需求

  • 找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境 根据任务对时间的准确程度要求周期同步。
  • 此处测试环境为了尽快看到效果,采用 1 分钟同步一 次。

(2)时间服务器配置,必须使用root配置

  • 查看所有节点 ntpd 服务状态和开机自启动状态
1
2
3
4
[ghost@hadoop100 ~]$ sudo systemctl status ntpd
[ghost@hadoop100 ~]$ sudo systemctl start ntpd
[ghost@hadoop100 ~]$ sudo systemctl is-enabled ntpd
disabled
  • 修改 hadoop100 的 ntp.conf 配置文件

    • 修改 1(授权 172.31.58.0-172.31.58.255 网段上的所有机器可以从这台机器上查询和同步时间)

    • # 授权 172.31.58.0-172.31.58.255 网段上的所有机器可以从这台机器上查询和同步时间
      restrict 172.31.58.0 mask 255.255.255.0 nomodify notrap
      
      1
      2
      3
      4
      5
      6
      7
      8
      9

      - 修改 2(集群在局域网中,不使用其他互联网上的时间)

      - ```
      # 全部注释,集群在局域网中,不使用其他互联网上的时间
      #server 0.centos.pool.ntp.org iburst
      #server 1.centos.pool.ntp.org iburst
      #server 2.centos.pool.ntp.org iburst
      #server 3.centos.pool.ntp.org iburst
    • 添加 3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)

    • ```

      当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步

      server 127.127.1.0
      fudge 127.127.1.0 stratum 10

      1
      2
      3
      4
      5

      - 修改 hadoop100 的/etc/sysconfig/ntpd 文件(让硬件时间与系统时间一起同步)

      - ```
      [root@hadoop100 ghost]# vim /etc/sysconfig/ntpd
  • # 增加以下内容,让硬件时间与系统时间一起同步
    SYNC_HWCLOCK=yes
    
    1
    2
    3
    4
    5

    - 重新启动 ntpd 服务

    - ```
    [root@hadoop100 ghost]# sudo systemctl restart ntpd
  • 设置 ntpd 服务开机启动

  • [root@hadoop100 ghost]# sudo systemctl enable ntpd
    Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    ### (3)时间服务器配置,必须使用root配置

    - 关闭所有节点上 ntp 服务和自启动

    - ```
    [ghost@hadoop101 hadoop-3.3.4]$ sudo systemctl status ntpd
    [ghost@hadoop101 hadoop-3.3.4]$ sudo systemctl stop ntpd
    [ghost@hadoop101 hadoop-3.3.4]$ sudo systemctl disable ntpd
    [ghost@hadoop102 hadoop-3.3.4]$ sudo systemctl stop ntpd
    [ghost@hadoop102 hadoop-3.3.4]$ sudo systemctl disable ntpd
  • 在其他机器配置 1 分钟与时间服务器同步一次

  • # 编写定时任务
    [ghost@hadoop101 hadoop-3.3.4]$ crontab -e
    */1 * * * * /usr/sbin/ntpdate hadoop100
    [ghost@hadoop102 hadoop-3.3.4]$ crontab -e
    */1 * * * * /usr/sbin/ntpdate hadoop100
    
    1
    2
    3
    4
    5
    6

    - 修改任意机器时间

    - ```
    [ghost@hadoop102 hadoop-3.3.4]$ sudo date -s "2023-3-1 12:00:00"
    2023年 03月 01日 星期三 12:00:00 CST
  • 1 分钟后查看机器是否与时间服务器同步

  • [ghost@hadoop102 ~]$ sudo date
    2022年 12月 14日 星期三 16:10:35 CST
    

四:常见错误及解决方案

4.1 常见问题

  • 防火墙没关闭、或者没有启动 YARN
  • 主机名称配置错误
  • IP 地址配置错误
  • ssh 没有配置好
  • root 用户和 ghost 两个用户启动集群不统一
  • 配置文件修改出错
  • 不识别主机名称

4.2 解决方案

(1)DataNode 和 NameNode 进程同时只能工作一个

(2)jps 发现进程已经没有,但是重新启动集群,提示进程已经开启。

  • 原因是在 Linux 的根目录下/tmp 目录中存在启动的进程临时文件,将集群相关进程删 除掉,再重新启动集群。