1.启动Hadoop集群

在完全分布模式下,必须同时启动所有虚拟机和Hadoop服务,集群才能正常工作。

Hadoop是一个“主从架构”的分布式系统,Master节点(NameNode, ResourceManager)本身不存储数据,也不执行计算任务

  • 数据不可见:你的文件实际存储在 Slave1 和 Slave2 的 DataNode 上。如果它们没启动,HDFS 里就是空的。

  • 任务跑不动:计算任务(MapReduce)是由 Slave1 和 Slave2 上的 NodeManager 执行的。Master 只负责分配任务,没人干活程序就会报错。

  • 缺少数据节点:HDFS 默认通常有副本数(如 dfs.replication=2),如果活着的节点数量少于副本数,系统会认为集群异常。

正确启动与验证方式

请保持三台虚拟机同时运行,然后在 master 节点上执行:

注:不要只看 master,你需要确认三台机器都在正常工作。在 master 上执行以下命令检查所有节点:

# 批量查看三台机器的进程
for host in master slave1 slave2; do
    echo "========== $host =========="
    ssh $host jps
done

健康的输出应该是:

  • masterNameNodeSecondaryNameNodeResourceManager

  • slave1DataNodeNodeManager

  • slave2DataNodeNodeManager

实际操作输出(先启动Hadoop集群再操作下面的命令):

[root@master /]# for host in master slave1 slave2; do
> echo "-------------- $host ----------------------"
> ssh $host jps
> done
-------------- master ----------------------
4449 Jps
3609 ResourceManager
3309 SecondaryNameNode
3087 NameNode
4015 JobHistoryServer
-------------- slave1 ----------------------
2919 DataNode
3035 NodeManager
3549 Jps
-------------- slave2 ----------------------
2881 DataNode
2997 NodeManager
3511 Jps
符号/关键字作用是否必需
for循环开始关键字✅ 必需
in指定要遍历的列表可选(默认使用位置参数)
;分隔同一行的多个命令❌ 可换行代替
do标记循环体开始✅ 必需
done标记循环体结束✅ 必需
变量名存储当前迭代的值✅ 必需

https://chat.deepseek.com/share/eoycr52eo3t3d2se2z

  1. 浏览器验证
    打开浏览器访问 Web 界面,确认 Live Nodes 数量显示为 2(代表两台从节点都在线)。

    • HDFS 界面:http://master:9870

    • YARN 界面:http://master:8088

  2. 1的前提要在master中关闭防火墙

[root@master /]# systemctl status firewalld # 查看防火墙状态
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2026-04-23 07:45:12 CST; 48min ago
     Docs: man:firewalld(1)
 Main PID: 685 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─685 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

Apr 23 07:45:12 master systemd[1]: Starting firewalld - dynamic firewall daemon...
Apr 23 07:45:12 master systemd[1]: Started firewalld - dynamic firewall daemon.
[root@master /]# # 临时关闭防火墙
[root@master /]# systemctl stop firewalld

好了,下面是在master节点的操作

[root@master ~]# cd /
[root@master /]# cd /opt/hadoop-3.1.4/sbin # 切换到这个目录下。Linux系统执行命令时,会按照PATH环境变量中定义的目录顺序去查找可执行文件,但我没有将Hadoop目录/opt/hadoop-3.1.4/sbin配置到PATH中,所以系统找不到start-dfs.sh等命令
[root@master sbin]# ls
distribute-exclude.sh  hadoop-daemons.sh  mr-jobhistory-daemon.sh  start-all.sh       start-dfs.sh         start-yarn.sh  stop-balancer.sh  stop-secure-dns.sh  workers.sh
FederationStateStore   httpfs.sh          refresh-namenodes.sh     start-balancer.sh  start-secure-dns.sh  stop-all.cmd   stop-dfs.cmd      stop-yarn.cmd       yarn-daemon.sh
hadoop-daemon.sh       kms.sh             start-all.cmd            start-dfs.cmd      start-yarn.cmd       stop-all.sh    stop-dfs.sh       stop-yarn.sh        yarn-daemons.sh
[root@master sbin]# start-dfs.sh # 启动HDFS(存储系统)
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Starting namenodes on [master]
Last login: Wed Apr 22 23:52:22 CST 2026 from 192.168.128.1 on pts/0
Starting datanodes
Last login: Wed Apr 22 23:55:00 CST 2026 on pts/0
Starting secondary namenodes [master]
Last login: Wed Apr 22 23:55:03 CST 2026 on pts/0
[root@master sbin]# start-yarn.sh # 启动YARN(资源管理器)
Starting resourcemanager
Last login: Wed Apr 22 23:55:07 CST 2026 on pts/0
Starting nodemanagers
Last login: Wed Apr 22 23:56:02 CST 2026 on pts/0
[root@master sbin]# mr-jobhistory-daemon.sh start historyserver # 启动Hadoop的JobHistory Server(历史服务器),它的核心功能是记录和展示已经运行完成的MapReduce作业的历史信息。 mr指的是MapReduce。daemon是魔鬼的意思,也有守护进程,后台程序,虚拟光驱的意思
WARNING: Use of this script to start the MR JobHistory daemon is deprecated.
WARNING: Attempting to execute replacement "mapred --daemon start" instead.
[root@master sbin]# jps # 列出当前用户正在运行的Java进程及其主类名称
3024 Jps
2547 ResourceManager
2965 JobHistoryServer
2262 SecondaryNameNode
1996 NameNode

由于我没有将Hadoop的目录配置到PATH环境变量中,所以我想要启动Hadoop集群的话,必须

  • 要么进入该目录(/opt/hadoop-3.1.4/sbin)执行start-dfs.sh等命令
  • 要么在任意目录下写完整路径:如/opt/hadoop-3.1.4/sbin/start-dfs.sh

1.配置Hadoop环境变量

如果想配置,可以:

方法一:编辑~/.bashrc(推荐)

# 打开配置文件
vi ~/.bashrc

# 在文件末尾添加以下内容
export HADOOP_HOME=/opt/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 保存并生效
source ~/.bashrc

方法二:编辑/etc/profile(对所有用户生效)

# 打开系统配置文件
vi /etc/profile

# 在文件末尾添加
export HADOOP_HOME=/opt/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 保存并生效
source /etc/profile

验证配置成功:

# 1. 确认环境变量生效
echo $HADOOP_HOME
# 应输出:/opt/hadoop-3.1.4

# 2. 确认命令可用
which start-dfs.sh
# 应输出:/opt/hadoop-3.1.4/sbin/start-dfs.sh

# 3. 现在可以在任何目录执行
cd ~
start-dfs.sh

2.jps

jps命令是Java Virtual Machine Process Status Tool(Java虚拟机进程状态工具)的命令行工具

核心作用:列出当前用户正在运行的Java进程及其主类名称

1.基本用法:
[root@master sbin]# jps # 最简单的使用
3024 Jps
2547 ResourceManager
2965 JobHistoryServer
2262 SecondaryNameNode
1996 NameNode

输出的含义:

内容说明
第一列PID(进程ID)操作系统分配给进程的唯一编号
第二列主类名或Jar包名正在运行的Java程序名称

2.输出含义详解:

比如输出:

[root@master ~]# jps
12345 NameNode
12346 SecondaryNameNode
12347 ResourceManager
12348 Jps
数字(PID)进程名称含义
12345NameNodeHadoop 名称节点进程,ID 是 12345
12346SecondaryNameNode辅助名称节点,ID 是 12346
12347ResourceManager资源管理器,ID 是 12347
12348Jpsjps 命令本身,ID 是 12348
PID的作用:

1.查看进程详细信息

# 查看某个进程的详细信息
ps -ef | grep 12345

# 查看进程打开的文件
lsof -p 12345

# 查看进程状态
cat /proc/12345/status

2.终止进程

# 优雅终止
kill 12345

# 强制终止
kill -9 12345

3.查看进程资源占用

# 查看 CPU/内存使用情况
top -p 12345

PID的特点:

特性说明
唯一性同一时间,每个 PID 只对应一个进程
可重用进程结束后,PID 可以被新进程使用
从 1 开始PID 1 通常是 init/systemd 进程
上限Linux 默认最大 PID 为 32768(可调整)

注:进程ID(PID)在每次Hadoop启动时可能会不同,PID由系统分配

PID 是操作系统动态分配的:

  1. 进程启动时,系统从可用的PID池中取一个

  2. 进程结束时,该PID被释放回池中

  3. 下次启动时,系统可能分配不同的PID

3.jps的常用参数:
参数作用示例输出
jps -l显示完整包名org.apache.hadoop.hdfs.server.namenode.NameNode
jps -v显示JVM参数-Xmx1000m -Xms500m ...
jps -m显示main方法参数-Dfs.namenode.rpc-address=...
[root@master sbin]# jps -l
4322 sun.tools.jps.Jps
2547 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
2965 org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer
2262 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
1996 org.apache.hadoop.hdfs.server.namenode.NameNode

4.jps的工作原理:

[root@master sbin]# find / -name "jps"
/etc/alternatives/jps
/usr/bin/jps
/usr/java/jdk1.8.0_281-amd64/bin/jps

以上输出说明系统中安装了3个jps命令,它们指向同一个JDK,是正常现象,不是错误。

输出解读:

/etc/alternatives/jps          # 软链接(符号链接)
/usr/bin/jps                   # 软链接(符号链接)
/usr/java/jdk1.8.0_281-amd64/bin/jps  # 真实的 jps 程序文件

这是 Linux alternatives 系统(多版本管理机制)造成的:

文件类型作用
/usr/java/jdk1.8.0_281-amd64/bin/jps真实文件JDK 实际安装位置
/etc/alternatives/jps软链接alternatives 系统的符号链接
/usr/bin/jps软链接系统 PATH 中的命令入口

查看链接关系:

[root@master sbin]# ls -l /usr/bin/jps
lrwxrwxrwx. 1 root root 21 Mar 26 08:36 /usr/bin/jps -> /etc/alternatives/jps

执行jps命令时到底发生了什么?

# 你输入
[root@master ~]# jps

# 系统执行流程:
1. 在 PATH 中找到 /usr/bin/jps
2. 发现是软链接,读取内容:/etc/alternatives/jps
3. 访问 /etc/alternatives/jps
4. 发现也是软链接,读取内容:/usr/java/jdk1.8.0_281-amd64/bin/jps
5. 访问真实文件
6. 执行该文件(运行 jps 程序)

3.补充知识:软链接

软链接是Linux中的一种特殊文件,它的内容是一个路径,指向另一个文件或目录。

命令输出解读:

lrwxrwxrwx. 1 root root 21 Mar 26 08:36 /usr/bin/jps -> /etc/alternatives/jps
字段含义
第一个字符l这是一个软链接(l = link)
权限rwxrwxrwx所有用户都有读写执行权限(指向的目标文件决定实际权限)
链接数1只有这一个链接
所有者root属于 root 用户
大小21路径字符串的长度(21个字节)
日期Mar 26 08:36创建时间
文件名/usr/bin/jps链接文件本身
箭头 →/etc/alternatives/jps指向的目标路径

[root@master sbin]# ls -l /usr/bin/jps
lrwxrwxrwx. 1 root root 21 Mar 26 08:36 /usr/bin/jps -> /etc/alternatives/jps
[root@master sbin]# ls -l /etc/alternatives/jps
lrwxrwxrwx. 1 root root 36 Mar 26 08:36 /etc/alternatives/jps -> /usr/java/jdk1.8.0_281-amd64/bin/jps
[root@master sbin]# ls -l /usr/java/jdk1.8.0_281-amd64/bin/jps
-rwxr-xr-x. 1 root root 8832 Dec  9  2020 /usr/java/jdk1.8.0_281-amd64/bin/jps

第一层:系统命令入口

/usr/bin/jps -> /etc/alternatives/jps
  • 类型:软链接(l开头)
  • 作用:让你在任何目录都能输入jps命令(系统会在PATH环境变量中找jps命令,而/usr/bin/jps在PATH中)
  • 指向:/etc/alternatives/jps

第二层:alternatives管理链接

/etc/alternatives/jps -> /usr/java/jdk1.8.0_281-amd64/bin/jps
  • 类型:软链接(l开头),就是说/etc/alternatives/jps这个文件是软链接,因为权限符前面的字母是l,l是link的缩写,表示软链接文件
  • 作用:实现多版本JDK的切换管理
  • 指向:具体的JDK版本中的jps

第三层:真实文件

-rwxr-xr-x. 1 root root 8832 Dec  9  2020 /usr/java/jdk1.8.0_281-amd64/bin/jps
  • 类型:真实文件(第一个字符是-,不是l)
  • 权限:rwxr-xr-x,即755,所有用户可读可执行
  • 大小:8832字节(约8.6KB) 注:1字节=8比特,1KB=1024字节
  • 本质:这是JDK自带的真正的jps程序

这种设计的优点:

1.灵活切换JDK版本

# 假设你想切换到 JDK 11
# 只需修改一个软链接:
ln -sf /usr/java/jdk11/bin/jps /etc/alternatives/jps

# 所有使用 jps 的地方自动切换,无需修改系统配置

2.统一路径命令

  • 不管安装几个 JDK 版本

  • /usr/bin/jps 永远指向"当前激活的版本"

  • 用户无需关心具体版本路径

3.符合Linux标准

  • FHS(文件系统层次结构标准)推荐这种设计

  • 许多软件(Java、Python、Node.js)都采用类似方案

4.查看环境变量

[root@master sbin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/hadoop-3.1.4/bin:/opt/hadoop-3.1.4/sbin:/root/bin
符号名称作用
PATH变量名存储一系列目录路径
$取值运算符获取变量的值

输出结果解读:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/opt/hadoop-3.1.4/bin      # ✅ Hadoop 普通命令
/opt/hadoop-3.1.4/sbin     # ✅ Hadoop 管理命令
/root/bin

用 : 分隔的 7 个路径,系统会按顺序在这些目录中查找你输入的命令。

这表明其实PATH已配置Hadoop

验证:

[root@master sbin]# which start-dfs.sh
/opt/hadoop-3.1.4/sbin/start-dfs.sh
[root@master sbin]# hadoop version
Hadoop 3.1.4
Source code repository https://github.com/apache/hadoop.git -r 1e877761e8dadd71effef30e592368f7fe66a61b
Compiled by gabota on 2020-07-21T08:05Z
Compiled with protoc 2.5.0
From source with checksum 38405c63945c88fdf7a6fe391494799b
This command was run using /opt/hadoop-3.1.4/share/hadoop/common/hadoop-common-3.1.4.jar
[root@master sbin]# hdfs dfs -ls / # 查看HDFS命令
Found 1 items
drwxrwx---   - root supergroup          0 2026-04-18 02:27 /tmp

5.关闭防火墙的作用

防火墙(Firewall)是一种网络安全系统,主要的作用如下:

  • 访问控制:根据预设规则,允许或拒绝网络流量进出计算机或网络;充当“门卫”的角色,决定哪些数据包可以通过。
  • 网络隔离:将内部网络(如家庭/公司局域网)与外部网络(如互联网)分隔开;创建安全边界,防止外部威胁直接触及内部资源。
  • 威胁防护:防止未授权访问(如阻挡黑客、恶意软件防止它们试图入侵你的设备);过滤恶意流量(识别并拦截可疑的数据传输);防止端口扫描(防止攻击者探测系统漏洞)
  • 注:防火墙不能代替杀毒软件,它主要管“门”(网络通道),不管“屋里”(已经进入系统的恶意程序),所以最佳实践是防火墙+杀毒软件+安全意识的配合使用。

核心原因:Hadoop是分布式系统,依赖节点之间的直接通信

简单类比:

想象一下你在一个大办公室工作:

NameNode = 前台接待员:知道每个人的座位在哪(在Hadoop中知道各个节点的信息,但不传递文件)

DataNode = 普通员工:实际干活的(在Hadoop中负责实际存储和处理文件)

客户端(master节点) = 需要文件的人

工作流程:当你问前台“我要存一份文件”,前台告诉你“去找员工A和员工B”(返回DataNode地址),你自己直接走到员工A和员工B的座位,把文件交给他们(客户端直连DataNode)

防火墙的作用:如果员工A和员工B的座位需要门禁卡(防火墙规则),而你没有,那么你就进不去(NoRouteToHostException),自然也就无法存文件。

6.HDFS的通信模式

HDFS(Hadoop Distributed File System)的通信模式主要涉及其客户端-服务器架构和内部节点间通信。核心包括以下几个层面:

1.NameNode <------> DataNode通信

心跳机制:DataNode每三秒向NameNode发送心跳包,表明自身存活状态

块报告:DataNode定期(默认6小时)向NameNode上报其存储的所有数据块列表

命令响应:NameNode通过心跳回复向DataNode发送指令(如复制、删除、恢复块等)

2.Client <------------> NameNode通信

元数据操作:客户端通过RPC(Remote Procedure Call)与NameNode交互。如:获取文件系统命名空间操作(创建、删除、重命名文件/目录)、获取数据块位置信息(getBlockLocations)、不涉及实际数据传输,仅传输元数据

3.Client <-----------> DataNode通信

数据读写:客户端直接与DataNode建立TCP连接进行数据传输。读取流程:客户端从NameNode获取块位置后,选择最近的DataNode直接读取。  写入流程:客户端将数据流式传输给第一个DataNode,该DataNode再级联转发给副本DataNode(Pipeline流水线模式)

7.如何关闭防火墙

1.查看防火墙的当前状态
systemctl status firewalld # 查看防火墙的当前状态
  • system:系统。表示整个操作系统
  • ctl:control控制的缩写。systemctl=控制系统
  • status:状态
  • firewall:防火墙,d:deamon(守护进程的缩写,表示一直在后台运行的程序)
  • firewalld:防火墙后台服务
[root@master ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2026-04-23 22:51:25 CST; 1h 58min ago
     Docs: man:firewalld(1)
 Main PID: 686 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─686 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

Apr 23 22:51:24 master systemd[1]: Starting firewalld - dynamic firewall daemon...
Apr 23 22:51:25 master systemd[1]: Started firewalld - dynamic firewall daemon.

关键信息:

  • Active: active (running) → 防火墙开启中

  • Active: inactive (dead) → 防火墙已关闭

2.关闭防火墙(临时)
# 立即关闭
systemctl stop firewalld

# 验证是否关闭
systemctl status firewalld
# 显示 Active: inactive (dead)

[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Fri 2026-04-24 00:52:45 CST; 22s ago
     Docs: man:firewalld(1)
  Process: 686 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 686 (code=exited, status=0/SUCCESS)

Apr 23 22:51:24 master systemd[1]: Starting firewalld - dynamic firewall daemon...
Apr 23 22:51:25 master systemd[1]: Started firewalld - dynamic firewall daemon.
Apr 24 00:52:45 master systemd[1]: Stopping firewalld - dynamic firewall daemon...
Apr 24 00:52:45 master systemd[1]: Stopped firewalld - dynamic firewall daemon.

3.开启防火墙(临时)
# 立即开启
systemctl start firewalld

# 验证是否开启
systemctl status firewalld
# 显示 Active: active (running)

4.永久关闭防火墙(开机不自启)
# 停止防火墙 + 禁用开机启动
systemctl stop firewalld
systemctl disable firewalld

# 验证
systemctl status firewalld   # 显示 inactive
systemctl is-enabled firewalld   # 显示 disabled

5.永久开启防火墙(开启自启)
# 开启防火墙 + 设置开机启动
systemctl start firewalld
systemctl enable firewalld

# 验证
systemctl status firewalld   # 显示 active
systemctl is-enabled firewalld   # 显示 enabled

2.启动后的基础操作

1.初步试探

[root@master current]# systemctl stop firewalld
[root@slave1 current]# systemctl stop firewalld
[root@slave2 current]# systemctl stop firewalld
[root@master current]# echo "Hello HDFS" > ~/test.txt # 创建一个测试文件
[root@master current]# ls ~
anaconda-ks.cfg  hadoop-3.1.4.tar.gz  test.txt  文件.txt
[root@master current]# cat ~/test.txt
Hello HDFS

[root@master current]# timeout 2 bash -c "echo > /dev/tcp/192.168.128.131/9866" && echo "端口9866可达" || echo "端口9866不可达"
端口9866可达
[root@master current]# hdfs dfs -ls /
Found 1 items
drwxrwx---   - root supergroup          0 2026-04-18 02:27 /tmp
[root@master current]# hdfs dfs -put ~/test.txt /test.txt # 上传到HDFS
[root@master current]# hdfs dfs -ls /
Found 2 items
-rw-r--r--   2 root supergroup         11 2026-04-23 09:38 /test.txt
drwxrwx---   - root supergroup          0 2026-04-18 02:27 /tmp

HDFS命令操作的目录和文件与启动Hadoop之前Linux系统的目录是完全不同的两套系统

  • Linux本地文件系统:存储在你每个节点的硬盘上(如/home/,/var/等)
  • HDFS分布式文件系统:跨越所有DataNode节点的存储空间,通过NameNode统一管理

HDFS的“目录”实际在哪里?

例如当你执行:hdfs dfs -put /home/test.txt /user/data/

发生的事情如下:

  1. 源文件/home/test.txt在本地Linux文件系统上(你的NameNode节点的硬盘上)
  2. 目标路径/user/data/是HDFS的逻辑目录,它并不对应某个节点的具体路径
  3. 实际数据存储:文件被切分成块(默认128MB),每个块被复制到不同的DataNode节点的dfs.datanode.data.dir配置目录下

查看实际存储位置:

在DataNode节点上,HDFS的数据块实际存储在:hdfs-site.xml中

[root@master ~]# cd /opt # 找hdfs-site.xml文件中......
[root@master opt]# ls
hadoop-3.1.4  jdk-8u281-linux-x64.rpm
[root@master opt]# cd hadoop-3.1.4
[root@master hadoop-3.1.4]# ls
bin  etc  include  lib  libexec  LICENSE.txt  logs  NOTICE.txt  README.txt  sbin  share
[root@master hadoop-3.1.4]# cd sbin
[root@master sbin]# ls # 发现sbin目录下没有
distribute-exclude.sh  hadoop-daemons.sh  mr-jobhistory-daemon.sh  start-all.sh       start-dfs.sh         start-yarn.sh  stop-balancer.sh  stop-secure-dns.sh  workers.sh
FederationStateStore   httpfs.sh          refresh-namenodes.sh     start-balancer.sh  start-secure-dns.sh  stop-all.cmd   stop-dfs.cmd      stop-yarn.cmd       yarn-daemon.sh
hadoop-daemon.sh       kms.sh             start-all.cmd            start-dfs.cmd      start-yarn.cmd       stop-all.sh    stop-dfs.sh       stop-yarn.sh        yarn-daemons.sh
[root@master sbin]# cd ../bin
[root@master bin]# ls # bin目录下也没有
container-executor  hadoop  hadoop.cmd  hdfs  hdfs.cmd  mapred  mapred.cmd  test-container-executor  yarn  yarn.cmd
[root@master bin]# cd ..
[root@master hadoop-3.1.4]# ls
bin  etc  include  lib  libexec  LICENSE.txt  logs  NOTICE.txt  README.txt  sbin  share
[root@master hadoop-3.1.4]# find / -name "hdfs-site.xml" # 只能用find命令来找了,还是从根目录开始找起
/opt/hadoop-3.1.4/etc/hadoop/hdfs-site.xml
[root@master hadoop-3.1.4]# cd /etc # 切换到根目录下的etc目录中去了
[root@master etc]# ls # 自然找不到hdfs-site.xml
adjtime                  cron.monthly             exports      hostname       libnl                     my.cnf.d           popt.d          redhat-release    skel                tmpfiles.d
aliases                  crontab                  favicon.png  hosts          libuser.conf              NetworkManager     postfix         resolv.conf       ssh                 tuned
aliases.db               cron.weekly              filesystems  hosts.allow    locale.conf               networks           ppp             resolv.conf.save  ssl                 udev
alternatives             crypttab                 firewalld    hosts.deny     localtime                 nsswitch.conf      prelink.conf.d  rpc               statetab            vconsole.conf
anacrontab               csh.cshrc                fstab        init.d         login.defs                nsswitch.conf.bak  printcap        rpm               statetab.d          vimrc
asound.conf              csh.login                fuse.conf    inittab        logrotate.conf            ntp                profile         rsyslog.conf      subgid              virc
audisp                   dbus-1                   gcrypt       inputrc        logrotate.d               ntp.conf           profile.d       rsyslog.d         subuid              vmware-tools
audit                    default                  gnupg        iproute2       lvm                       openldap           protocols       rwtab             sudo.conf           wgetrc
bash_completion.d        depmod.d                 GREP_COLORS  issue          machine-id                opt                python          rwtab.d           sudoers             wpa_supplicant
bashrc                   dhcp                     groff        issue.net      magic                     os-release         rc0.d           sasl2             sudoers.d           X11
binfmt.d                 DIR_COLORS               group        kdump.conf     makedumpfile.conf.sample  pam.d              rc1.d           securetty         sudo-ldap.conf      xdg
centos-release           DIR_COLORS.256color      group-       kernel         man_db.conf               passwd             rc2.d           security          sysconfig           xinetd.d
centos-release-upstream  DIR_COLORS.lightbgcolor  grub2.cfg    krb5.conf      mke2fs.conf               passwd-            rc3.d           selinux           sysctl.conf         yum
chkconfig.d              dracut.conf              grub.d       krb5.conf.d    modprobe.d                pkcs11             rc4.d           services          sysctl.d            yum.conf
cron.d                   dracut.conf.d            gshadow      ld.so.cache    modules-load.d            pki                rc5.d           sestatus.conf     systemd             yum.repos.d
cron.daily               e2fsck.conf              gshadow-     ld.so.conf     motd                      plymouth           rc6.d           shadow            system-release
cron.deny                environment              gss          ld.so.conf.d   mtab                      pm                 rc.d            shadow-           system-release-cpe
cron.hourly              ethertypes               host.conf    libaudit.conf  my.cnf                    polkit-1           rc.local        shells            terminfo
[root@master etc]# cd hadoop # 没有这个目录
-bash: cd: hadoop: No such file or directory
[root@master etc]# cd - # 返回上一次所在的目录
/opt/hadoop-3.1.4
[root@master hadoop-3.1.4]# ls
bin  etc  include  lib  libexec  LICENSE.txt  logs  NOTICE.txt  README.txt  sbin  share
[root@master hadoop-3.1.4]# cd ./etc # 切换到当前目录下的etc目录
[root@master etc]# ls
hadoop
[root@master etc]# cd hadoop
[root@master hadoop]# ls
capacity-scheduler.xml  hadoop-env.sh                     httpfs-env.sh            kms-env.sh            mapred-env.sh               ssl-server.xml.example         yarnservice-log4j.properties
configuration.xsl       hadoop-metrics2.properties        httpfs-log4j.properties  kms-log4j.properties  mapred-queues.xml.template  user_ec_policies.xml.template  yarn-site.xml
container-executor.cfg  hadoop-policy.xml                 httpfs-signature.secret  kms-site.xml          mapred-site.xml             workers
core-site.xml           hadoop-user-functions.sh.example  httpfs-site.xml          log4j.properties      shellprofile.d              yarn-env.cmd
hadoop-env.cmd          hdfs-site.xml                     kms-acls.xml             mapred-env.cmd        ssl-client.xml.example      yarn-env.sh
[root@master hadoop]# cat hdfs-site.xml # 找到了!然后cat一下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<property>
		 <name>dfs.namenode.name.dir</name>
 		 <value>file:///data/hadoop/hdfs/name</value>
	</property>
	<property>
 		<name>dfs.datanode.data.dir</name>
 		<value>file:///data/hadoop/hdfs/data</value>
	</property>
 	<property>
		 <name>dfs.namenode.secondary.http-address</name>
 		<value>master:50090</value>
 	</property>
 	<property>
 		<name>dfs.replication</name>
 		<value>2</value>
	</property>
</configuration>

下面来分析一下hdfs-site.xml中的内容:

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<property>
		 <name>dfs.namenode.name.dir</name>
 		 <value>file:///data/hadoop/hdfs/name</value>
	</property>
	<property>
 		<name>dfs.datanode.data.dir</name>
 		<value>file:///data/hadoop/hdfs/data</value>
	</property>
 	<property>
		 <name>dfs.namenode.secondary.http-address</name>
 		<value>master:50090</value>
 	</property>
 	<property>
 		<name>dfs.replication</name>
 		<value>2</value>
	</property>
</configuration>

1.

dfs.namenode.name.dir是NameNode元数据存储路径:NameNode节点用来存储文件系统元数据的本地磁盘路径。其存储的内容:fsimage(文件镜像系统,包含完整的目录树结构、文件属性、权限等)、edits log(编辑日志,记录所有对HDFS的写操作)

实际目录结构在:/data/hadoop/hdfs/name/current/

[root@master hadoop]# ls /
bin  boot  data  demo01  dev  etc  home  lib  lib64  media  mnt  opt  parent  proc  Projects  root  run  sbin  srv  sys  Tests  tmp  usr  var
[root@master hadoop]# ls /data
hadoop
[root@master hadoop]# ls /data/hadoop
hdfs  namenode  tmp
[root@master hadoop]# ls /data/hadoop
hdfs  namenode  tmp
[root@master hadoop]# ls /data/hadoop/hdfs
name
[root@master hadoop]# ls /data/hadoop/hdfs/name
current  in_use.lock
[root@master hadoop]# ls /data/hadoop/hdfs/name/current
edits_0000000000000000001-0000000000000000009  edits_0000000000000000015-0000000000000000016  edits_0000000000000000039-0000000000000000040  fsimage_0000000000000000041.md5
edits_0000000000000000010-0000000000000000010  edits_0000000000000000017-0000000000000000017  edits_0000000000000000041-0000000000000000041  fsimage_0000000000000000042
edits_0000000000000000011-0000000000000000011  edits_0000000000000000018-0000000000000000019  edits_0000000000000000042-0000000000000000042  fsimage_0000000000000000042.md5
edits_0000000000000000012-0000000000000000013  edits_0000000000000000020-0000000000000000036  edits_inprogress_0000000000000000043           seen_txid
edits_0000000000000000014-0000000000000000014  edits_0000000000000000037-0000000000000000038  fsimage_0000000000000000041                    VERSION

重要说明:file://这个前缀表明这是本地Linux文件系统路径,不是HDFS路径。

                这个目录只存在NameNode节点上(你配置的master节点上)

                如果这个目录损坏或丢失,整个HDFS文件系统元数据将丢失(无法恢复文件)

                而生产环境中通常会配置多个路径(不同磁盘)来冗余存储

2.

dfs.datanode.data.dir表示DataNode数据块存储路径:DataNode节点用来实际存储数据块的本地磁盘路径。 其存储的内容:数据块文件(blk_*)、数据块的校验文件(blk_*.meta)

[root@master hadoop]# ls /data/hadoop/hdfs
name
[root@master hadoop]# ls /data/hadoop/hdfs/name
current  in_use.lock
[root@master hadoop]# ls /data/hadoop/hdfs/name/current
edits_0000000000000000001-0000000000000000009  edits_0000000000000000015-0000000000000000016  edits_0000000000000000039-0000000000000000040  fsimage_0000000000000000041      VERSION
edits_0000000000000000010-0000000000000000010  edits_0000000000000000017-0000000000000000017  edits_0000000000000000041-0000000000000000041  fsimage_0000000000000000041.md5
edits_0000000000000000011-0000000000000000011  edits_0000000000000000018-0000000000000000019  edits_0000000000000000042-0000000000000000042  fsimage_0000000000000000042
edits_0000000000000000012-0000000000000000013  edits_0000000000000000020-0000000000000000036  edits_0000000000000000043-0000000000000000051  fsimage_0000000000000000042.md5
edits_0000000000000000014-0000000000000000014  edits_0000000000000000037-0000000000000000038  edits_inprogress_0000000000000000052           seen_txid

3.

dfs.namenode.secondeary.http-address是SecondaryNameNode地址:

即辅助名称节点的Web界面和端口

它会定期从NameNode合并fsimage和edits log,生产新的fsimage。会减少NameNode重启时的合并实践。

它的访问方式为:http://master:50090

重要说明:SecondaryNameNode和NameNode通常放在不同的机器上(你配置在同一台master上,仅用于学习环境)。并且它不提供故障转移能力,NameNode挂了它无法自动接管

4.

dfs.replication是默认副本数:HDFS中每个文件默认的副本数量

值为2:每个文件会被存储2份在不同的DataNode上

数据可靠性:运行1台DataNode损坏而不丢失数据

存储空间:上传1GB文件,实际会占用2GB存储空间

副本数优点缺点适用场景
1节省存储空间任意节点故障即丢数据临时数据、可重新生成的数据
2节省50%空间,一定可靠性单点故障有风险小规模学习集群
3(生产默认)高可靠性,容忍2节点故障存储成本高生产环境重要数据

[root@master hadoop]# ls /data/hadoop/namenode
[root@master hadoop]# hdfs dfs -ls /
Found 2 items
-rw-r--r--   2 root supergroup         11 2026-04-23 09:38 /test.txt
drwxrwx---   - root supergroup          0 2026-04-18 02:27 /tmp
[root@master hadoop]# hdfs dfs -cat /test.txt
2026-04-25 11:52:08,094 WARN impl.BlockReaderFactory: I/O error constructing remote block reader.
java.net.NoRouteToHostException: No route to host
	at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
	at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:715)
	at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
	at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)

只截取了部分输出

没有正确cat出test.txt的内容,这是因为我只关闭了master节点上的防火墙,但这远远还不够。

因为读取文件test.txt时:

  1. NameNode(master)告诉客户端:“这个文件目前在slave1和slave2上”
  2. 于是客户端尝试连接slave1:9886,但是被slave1的firewall拦截住
  3. 客户端尝试连接slave2:9866,但同样被slave2的防火墙拦住
  4. 导致了最终的失败

我关闭了slave1的防火墙,就能正常输出了。貌似只关闭一台服务器的防火墙就可以吗?因为slave1上也存储了test.txt?

最好还是都关闭

因为HDFS客户端会随机选择或按网络拓扑选择一个DataNode来读取。如果选中的节点防火墙没关,那么就会读取失败。

[root@master hadoop]# hdfs dfs -cat /test.txt
Hello HDFS

[root@master /]# ls
bin  boot  data  demo01  dev  etc  home  lib  lib64  media  mnt  opt  parent  proc  Projects  root  run  sbin  srv  sys  Tests  tmp  usr  var
[root@master /]# cd data
[root@master data]# ls
hadoop
[root@master data]# cd hadoop
[root@master hadoop]# ls
hdfs  namenode  tmp
[root@master hadoop]# cd hdfs
[root@master hdfs]# ls
name
[root@master hdfs]# cd name
[root@master name]# ls
current  in_use.lock
[root@master name]# cd curren
-bash: cd: curren: No such file or directory
[root@master name]# cd current
[root@master current]# ls
edits_0000000000000000001-0000000000000000009  edits_0000000000000000015-0000000000000000016  edits_0000000000000000039-0000000000000000040  fsimage_0000000000000000041      VERSION
edits_0000000000000000010-0000000000000000010  edits_0000000000000000017-0000000000000000017  edits_0000000000000000041-0000000000000000041  fsimage_0000000000000000041.md5
edits_0000000000000000011-0000000000000000011  edits_0000000000000000018-0000000000000000019  edits_0000000000000000042-0000000000000000042  fsimage_0000000000000000042
edits_0000000000000000012-0000000000000000013  edits_0000000000000000020-0000000000000000036  edits_0000000000000000043-0000000000000000051  fsimage_0000000000000000042.md5
edits_0000000000000000014-0000000000000000014  edits_0000000000000000037-0000000000000000038  edits_inprogress_0000000000000000052           seen_txid
[root@master current]# ls -l
total 8244
-rw-r--r--. 1 root root     672 Apr 18 02:28 edits_0000000000000000001-0000000000000000009
-rw-r--r--. 1 root root 1048576 Apr 18 02:28 edits_0000000000000000010-0000000000000000010
-rw-r--r--. 1 root root 1048576 Apr 19 12:10 edits_0000000000000000011-0000000000000000011
-rw-r--r--. 1 root root      42 Apr 19 12:50 edits_0000000000000000012-0000000000000000013
-rw-r--r--. 1 root root 1048576 Apr 19 12:50 edits_0000000000000000014-0000000000000000014
-rw-r--r--. 1 root root      42 Apr 23 00:51 edits_0000000000000000015-0000000000000000016
-rw-r--r--. 1 root root 1048576 Apr 23 00:51 edits_0000000000000000017-0000000000000000017
-rw-r--r--. 1 root root      42 Apr 23 08:46 edits_0000000000000000018-0000000000000000019
-rw-r--r--. 1 root root 1048576 Apr 23 09:38 edits_0000000000000000020-0000000000000000036
-rw-r--r--. 1 root root      42 Apr 23 23:51 edits_0000000000000000037-0000000000000000038
-rw-r--r--. 1 root root      42 Apr 24 00:52 edits_0000000000000000039-0000000000000000040
-rw-r--r--. 1 root root 1048576 Apr 24 00:52 edits_0000000000000000041-0000000000000000041
-rw-r--r--. 1 root root 1048576 Apr 25 00:49 edits_0000000000000000042-0000000000000000042
-rw-r--r--. 1 root root     656 Apr 25 11:21 edits_0000000000000000043-0000000000000000051
-rw-r--r--. 1 root root 1048576 Apr 25 11:52 edits_inprogress_0000000000000000052
-rw-r--r--. 1 root root     870 Apr 25 00:49 fsimage_0000000000000000041
-rw-r--r--. 1 root root      62 Apr 25 00:49 fsimage_0000000000000000041.md5
-rw-r--r--. 1 root root     870 Apr 25 10:34 fsimage_0000000000000000042
-rw-r--r--. 1 root root      62 Apr 25 10:34 fsimage_0000000000000000042.md5
-rw-r--r--. 1 root root       3 Apr 25 11:21 seen_txid
-rw-r--r--. 1 root root     219 Apr 25 10:34 VERSION

master节点的/data/hadoop/hdfs/name/:存储目录树和文件列表(元数据),不存储文件

slave的/data/hadoop/hdfs/data/:存储真正的文件数据块(二进制数据)

上面的/data/hadoop/hdfs/name/current目录中:

1.fsimage_*文件是文件系统镜像文件

这是HDFS文件系统的完整快照,记录了所有目录和文件的树形结构、每个文件的属性(名称、权限、所有者、大小)、每个文件由哪些数据块组成(块ID列表)

-rw-r--r--. 1 root root     870 Apr 25 00:49 fsimage_0000000000000000041
-rw-r--r--. 1 root root      62 Apr 25 00:49 fsimage_0000000000000000041.md5
-rw-r--r--. 1 root root     870 Apr 25 10:34 fsimage_0000000000000000042
-rw-r--r--. 1 root root      62 Apr 25 10:34 fsimage_0000000000000000042.md5
-rw-r--r--. 1 root root       3 Apr 25 11:21 seen_txid
-rw-r--r--. 1 root root     219 Apr 25 10:34 VERSION

root root后面是文件大小(字节数),如第一个fsimage文件大小为870字节

2.edit_*是编辑日志文件

作用:记录自上次fsimage之后所有写操作(创建文件、删除文件、修改权限)

命名规则:

  • edits_开始事物-结束事物ID:以封存的日志段
  • edits_inprogress_当前事物ID:正在写入的日志(活跃状态)

3.seen_txid是最后提交事务的Id

作用:记录NameNode最近一次启动时看到的最大事务ID

重要性:NameNode重启时会读取这个文件,知道从哪个事务开始恢复

[root@master current]# cat seen_txid 
55

4.VERSION是集群元数据信息

[root@master current]# cat VERSION 
#Sat Apr 25 10:34:10 CST 2026
namespaceID=1061011551
clusterID=CID-30fb5b2b-e186-4e04-be58-61f90a309985
cTime=1776450313876
storageType=NAME_NODE
blockpoolID=BP-447229057-192.168.128.130-1776450313876
layoutVersion=-64

作用:记录NameNode的版本、集群ID等元信息

[root@slave1 current]# clear
[root@slave1 current]# cd /
[root@slave1 /]# clear
[root@slave1 /]# ls
bin  boot  data  demo01  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@slave1 /]# cd data
[root@slave1 data]# ls
hadoop
[root@slave1 data]# cd hadoop
[root@slave1 hadoop]# ls
datanode  hdfs  tmp  yarn
[root@slave1 hadoop]# cd hdfs
[root@slave1 hdfs]# ls
data
[root@slave1 hdfs]# cd data
[root@slave1 data]# ls
current  in_use.lock
[root@slave1 data]# cd current
[root@slave1 current]# ls
BP-447229057-192.168.128.130-1776450313876  VERSION
[root@slave1 current]# cd BP-447229057-192.168.128.130-1776450313876/
[root@slave1 BP-447229057-192.168.128.130-1776450313876]# ls
current  scanner.cursor  tmp
[root@slave1 BP-447229057-192.168.128.130-1776450313876]# cd current
[root@slave1 current]# ls
dfsUsed  finalized  rbw  VERSION
[root@slave1 current]# cd finalized/
[root@slave1 finalized]# ls
subdir0
[root@slave1 finalized]# cd subdir0/
[root@slave1 subdir0]# ls
subdir0
[root@slave1 subdir0]# cd subdir0
[root@slave1 subdir0]# ls
blk_1073741827  blk_1073741827_1003.meta
[root@slave1 subdir0]# cat blk_1073741827
Hello HDFS
[root@slave1 subdir0]# cat blk_1073741827_1003.meta 

1.BP-447229057-192.168.128.130-1776450313876

这是块池目录。BP=Block Pool

447229057 = 块池ID

192.168.128.130 = NameNode的IP地址

1776450313876 = 创建时间戳

cat blk_1073741827
# 输出: Hello HDFS

数据块是可读的,因为在默认情况下,HDFS的数据块没有加密

主要目录存储内容文件大小特点
masterNameNode/data/hadoop/hdfs/name/current/元数据(fsimage + edits)通常只有几MB到几百MB
slave1DataNode/data/hadoop/hdfs/data/current/实际数据块(blk_*)与上传文件大小相关
slave2DataNode/data/hadoop/hdfs/data/current/实际数据块(blk_*)与上传文件大小相关

2.HDFS的常用命令

核心命令格式:

hdfs dfs -[命令] [参数]

小技巧:很多地方也支持使用hdfs fs,但官方更推荐使用hdfs dfs,因为后者更专属于HDFS

1.目录操作(最常用)

这些命令和Linux几乎一模一样,很容易上手。

命令功能示例
-ls列出目录内容hdfs dfs -ls / (查看根目录)
hdfs dfs -ls -R / (递归查看所有子目录)
-mkdir创建目录hdfs dfs -mkdir /user
hdfs dfs -mkdir -p /user/hadoop/data (创建多级目录)
-rmdir删除空目录hdfs dfs -rmdir /empty_dir

2.文件操作(上传/下载/查看)

这是将本地数据和HDFS打通的关键。

命令功能示例
-put本地文件上传到HDFShdfs dfs -put /home/test.txt /user/data/
-copyFromLocal功能同-put(更语义化)hdfs dfs -copyFromLocal ./a.txt /
-get将HDFS上的文件下载到本地hdfs dfs -get /user/data/test.txt /home/
-copyToLocal功能同-gethdfs dfs -copyToLocal /data.txt ./
-cat查看HDFS文件内容hdfs dfs -cat /user/data/word.txt
-tail查看文件末尾1KB(适合看日志)hdfs dfs -tail /logs/hadoop.log
-head查看文件开头hdfs dfs -head /user/data/bigfile.txt

3.文件管理(删除/移动/复制/修改)
命令功能示例
-rm删除文件或目录hdfs dfs -rm /user/data/temp.txt
hdfs dfs -rm -r /user/old_dir (递归删除目录)
-mv移动或重命名hdfs dfs -mv /data/a.txt /backup/b.txt
-cp复制文件hdfs dfs -cp /data/input.txt /data/output/
-chmod修改权限(同Linux)hdfs dfs -chmod 755 /user/script.sh
-chown修改所有者hdfs dfs -chown hadoop:hadoop /user/data

4.系统信息与统计(运维常用)
命令功能示例
-df查看HDFS整体容量hdfs dfs -df -h / (人类可读格式)
-du查看指定目录的大小hdfs dfs -du -s -h /user/data (显示总大小)
hdfs dfs -du -h /user/* (逐项显示)
-setrep修改文件的副本数hdfs dfs -setrep -w 3 /important/file (设置为3副本)
-stat显示文件统计信息hdfs dfs -stat "%n (size %b)" /data.txt
-count统计目录下的文件/目录数量hdfs dfs -count /user

6.常见问题
  1. 路径区分:不带前缀的路径(如/home/a.txt)是HDFS路径;带file://或直接写本地路径(如~/a.txt)才是本地路径。-put的第一个参数是本地,第二个是HDFS

  2. 删除不经过回收站-rm默认直接删除(除非配置了Trash)。删除前建议先用-ls确认。

  3. 权限错误:如果你用非root用户操作,遇到Permission denied,可以先用-chmod-chown调整,或联系管理员。

  4. 安全模式:刚启动集群时,HDFS会进入安全模式(只读)。这时只能执行-ls-cat等读操作,写入操作会报错,等几分钟自动退出即可。

3.练习一

[root@master current]# hdfs dfs -mkidr /Tests
[root@master current]# hdfs dfs -touchz /Tests/input.txt # Linux中创建空文件的命令是touch,而在HDFS中创建空文件的命令是-touchz,z表示zero,-touchz表示创建一个零字节的空文件。在Linux中,touch命令创建空文件时如果文件不存在则创建空文件,如果文件存在则会更新时间戳。HDFS中-touchz遇到文件已经存在时会报错(只会创建0字节的空文件,只创建不更新)
[root@master current]# hdfs dfs -ls /Tests
Found 1 items
-rw-r--r--   2 root supergroup          0 2026-04-26 23:42 /Tests/input.txt
[root@master current]# hdfs dfs -ls /Tests/input.txt # 0字节空文件
-rw-r--r--   2 root supergroup          0 2026-04-26 23:42 /Tests/input.txt
[root@master current]# hdfs dfs -touchz /Tests/input.txt # 其实不会报错,会更新时间戳。Hadoop版本是3.1.4,老版本中估计会报错
[root@master current]# hdfs dfs -ls /Tests/input.txt
-rw-r--r--   2 root supergroup          0 2026-04-26 23:51 /Tests/input.txt

[root@master current]# echo "送你一朵小红花,开在你昨天新长的枝桠" > ~/ data1.txt
-bash: /root/: Is a directory
[root@master current]# echo "送你一朵小红花,开在你昨天新长的枝桠" > ~/data1.txt
[root@master current]# ls ~/
anaconda-ks.cfg  data1.txt  hadoop-3.1.4.tar.gz  test.txt
[root@master current]# cat ~/data1.txt 
送你一朵小红花,开在你昨天新长的枝桠
[root@master current]# echo "奖励你有勇气,主动来和我说话" >> ~/data1.txt
[root@master current]# echo "送你一朵小红花,遮住你今天新添的伤疤" >> ~/data1.txt
[root@master current]# echo "会有美好的未来!" >> ~/data1.txt
[root@master current]# cat ~/data1.txt
送你一朵小红花,开在你昨天新长的枝桠
奖励你有勇气,主动来和我说话
送你一朵小红花,遮住你今天新添的伤疤
会有美好的未来!
[root@master current]# hdfs dfs -put ~/data1.txt /Tests
[root@master current]# hdfs dfs -ls /Tests
Found 2 items
-rw-r--r--   2 root supergroup        178 2026-04-27 00:01 /Tests/data1.txt
-rw-r--r--   2 root supergroup          0 2026-04-26 23:51 /Tests/input.txt
[root@master current]# hdfs dfs -cat /Tests/data1.txt
送你一朵小红花,开在你昨天新长的枝桠
奖励你有勇气,主动来和我说话
送你一朵小红花,遮住你今天新添的伤疤
会有美好的未来!

[root@master current]# echo "这是电影《送你一朵小红花主题曲》。用/"送你一朵小红花/"的意向。温柔记录抗癌家庭的日常,把苦难熬成糖,把绝望写成诗。歌中/"遮住新添的伤疤/"/"战胜苦难的日子/"等句子,成 了许多人面对困境时的精神锚点。" > ~/data2.txt
[root@master current]# ls ~/data2.txt
/root/data2.txt
[root@master current]# ls ~
anaconda-ks.cfg  data1.txt  data2.txt  hadoop-3.1.4.tar.gz  test.txt
[root@master current]# cat ~/data2.txt 
这是电影《送你一朵小红花主题曲》。用/送你一朵小红花/的意向。温柔记录抗癌家庭的日常,把苦难熬成糖,把绝望写成诗。歌中/遮住新添的伤疤//战胜苦难的日子/等句子,成了许多人面对困境时的精神锚点。
[root@master current]# vim ~/data2.txt
[root@master current]# cat ~/data2.txt
这是电影《送你一朵小红花主题曲》。用“送你一朵小红花”的意向。温柔记录抗癌家庭的日常,把苦难熬成糖,把绝望写成诗。
歌中“遮住新添的伤疤”“战胜苦难的日子”等句子,成了许多人面对困境时的精神锚点。
[root@master current]# hdfs dfs -moveFromLocal ~/data2.txt /Tests # 将本地文件移动到HDFS
[root@master current]# ls ~/
anaconda-ks.cfg  data1.txt  data3.txt  hadoop-3.1.4.tar.gz  test.txt
[root@master current]# hdfs dfs -ls /Tests
Found 3 items
-rw-r--r--   2 root supergroup        178 2026-04-27 00:01 /Tests/data1.txt
-rw-r--r--   2 root supergroup        293 2026-04-27 00:30 /Tests/data2.txt
-rw-r--r--   2 root supergroup          0 2026-04-26 23:51 /Tests/input.txt
[root@master current]# hdfs dfs -cat /Tests/data2.txt
这是电影《送你一朵小红花主题曲》。用“送你一朵小红花”的意向。温柔记录抗癌家庭的日常,把苦难熬成糖,把绝望写成诗。
歌中“遮住新添的伤疤”“战胜苦难的日子”等句子,成了许多人面对困境时的精神锚点。

注意:

HDFS中没有隐藏文件这个概念,所以用-ls -a这个命令会报错

命令作用范围操作对象
hdfs dfs -mvHDFS 内部HDFS 文件 → HDFS 文件
hdfs dfs -put本地 → HDFS本地文件 → HDFS
hdfs dfs -getHDFS → 本地HDFS 文件 → 本地
mv (不带 hdfs)本地内部本地文件 → 本地文件

要将本地文件移动到HDFS,要用-moveFromLocal命令

[root@master current]# hdfs dfs -get /Tests/data2.txt ~/file1.txt # 把data2.txt文件从分布式系统下载到本地并改名为file1.txt
[root@master current]# ls ~/
anaconda-ks.cfg  data1.txt  data3.txt  file1.txt  hadoop-3.1.4.tar.gz  test.txt
[root@master current]# cat ~/file1.txt
这是电影《送你一朵小红花主题曲》。用“送你一朵小红花”的意向。温柔记录抗癌家庭的日常,把苦难熬成糖,把绝望写成诗。
歌中“遮住新添的伤疤”“战胜苦难的日子”等句子,成了许多人面对困境时的精神锚点。
[root@master current]# hdfs dfs -ls /Tests/
Found 3 items
-rw-r--r--   2 root supergroup        178 2026-04-27 00:01 /Tests/data1.txt
-rw-r--r--   2 root supergroup        293 2026-04-27 00:30 /Tests/data2.txt
-rw-r--r--   2 root supergroup          0 2026-04-26 23:51 /Tests/input.txt

3.关闭Hadoop集群

推荐的关闭顺序:

注:这是在/opt/hadoop-3.1.4/sbin目录下的操作命令

# 1. 先关闭 YARN(资源管理器)
./stop-yarn.sh

# 2. 再关闭 HDFS(存储系统)
./stop-dfs.sh

# 3. 最后关闭历史服务器(可选)
./mr-jobhistory-daemon.sh stop historyserver
关闭顺序结果说明
先关 YARN,后关 HDFS✅ 正常YARN 上的任务先结束,然后 HDFS 安全关闭
先关 HDFS,后关 YARN⚠️ 可能有问题HDFS 关闭时,YARN 上的任务还在读写数据,会报错

具体原因:

  1. YARN 依赖 HDFS

    • YARN 上的 MapReduce 任务需要从 HDFS 读取数据

    • 任务执行结果也要写入 HDFS

    • 如果先关 HDFS,YARN 任务会立即报错:java.io.IOException: No FileSystem for scheme: hdfs

  2. 优雅关闭 vs 强制中断

    • 先关 YARN:YARN 会等待当前任务完成,或优雅地终止它们

    • 先关 HDFS:正在读写数据的任务会突然断开连接,可能造成数据不一致

检查是否关闭成功:

关闭后,用 jps 验证所有节点上都没有 Hadoop 进程了:

如:

[root@master sbin]# cd ..
[root@master hadoop-3.1.4]# cd /
[root@master /]# stop-yarn.sh
Stopping nodemanagers
Last login: Wed Apr 22 23:56:04 CST 2026 on pts/0
Stopping resourcemanager
Last login: Thu Apr 23 01:14:42 CST 2026 on pts/0
[root@master /]# stop-dfs.sh
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Stopping namenodes on [master]
Last login: Thu Apr 23 01:14:43 CST 2026 on pts/0
Stopping datanodes
Last login: Thu Apr 23 01:15:01 CST 2026 on pts/0
Stopping secondary namenodes [master]
Last login: Thu Apr 23 01:15:02 CST 2026 on pts/0
[root@master /]# mr-jobhistory-daemon.sh stop historyserver
WARNING: Use of this script to stop the MR JobHistory daemon is deprecated.
WARNING: Attempting to execute replacement "mapred --daemon stop" instead.
[root@master /]# jps
8092 Jps

更多推荐