什么是 HDFS17 Mar 2025 | 4 分钟阅读 Hadoop 自带一个分布式文件系统,称为 HDFS。在 HDFS 中,数据分布在多台机器上,并进行复制,以确保其持久性,防止故障,并为并行应用程序提供高可用性。 它经济高效,因为它使用商品硬件。它涉及块、数据节点和节点名称的概念。 HDFS 的适用场景- 非常大的文件:文件应为数百兆字节、千兆字节或更大。
- 流式数据访问:读取整个数据集的时间比读取第一个数据的延迟更重要。HDFS 构建在“一次写入,多次读取”的模式之上。
- 商品硬件:它运行在低成本硬件上。
HDFS 的不适用场景- 低延迟数据访问:需要非常短的时间来访问第一个数据的应用程序不应使用 HDFS,因为它更重视整个数据而不是获取第一个记录的时间。
- 大量小文件:名称节点包含文件中继数据,如果文件很小,则会占用名称节点的大量内存,这是不可行的。
- 多次写入:当我们必须多次写入时,不应使用它。
HDFS 概念- 块:块是可以读取或写入的最小数据量。默认情况下,HDFS 块为 128 MB,这是可配置的。HDFS 中的文件被分解为块大小的块,这些块存储为独立单元。与文件系统不同,如果 HDFS 中的文件小于块大小,则它不占用完整的块大小,即存储在块大小为 128 MB 的 HDFS 中的 5 MB 文件仅占用 5MB 的空间。HDFS 块大小很大,只是为了最大限度地降低寻道的成本。
- 名称节点:HDFS 以主-从模式工作,其中名称节点充当主节点。名称节点是 HDFS 的控制器和管理器,因为它知道 HDFS 中所有文件的状态和元数据;元数据信息包括文件权限、名称和每个块的位置。元数据很小,因此它存储在名称节点的内存中,从而可以更快地访问数据。此外,多个客户端并发访问 HDFS 集群,因此所有这些信息都由单个机器处理。文件系统操作(如打开、关闭、重命名等)由它执行。
- 数据节点:它们在客户端或名称节点的指令下存储和检索块。它们定期向名称节点报告,其中包含它们正在存储的块列表。数据节点作为商品硬件,还执行名称节点指示的块创建、删除和复制工作。
HDFS 数据节点和名称节点图  HDFS 读取图  HDFS 写入图  由于所有元数据都存储在名称节点中,因此它非常重要。如果它发生故障,则无法使用文件系统,因为无法知道如何从数据节点中存在的块重建文件。为了克服这个问题,出现了辅助名称节点的概念。 辅助名称节点:它是一台单独的物理机器,充当名称节点的助手。它执行定期检查点。它与名称节点通信并拍摄元数据的快照,这有助于最大限度地减少停机时间和数据丢失。 启动 HDFSHDFS 应首先格式化,然后在分布式模式下启动。命令如下。 要格式化 $ hadoop namenode -format 要启动 $ start-dfs.sh HDFS 基本文件操作- 将数据从本地文件系统放入 HDFS
- 首先在 HDFS 中创建一个文件夹,数据可以从本地文件系统放入其中。
$ hadoop fs -mkdir /user/test - 将文件 "data.txt" 从本地文件夹 /usr/home/Desktop 复制到 HDFS 文件夹 /user/test
$ hadoop fs -copyFromLocal /usr/home/Desktop/data.txt /user/test - 显示 HDFS 文件夹的内容
$ Hadoop fs -ls /user/test
- 将数据从 HDFS 复制到本地文件系统
- $ hadoop fs -copyToLocal /user/test/data.txt /usr/bin/data_copy.txt
- 比较文件并查看两者是否相同
- $ md5 /usr/bin/data_copy.txt /usr/home/Desktop/data.txt
递归删除 示例 - hadoop fs -rmr /user/sonoo/
HDFS 其他命令以下用于命令中 "<path>" 表示任何文件或目录名称。 "<path>..." 表示一个或多个文件或目录名称。 "<file>" 表示任何文件名。 "<src>" 和 "<dest>" 是定向操作中的路径名。 "<localSrc>" 和 "<localDest>" 是如上的路径,但在本地文件系统上 - put <localSrc><dest>
将由 localSrc 标识的本地文件系统中的文件或目录复制到 DFS 中的 dest。 - copyFromLocal <localSrc><dest>
与 -put 相同 - copyFromLocal <localSrc><dest>
与 -put 相同 - moveFromLocal <localSrc><dest>
将由 localSrc 标识的本地文件系统中的文件或目录复制到 HDFS 中的 dest,然后在成功后删除本地副本。 - get [-crc] <src><localDest>
将由 src 标识的 HDFS 中的文件或目录复制到由 localDest 标识的本地文件系统路径。 - cat <filen-ame>
在标准输出上显示文件名的内容。 - moveToLocal <src><localDest>
工作方式类似于 -get,但在成功后删除 HDFS 副本。 - setrep [-R] [-w] rep <path>
将由路径标识的文件目标复制因子设置为 rep。(实际复制因子将随着时间的推移朝着目标移动) - touchz <path>
在路径处创建一个文件,其中包含当前时间作为时间戳。如果路径处已存在文件,则会失败,除非该文件已为大小 0。 - test -[ezd] <path>
如果路径存在;具有零长度;或者是目录,则返回 1,否则返回 0。 - stat [format] <path>
打印有关路径的信息。Format 是一个字符串,它接受文件大小(以块为单位)(%b)、文件名 (%n)、块大小 (%o)、复制 (%r) 和修改日期 (%y, %Y)。
|