Hadoop 运行模式
一:运行模式概述
- Hadoop 官方网站:http://hadoop.apache.org/
- Hadoop 运行模式包括:本地模式、伪分布式模式以及完全分布式模式。
- 本地模式:单机运行,可以执行官方案例。生产环境不用。
- 伪分布式模式:也是单机运行,但是具备 Hadoop 集群的所有功能,一台服务器模 拟一个分布式的环境。生产环境不用。
- 完全分布式模式:多台服务器组成分布式环境。生产环境使用。
二:本地运行模式
演示官方WordCount案例:
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 | [root@hadoop100 ~] # chown ghost:ghost -R /opt/module |
在 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 | [ghost@hadoop100 ~]$ echo $PATH |
(2)脚本实现
1 | !/bin/bash |
(3)赋权脚本
1 | [ghost@hadoop100 bin]$ chmod +x xync |
(4)设置全局调用
1 | 将脚本复制到 /bin 中,以便全局调用 |
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 | 敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥) |
(3)讲公钥拷贝到要免密登录的目标机器上
1 | [ghost@hadoop100 .ssh]$ ssh-copy-id hadoop100 |
(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 | [ghost@hadoop100 hadoop]$ cd /opt/module/hadoop-3.3.4/etc/hadoop/ |
文件内容如下:
1 | <configuration> |
(2)HDFS 配置文件
配置 hdfs-site.xml
1 | <configuration> |
(3)YARN 配置文件
配置 yarn-site.xml
1 | <configuration> |
(4)MapReduce 配置文件
配置 mapred-site.xml
1 | <configuration> |
3.4.4 在集群上分发配置好的 Hadoop 配置文件
1 | [ghost@hadoop100 hadoop]$ xsync /opt/module/hadoop-3.3.4/etc/hadoop/ |
3.4.5 查看文件分发情况
1 | [ghost@hadoop101 ~]$ cat /opt/module/hadoop-3.3.4/etc/hadoop/core-site.xml |
3.5 群起集群
3.5.1 配置 workers
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
1 | [ghost@hadoop100 hadoop]$ pwd |
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
- 浏览器中输入:http://hadoop100:9870
- 查看 HDFS 上存储的数据信息
(5)Web 端查看 YARN 的 ResourceManager
- 浏览器中输入:http://hadoop101:8088
- 查看 YARN 上运行的 Job 信息
3.5.3 集群基本测试
(1)上传文件到集群
1 | 上传小文件 |

(2)上传文件后查看文件存放在什么位置
1 | 查看 HDFS 文件存储路径 |
(3)拼接文件
1 | [ghost@hadoop100 subdir0]$ cat blk_1073741826 >> tmp.tar.gz |
(4)下载
1 | [ghost@hadoop100 tmp]$ hadoop fs -get /jdk-8u301-linux-x64.tar.gz /home/ghost/tmp/ |
(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 | [ghost@hadoop100 hadoop]$ pwd |
1 | <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 | [ghost@hadoop100 hadoop]$ jps |
(5)查看 JobHistory


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

日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试;
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryServer。
开启日志聚集功能具体步骤如下:
(1)配置 yarn-site.xml
1 | <!-- 开启日志聚集功能 --> |
(2)分发配置
1 | [ghost@hadoop100 hadoop]$ xsync /opt/module/hadoop-3.3.4/etc/hadoop/ |
(3)关闭 NodeManager 、ResourceManager 和 HistoryServer
1 | [ghost@hadoop102 hadoop-3.3.4]$ ./sbin/stop-yarn.sh |
(4)启动 NodeManager 、ResourceManage 和 HistoryServer
1 | [ghost@hadoop101 hadoop-3.3.4]$ start-yarn.sh |
(5)删除 HDFS 上已经存在的输出文件
1 | [ghost@hadoop100 hadoop-3.3.4]$ hadoop fs -rm -r /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)查看日志
历史服务器地址
历史任务列表

- 查看任务运行日志

- 运行日志详情

3.8 集群启动/停止方式总结
(1)各个模块分开启动/停止(配置 ssh 是前提)常用
1 | 整体启动/停止 HDFS |
(2)各个服务组件逐一启动/停止(不推荐使用)
1 | 分别启动/停止 HDFS 组件 |
3.9 编写 Hadoop 集群常用脚本
(1)Hadoop 集群启停脚本(包含 HDFS,Yarn,Historyserver):myhadoop.sh
1 | [ghost@hadoop100 bin]$ vim myhadoop.sh |
1 | !/bin/bash |
1 | [ghost@hadoop100 bin]$ chmod +x myhadoop.sh |
(2)查看三台服务器 Java 进程脚本:jpsall
1 | [ghost@hadoop100 bin]$ vim jpsall |
1 | !/bin/bash |
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 | [ghost@hadoop100 ~]$ sudo systemctl status ntpd |
修改 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 notrap1
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 101
2
3
4
5
- 修改 hadoop100 的/etc/sysconfig/ntpd 文件(让硬件时间与系统时间一起同步)
- ```
[root@hadoop100 ghost]# vim /etc/sysconfig/ntpd
# 增加以下内容,让硬件时间与系统时间一起同步 SYNC_HWCLOCK=yes1
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 hadoop1001
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 CST1 分钟后查看机器是否与时间服务器同步
[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 目录中存在启动的进程临时文件,将集群相关进程删 除掉,再重新启动集群。



