什么是 HDFS

17 Mar 2025 | 4 分钟阅读

Hadoop 自带一个分布式文件系统,称为 HDFS。在 HDFS 中,数据分布在多台机器上,并进行复制,以确保其持久性,防止故障,并为并行应用程序提供高可用性。

它经济高效,因为它使用商品硬件。它涉及块、数据节点和节点名称的概念。

HDFS 的适用场景

  • 非常大的文件:文件应为数百兆字节、千兆字节或更大。
  • 流式数据访问:读取整个数据集的时间比读取第一个数据的延迟更重要。HDFS 构建在“一次写入,多次读取”的模式之上。
  • 商品硬件:它运行在低成本硬件上。

HDFS 的不适用场景

  • 低延迟数据访问:需要非常短的时间来访问第一个数据的应用程序不应使用 HDFS,因为它更重视整个数据而不是获取第一个记录的时间。
  • 大量小文件:名称节点包含文件中继数据,如果文件很小,则会占用名称节点的大量内存,这是不可行的。
  • 多次写入:当我们必须多次写入时,不应使用它。

HDFS 概念

  1. 块:块是可以读取或写入的最小数据量。默认情况下,HDFS 块为 128 MB,这是可配置的。HDFS 中的文件被分解为块大小的块,这些块存储为独立单元。与文件系统不同,如果 HDFS 中的文件小于块大小,则它不占用完整的块大小,即存储在块大小为 128 MB 的 HDFS 中的 5 MB 文件仅占用 5MB 的空间。HDFS 块大小很大,只是为了最大限度地降低寻道的成本。
  2. 名称节点:HDFS 以主-从模式工作,其中名称节点充当主节点。名称节点是 HDFS 的控制器和管理器,因为它知道 HDFS 中所有文件的状态和元数据;元数据信息包括文件权限、名称和每个块的位置。元数据很小,因此它存储在名称节点的内存中,从而可以更快地访问数据。此外,多个客户端并发访问 HDFS 集群,因此所有这些信息都由单个机器处理。文件系统操作(如打开、关闭、重命名等)由它执行。
  3. 数据节点:它们在客户端或名称节点的指令下存储和检索块。它们定期向名称节点报告,其中包含它们正在存储的块列表。数据节点作为商品硬件,还执行名称节点指示的块创建、删除和复制工作。

HDFS 数据节点和名称节点图

HDFS DataNode NameNode

HDFS 读取图

HDFS Read

HDFS 写入图

HDFS Write

由于所有元数据都存储在名称节点中,因此它非常重要。如果它发生故障,则无法使用文件系统,因为无法知道如何从数据节点中存在的块重建文件。为了克服这个问题,出现了辅助名称节点的概念。

辅助名称节点:它是一台单独的物理机器,充当名称节点的助手。它执行定期检查点。它与名称节点通信并拍摄元数据的快照,这有助于最大限度地减少停机时间和数据丢失。

启动 HDFS

HDFS 应首先格式化,然后在分布式模式下启动。命令如下。

要格式化 $ hadoop namenode -format

要启动 $ start-dfs.sh

HDFS 基本文件操作

  1. 将数据从本地文件系统放入 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

  2. 将数据从 HDFS 复制到本地文件系统

    • $ hadoop fs -copyToLocal /user/test/data.txt /usr/bin/data_copy.txt
  3. 比较文件并查看两者是否相同

    • $ md5 /usr/bin/data_copy.txt /usr/home/Desktop/data.txt
  4. 递归删除

    • hadoop fs -rmr <arg>

    示例

    • 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)。

下一个主题HDFS 的特性