Hadoop 1.x - HDFS

介绍

HDFSHadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。


假设与目标

  • 硬件故障

硬件故障是正常现象,而非例外。HDFS实例可能包含数百或数千个服务器计算机,每个服务器计算机都存储文件系统数据的一部分。存在大量组件并且每个组件的故障概率都很低的事实意味着HDFS的某些组件始终无法运行。因此,检测故障并快速,自动地从故障中恢复是HDFS的核心目标。

  • 流数据访问

在HDFS上运行的应用程序需要对其数据集进行流式访问。它们不是通常在通用文件系统上运行的通用应用程序。HDFS设计用于批处理,而不是用户交互使用。重点在于数据访问的高吞吐量,而不是数据访问的低延迟。POSIX提出了许多针对HDFS的应用程序不需要的硬性要求。在一些关键领域中,POSIX语义已经被交易以提高数据吞吐率。

  • 大数据集

在HDFS上运行的应用程序具有大量数据集。HDFS中的典型文件大小为GB到TB。因此,HDFS已调整为支持大文件。它应提供较高的聚合数据带宽,并可以扩展到单个群集中的数百个节点。它应该在单个实例中支持数千万个文件。

  • 简单一致性模型

HDFS应用程序需要文件一次写入多次读取访问模型。一旦创建,写入和关闭文件,除了追加和截断外,无需更改。支持将内容追加到文件末尾,但不能在任意点更新。该假设简化了数据一致性问题并实现了高吞吐量数据访问。MapReduce应用程序或Web爬网程序应用程序非常适合此模型。

  • 移动计算比移动数据便宜

如果应用程序所请求的计算在其所操作的数据附近执行,则效率会更高。当数据集的大小巨大时,尤其如此。这样可以最大程度地减少网络拥塞,并提高系统的整体吞吐量。假设通常是将计算迁移到更靠近数据的位置,而不是将数据移动到应用程序正在运行的位置。HDFS为应用程序提供了接口,使它们自己更靠近数据所在的位置。

  • 跨异构硬件和软件平台的可移植性

HDFS的设计目的是可以轻松地从一个平台移植到另一个平台。这有助于将HDFS广泛用作大量应用程序的首选平台。

HDFS 设计原理

p1.png

2.1 HDFS 架构

HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成:

  • NameNode : 负责执行有关 文件系统命名空间 的操作,例如打开,关闭、重命名文件和目录等。它同时还负责集群元数据的存储,记录着文件中各个数据块的位置信息。
  • DataNode:负责提供来自文件系统客户端的读写请求,执行块的创建,删除等操作。

    文件系统命名空间

    HDFS 的 文件系统命名空间 的层次结构与大多数文件系统类似 (如 Linux), 支持目录和文件的创建、移动、删除和重命名等操作,支持配置用户和访问权限,但不支持硬链接和软连接。NameNode 负责维护文件系统名称空间,记录对名称空间或其属性的任何更改。

    数据复制

    由于 Hadoop 被设计运行在廉价的机器上,这意味着硬件是不可靠的,为了保证容错性,HDFS 提供了数据复制机制。HDFS 将每一个文件存储为一系列,每个块由多个副本来保证容错,块的大小和复制因子可以自行配置(默认情况下,块大小是 128M,默认复制因子是 3)。


    p2.png

数据复制的实现原理

大型的 HDFS 实例在通常分布在多个机架的多台服务器上,不同机架上的两台服务器之间通过交换机进行通讯。在大多数情况下,同一机架中的服务器间的网络带宽大于不同机架中的服务器之间的带宽。因此 HDFS 采用机架感知副本放置策略,对于常见情况,当复制因子为 3 时,HDFS 的放置策略是:
在写入程序位于 datanode 上时,就优先将写入文件的一个副本放置在该 datanode 上,否则放在随机 datanode 上。之后在另一个远程机架上的任意一个节点上放置另一个副本,并在该机架上的另一个节点上放置最后一个副本。此策略可以减少机架间的写入流量,从而提高写入性能。

如果复制因子大于 3,则随机确定第 4 个和之后副本的放置位置,同时保持每个机架的副本数量低于上限,上限值通常为 (复制系数 - 1)/机架数量 + 2,需要注意的是不允许同一个 dataNode 上具有同一个块的多个副本。

副本的选择

为了最大限度地减少带宽消耗和读取延迟,HDFS 在执行读取请求时,优先读取距离读取器最近的副本。如果在与读取器节点相同的机架上存在副本,则优先选择该副本。如果 HDFS 群集跨越多个数据中心,则优先选择本地数据中心上的副本。

架构的稳定性

心跳机制和重新复制

每个 DataNode 定期向 NameNode 发送心跳消息,如果超过指定时间没有收到心跳消息,则将 DataNode 标记为死亡。NameNode 不会将任何新的 IO 请求转发给标记为死亡的 DataNode,也不会再使用这些 DataNode 上的数据。 由于数据不再可用,可能会导致某些块的复制因子小于其指定值,NameNode 会跟踪这些块,并在必要的时候进行重新复制。

数据的完整性

由于存储设备故障等原因,存储在 DataNode 上的数据块也会发生损坏。为了避免读取到已经损坏的数据而导致错误,HDFS 提供了数据完整性校验机制来保证数据的完整性,具体操作如下:
当客户端创建 HDFS 文件时,它会计算文件的每个块的 校验和,并将 校验和 存储在同一 HDFS 命名空间下的单独的隐藏文件中。当客户端检索文件内容时,它会验证从每个 DataNode 接收的数据是否与存储在关联校验和文件中的 校验和 匹配。如果匹配失败,则证明数据已经损坏,此时客户端会选择从其他 DataNode 获取该块的其他可用副本。

元数据的磁盘故障

FsImageEditLog 是 HDFS 的核心数据,这些数据的意外丢失可能会导致整个 HDFS 服务不可用。为了避免这个问题,可以配置 NameNode 使其支持 FsImageEditLog 多副本同步,这样 FsImageEditLog 的任何改变都会引起每个副本 FsImageEditLog 的同步更新。

支持快照

快照支持在特定时刻存储数据副本,在数据意外损坏时,可以通过回滚操作恢复到健康的数据状态。

HDFS 的特点

高容错

由于 HDFS 采用数据的多副本方案,所以部分硬件的损坏不会导致全部数据的丢失。

高吞吐量

HDFS 设计的重点是支持高吞吐量的数据访问,而不是低延迟的数据访问。

大文件支持

HDFS 适合于大文件的存储,文档的大小应该是是 GB 到 TB 级别的。

简单一致性模型

HDFS 更适合于一次写入多次读取 (write-once-read-many) 的访问模型。支持将内容追加到文件末尾,但不支持数据的随机访问,不能从文件任意位置新增数据。

跨平台移植性

HDFS 具有良好的跨平台移植性,这使得其他大数据计算框架都将其作为数据持久化存储的首选方案。

附:图解HDFS存储原理

说明:以下图片引用自博客:翻译经典 HDFS 原理讲解漫画

HDFS写数据原理



p1-2.png

HDFS读数据原理

p5.png

HDFS故障类型和其检测方法

检测故障并快速,自动地从故障中恢复是HDFS的核心目标。

第二部分:读写故障的处理
p7.png
第三部分:DataNode 故障处理
p8.png
副本布局策略

HDFS shell

  • -ls
    查看目录
    hdfs dfs -ls /
  • -mkdir
    创建目录
    hdfs dfs -mkdir -p /aaa/bbb/cc/dd
  • -rm
    删除文件或文件夹
    hdfs dfs -rm -r /aaa/bbb/cc/dd
  • -rmdir
    删除空目录
    hdfs dfs -rmdir /aaa/bbb/cc/dd
  • -put
    hdfs dfs -put /opt/jdk-8u181-linux-x64.tar.gz /opt/
  • -get
    hdfs dfs -get /aaa/jdk.tar.gz
  • -cp
    从hdfs的一个路径拷贝hdfs的另一个路径
    hdfs dfs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
  • -count
    统计一个指定目录下的文件节点数量
    hdfs dfs -count /
  • -df
    统计文件系统的可用空间信息
    hdfs dfs -df -h /
  • -setrep
    设置hdfs中文件的副本数量
    hdfs dfs -setrep 3 /aaa/jdk.tar.gz

    difference between hdfs dfs and hadoop fs
    hadoop fs是一种更“通用”的命令,它使您可以与包括Hadoop在内的多个文件系统进行交互,而hdfs dfs该命令专用于HDFS。
    请注意,如果使用的文件系统是HDFS ,则hdfs dfs and hadoop fs命令成为同义词。实际上,如果您发出命令,它将告诉您该命令已被弃用,您应该改用hdfs dfs
    但是,当您调用这些命令时,实际文件将在hadoop安装目录的bin目录中执行。
    如果运行hdfs dfs命令,它将调用hadoop安装目录中bin目录中的hdfs文件,后跟第一个参数dfs 告诉hdfs命令我们要使用分布式文件系统(hdfs)而不是本地文件系统文件系统,这是默认选项。
    第二个命令hadoop fs。它将在hadoop安装目录的bin目录中调用hadoop文件。它将通过发送fs作为第一个参数来跟进该命令/文件。它会告诉“ HADOOP”,我们想要做的任何操作都应该在该特定群集(即HDFS)上由HADOOP安装管理的文件系统上完成。