1. HDFS简介
HDFS(Hadoop Distributed File System)是一种Hadoop分布式文件系统,具备高度容错特性,支持高吞吐量数据访问,可以在处理海量数据(TB或PB级别以上)的同时最大可能的降低成本。HDFS适用于大规模数据的分布式读写,特别是读多写少的场景。
HDFS是经典的Master和Slave架构,其关键组件包括:
-
NameNode(名称节点):它是HDFS的主服务器,负责管理文件系统的命名空间和客户端对文件的访问。NameNode执行文件系统的命名操作,如打开、关闭、重命名文件或目录。它不存储实际数据,但维护文件系统树及元数据(metadata)的所有信息,如文件的权限、文件的位置等信息。对于文件内容的修改也是首先通过NameNode进行协调。
-
DataNode(数据节点):在HDFS中,实际的数据被存储在DataNode上。这些节点根据NameNode的指示存储和检索数据块(block),并定期向NameNode报告它们所持有的数据块的列表。DataNode是HDFS的工作节点,负责处理文件系统客户端的读写请求。在HDFS中,文件被分割成一个或多个数据块,这些数据块存储在一个或多个DataNode上。
-
块(Block):HDFS将文件分割成块大小的多个片段,每个块默认为128MB(在早期版本中为64MB)。这样做的目的是便于在网络中分布式传输,提高系统的可靠性和效率。每个数据块在多个DataNode上有多个副本(默认情况下是三个),以实现容错。
📝 每一个HDFS集群包括一个NameNode和多个DataNode。NameNode管理所有文件的元数据信息,并且负责与客户端交互。DataNode负责管理存储在该节点上的文件。每一个上传到HDFS的文件都会被划分为一个或多个数据块,这些数据块根据HDFS集群的数据备份策略被分配到不同的DataNode上,位置信息交由NameNode统一管理。
HDFS的特点如下:
- 容错性:通过在多个DataNode上复制数据块,HDFS能够保证在某个节点失败时数据的可用性和系统的持续运行。
- 高吞吐量:HDFS能够提供高数据吞吐量,适合于处理大量数据集。
- 适合批处理操作:HDFS支持大文件的存储,并且最适合一次写入、多次读取的场景。
- 可扩展性:HDFS可以通过添加更多的硬件来轻松扩展其存储能力。
- 跨平台兼容性:HDFS支持在多种操作系统上运行,提高了其可用性。
当客户端需要读取或写入数据时,它首先与NameNode通信以获取数据块所在的DataNode地址。对于写操作,NameNode还将决定将数据块放在哪些DataNode上。一旦客户端获得了这些信息,它就可以直接与DataNode通信来读取或写入数据,这样设计是为了减轻NameNode的负担,使得数据传输效率更高。
2. hdfs dfs
HDFS提供了一套强大的命令行工具,通过这些工具,用户可以执行从基本的文件操作到复杂的集群管理任务。以下是在管理HDFS时最为常用的几个子命令,它们代表了与HDFS交互的基础和核心:
-
dfs
: 此命令是与HDFS进行日常文件操作的基石,涵盖了文件上传、下载、删除以及目录创建和列举等功能。通过hdfs dfs
命令,用户可以轻松地在HDFS中导航和管理数据,使其成为数据工程师日常工作的重要组成部分。 -
fsck
: 对于确保数据的完整性和系统的可靠性至关重要,hdfs fsck
提供了一种强大的机制来对HDFS进行健康检查。它允许管理员识别和修复文件系统中的问题,保障数据的安全和访问的稳定性。 -
dfsadmin
: 管理HDFS集群的高级功能通过hdfs dfsadmin
命令实现,它使得管理员能够执行如报告集群状态、管理数据节点和调整配置参数等关键任务。这个命令是集群维护的核心,提供了对集群运行状况的全面控制。 -
balancer
: 在分布式环境中,保持数据的均衡分布是提高效率和优化资源使用的关键。hdfs balancer
命令自动调整数据在集群内的分布,确保负载均衡,从而维持集群的高性能运行。 -
version
: 在进行系统升级、故障排查时,了解当前Hadoop集群的版本信息是非常有用的。hdfs version
命令快速提供了这一信息,包括详细的版本号、构建日期和源码版本控制详情,对于管理员和开发者来说是一个不可或缺的工具。
在所有 hdfs
子命令中,dfs
子命令可能是最频繁使用的。这是因为 hdfs dfs
命令提供了与HDFS中存储的数据进行日常交互的基础功能,包括文件上传(-put
)、下载(-get
)、列出目录内容(-ls
)、删除文件(-rm
)以及创建目录(-mkdir
)等操作。这些操作是数据工程师、系统管理员和开发者在使用Hadoop处理和管理数据时的常规需求。
因此,本文只介绍 hdfs dfs
的常用命令,对于其他子命令,读者可自行查阅资料。
⚠️ FS(File System)是文件系统,DFS(Distributed File System)是分布式文件系统,显然FS > DFS,所以在分布式的环境下,FS和DFS无区别,
hadoop fs
和hdfs dfs
命令等价。注意,hadoop fs
可以操作任何文件系统,而hdfs dfs
只能操作HDFS文件系统。
命令 | 作用 |
---|---|
hdfs version | 查看版本 |
hdfs dfs -help | 获取帮助 |
hdfs dfs -ls <path> | 查看指定路径下的所有文件 |
hdfs dfs -mkdir <path> | 创建目录 |
hdfs dfs -rm <path> | 删除文件或者目录(删除目录需要加上 -r ) |
hdfs dfs -get <hdfs_path> <local_path> | 从HDFS下载文件到本地 |
hdfs dfs -put <local_path> <hdfs_path> | 从本地上传文件至HDFS |
hdfs dfs -cat <file> | 查看文件内容 |
hdfs dfs -mv <source> <target> | 移动或重命名文件 |
hdfs dfs -cp <source> <target> | 拷贝文件 |
hdfs dfs -find <path> -name <file> | 在指定路径中查找文件 |
hdfs dfs -cp <source> <target> | 拷贝文件 |
hdfs dfs -touchz <file> | 创建一个空文件 |
hdfs dfs -du -h <path> | 显示文件的大小或者目录中所有文件的大小 |
hdfs dfs -chmod 777 <path> | 改变文件或目录的权限(777 只是一个示例) |
hdfs dfs -df -h | 显示HDFS的容量和使用情况 |
Ref
[1] https://bbs.huaweicloud.com/blogs/218061
[2] https://www.hadoopdoc.com/hdfs/hdfs-shell
[3] https://help.aliyun.com/zh/emr/emr-on-ecs/user-guide/common-commands-of-hdfs