大数据生态系统基础:Hadoop(三):Hadoop 3.0.0 HDFS 体系结构

一、介绍

      Hadoop分布式文件系统(HDFS)是一种分布式文件系统,设计用于在商品硬件上运行。它与现有的分布式文件系统有许多相似之处。但是,与其他分布式文件系统的区别是显著的。HDFS是高度容错的,并且被设计用于低成本硬件上。HDFS提供对应用程序数据的高吞吐量访问,适用于具有大型数据集的应用程序。HDFS放宽了一些POSIX要求,以支持对文件系统数据的流访问。HDFS最初是作为Apache Nutch web搜索引擎项目的基础设施构建的。HDFS是Apache Hadoop核心项目的一部分。

      假设和实现目标

     1、硬件失效

     硬件故障是常态,而不是异常。HDFS实例可能由数百台或数千台服务器机器组成,每个服务器都存储文件系统数据的一部分。事实上,有大量的组件,并且每个组件都有一个非平凡的失败概率,这意味着HDFS的某些组件总是非功能性的。因此,对故障的检测和快速、自动的恢复是HDFS的核心架构目标。

    2、流数据访问

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

   3、大数据集

     运行在HDFS上的应用程序有大量的数据集。HDFS中典型的文件大小是千兆字节到tb级。因此,HDFS被调优以支持大文件。它应该为单个集群中的数百个节点提供高的聚合数据带宽和规模。它应该在一个实例中支持数千万个文件。

   4、简单的一致性模型

     HDFS应用程序需要一个对文件进行一个“写一次读多次”的访问模型。一个文件一旦被创建、被写入和被关闭,是不需要更改,除非被添加和截取。将内容附加到文件的末尾是受支持的,但是不能在任意点修改。这个假设简化了数据一致性问题,并支持高吞吐量的数据访问。MapReduce应用程序或web爬虫程序应用程序非常适合这个模型。

   5、“移动计算比移动数据更便宜”

     应用程序请求的计算如果在它所操作的数据附近执行,则效率更高。当数据集的大小非常大时,这一点尤其正确。这可以最小化网络拥塞,并增加系统的总体吞吐量。这样做的假设是,将计算迁移到数据所在的位置,而不是将数据转移到应用程序所在的位置,通常会更好。HDFS为应用程序提供了接口,使其更接近数据所在的位置。

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

    HDFS被设计成可以方便地从一个平台移植到另一个平台。这有助于广泛地采用HDFS作为一组大型应用程序的选择平台。


二、NameNode 和 dataNodes

     如图所示

         HDFS有一个主/从架构。HDFS集群由一个单独的NameNode和一个 master 服务器组成,master 服务器管理文件系统名称空间,并控制客户端对文件的访问。此外,还有一些DataNodes,通常是集群中的每个节点,它们管理与它们运行的节点相关联的存储。HDFS公开文件系统名称空间,并允许用户数据存储在文件中。在内部,一个文件被分割成一个或多个块,这些块被存储在一组DataNodes中。NameNode执行文件系统命名空间操作,比如打开、关闭和重命名文件和目录。它还决定了块的映射到DataNodes。DataNodes负责从文件系统的客户端提供读和写请求。DataNodes还在来自NameNode的指令下执行块创建、删除和复制。



       NameNode和DataNode是用于在商用机器上运行的软件的一部分。这些机器通常运行gnu/linux操作系统(OS)。HDFS是用Java语言构建的;任何支持Java的机器都可以运行NameNode或DataNode软件。高度可移植的Java语言的使用意味着可以在广泛的机器上部署HDFS。典型的部署有一个专用的机器,它只运行NameNode软件。集群中的其他机器都运行DataNode软件的一个实例。该体系结构并不排除在同一台机器上运行多个DataNodes,但在实际部署中很少出现这种情况。


     集群中单个NameNode的存在极大地简化了系统的体系结构。NameNode是所有HDFS元数据的仲裁者和存储库。系统的设计方式是,用户数据永远不会通过NameNode。


三、文件系统 NameSpace

    HDFS支持传统的分层文件组织。用户或应用程序可以在这些目录中创建目录和存储文件。文件系统命名空间层次结构与大多数其他现有的文件系统相似;您可以创建和删除文件,将文件从一个目录移动到另一个目录,或者重命名一个文件。HDFS支持用户配额和访问权限。HDFS不支持硬链接或软链接。但是,HDFS体系结构并不排除实现这些特性的可能。


     NameNode维护文件系统名称空间。任何对文件系统名称空间或其属性的更改都是由NameNode记录的。应用程序可以指定应该由HDFS维护的文件的副本数量。一个文件的拷贝数被称为该文件的复制因子。这个信息是由NameNode存储的。


四、数据复制

      HDFS被设计用来在大型集群中的机器上可靠地存储非常大的文件。它将每个文件存储为一个块序列。一个文件的块被复制用于容错。每个文件的块大小和复制因子是可配置的。


      除了最后一个块之外,文件中的所有块都是相同的大小,而用户可以在添加到附加和hsync之后,在不填充最后一个块的情况下,开始一个新的块,而不需要将最后一个块填充到配置的块大小。


      应用程序可以指定文件的副本数量。复制因子可以在文件创建时指定,并且可以在以后更改。HDFS中的文件是写一次的(除了应用程序和截尾),并且在任何时候都有一个严格的写入器。

NameNode做出关于复制块的所有决策。它定期接收集群中的每个DataNodes的心跳和阻塞报告。收到心跳意味着DataNode功能正常。一个Blockreport包含一个DataNode的所有块的列表。

1、复制放置:第一个婴儿步骤

        副本的放置对于HDFS的可靠性和性能是至关重要的。优化复制位置可以将HDFS与大多数其他分布式文件系统区分开来。这是一个需要大量调优和体验的特性。一个机架式的复制放置策略的目的是提高数据的可靠性、可用性和网络带宽利用率。复制放置策略的当前实现是在这个方向上的第一次尝试。实现此策略的短期目标是在生产系统上验证它,了解更多关于其行为的知识,并为测试和研究更复杂的策略建立一个基础。


      大型的HDFS实例运行在一个通常分布在多个机架的计算机集群上。不同机架中的两个节点之间的通信必须通过交换机。在大多数情况下,同一机架中的机器之间的网络带宽大于不同机架间的机器之间的网络带宽。


       NameNode确定每个DataNode的机架id,通过Hadoop机架感知中概述的过程。一个简单但不理想的策略是将副本放置在唯一的机架上。这可以防止在整个机架出现故障时丢失数据,并允许在读取数据时使用多个机架的带宽。该策略均匀地分布在集群中的副本,这使得在组件故障时平衡负载很容易。但是,这种策略增加了写操作的成本,因为写需要将块转移到多个机架。


      常见的情况,当复制因子三,HDFS的安置政策是将一个副本在本地机器上如果作者是一个datanode,否则随机datanode,另一个副本在一个节点上不同的(远程)架,最后在一个不同的节点在同一远程机架。这个策略减少了机架间的写流量,这通常会提高写性能。发生故障的可能性比节点故障少得多;该策略不会影响数据的可靠性和可用性。但是,它确实减少了读取数据时所使用的总网络带宽,因为一个块被放置在两个唯一的机架中,而不是三个。有了这个策略,文件的副本就不能均匀地分布在机架上。三分之一的副本在一个节点上,三分之二的副本位于一个机架上,其余的三分之二分布在其余的机架上。这种策略可以提高写性能,而不会影响数据的可靠性或读取性能。


       如果复制因子大于3,那么第4个和以下副本的位置是随机确定的,同时保持每个机架上的副本数量低于上限(基本上是(副本-1)/机架+2)。


     由于NameNode不允许DataNodes拥有相同块的多个副本,因此创建的最大副本数量是当时的DataNodes的总数。


       在将存储类型和存储策略的支持添加到HDFS之后,NameNode除了上面描述的机架感知之外,还将该策略考虑到复制位置。NameNode首先选择基于机架感知的节点,然后检查候选节点具有与该文件相关联的策略所需要的存储。如果候选节点没有存储类型,那么NameNode将查找另一个节点。如果在第一个路径中找不到足够的节点来放置副本,那么NameNode就会寻找第二个路径中有备用存储类型的节点。


         这里描述的当前缺省的复制放置策略是一个正在进行中的工作。

2、复制选择

   为了最小化全局带宽消耗和读取延迟,HDFS试图满足与读取器最接近的副本的读请求。如果在与reader节点相同的机架上存在一个副本,则该副本更适合于满足读取请求。如果HDFS集群跨越多个数据中心,那么在本地数据中心中驻留的副本比任何远程副本都更受欢迎。

3、安全模式

 在启动时,NameNode进入了一个名为Safemode的特殊状态。当NameNode处于Safemode状态时,数据块的复制不会发生。NameNode接收来自DataNodes的Heartbeat和Blockreport消息。一个Blockreport包含一个DataNode托管的数据块列表。每个块都有一个指定的最小数量的副本。当这个数据块的最小数量的副本与NameNode签入时,就可以安全地复制一个块。在使用NameNode(再加上30秒)安全复制的数据块进行安全复制后,NameNode将退出Safemode状态。然后,它确定数据块的列表(如果有的话),这些数据块的数量仍然少于指定的副本数量。NameNode然后将这些块复制到其他DataNodes。


五、文件系统元数据的持久性

HDFS命名空间是由NameNode存储的。NameNode使用一个名为EditLog的事务日志记录每一个发生在文件系统元数据中的变化。例如,在HDFS中创建一个新文件会导致NameNode将一个记录插入到指示该日志的EditLog中。类似地,更改文件的复制因子会导致将新记录插入到EditLog中。NameNode在其本地主机操作系统文件系统中使用一个文件来存储EditLog。整个文件系统命名空间,包括将块映射到文件和文件系统属性,都存储在一个名为FsImage的文件中。FsImage作为文件存储在NameNode的本地文件系统中。


NameNode保存了整个文件系统命名空间的图像,并在内存中文件Blockmap。当NameNode启动时,或者通过一个可配置的阈值触发一个检查点,它将从磁盘读取FsImage和EditLog,将所有的事务从EditLog应用到FsImage的内存中表示,并将这个新版本刷新到磁盘上的新FsImage中。然后它可以截断旧的EditLog,因为它的事务已经被应用到持久的FsImage。这个过程称为检查点。检查点的目的是通过获取文件系统元数据的快照并将其保存到FsImage,以确保HDFS对文件系统元数据具有一致的视图。尽管读取一个FsImage是有效的,但是直接对FsImage进行增量编辑是不有效的。我们不为每个编辑修改FsImage,而是在Editlog中持久化编辑。在检查点期间,来自Editlog的更改被应用到FsImage。一个检查点可以在给定的时间间隔触发(dfs.namenode.checkpoint.period)表示在几秒钟内,或在给定文件系统交易之后积累了(dfs.namenode.checkpoint.txns)。如果设置了这两个属性,那么要达到的第一个阈值就会触发一个检查点。


DataNode将HDFS数据存储在本地文件系统中的文件中。DataNode不知道HDFS文件。它在本地文件系统中的一个单独的文件中存储每个HDFS数据块。DataNode不会在同一目录中创建所有文件。相反,它使用启发式方法来确定每个目录的最佳文件数量,并适当地创建子目录。在同一个目录中创建所有本地文件不是最理想的,因为本地文件系统可能无法有效地支持单一目录中的大量文件。当DataNode启动时,它会扫描它的本地文件系统,生成所有与这些本地文件对应的HDFS数据块的列表,并将该报告发送到NameNode。这份报告被称为“封锁报告”。


六、通信协议

 所有的HDFS通信协议都是在协议的基础上进行的。客户端在NameNode机器上建立一个可配置TCP端口的连接。它用NameNode来讨论客户端协议。DataNodes使用DataNode协议与NameNode进行通信。远程过程调用(RPC)抽象封装了客户端协议和DataNode协议。根据设计,NameNode从不启动任何rpc。相反,它只响应由DataNodes或客户端发出的RPC请求。


七、鲁棒性

 HDFS的主要目标是在出现故障时可靠地存储数据。三种常见的故障类型是NameNode故障、DataNode故障和网络分区。

1、数据磁盘故障、心跳和重复复制


    每个DataNode都定期向NameNode发送一个心跳消息。网络分区可以导致DataNodes的一个子集失去与NameNode的连接。NameNode通过缺少心跳消息来检测该条件。NameNode在没有最近的心跳的情况下标记了datanode,并且没有向它们发送任何新的IO请求。任何注册到死DataNode的数据都不能再用于HDFS了。DataNode死亡可能会导致某些块的复制因子低于其指定的值。NameNode不断跟踪需要复制哪些块,并在需要时启动复制。重新复制的必要性可能由于许多原因而产生:一个DataNode可能变得不可用,一个副本可能被损坏,一个DataNode上的硬盘可能会失败,或者一个文件的复制因子可能会增加。


标记DataNodes死的时间很长(默认情况下超过10分钟),以避免因DataNodes的状态震荡而引起的复制风暴。用户可以设置较短的间隔,以标记DataNodes的陈旧,并避免通过配置对性能敏感的工作负载进行读/或写操作。


2、集群经济再平衡


HDFS体系结构与数据再平衡计划兼容。如果DataNode的空闲空间低于某个阈值,那么该方案可能会自动将数据从一个DataNode转移到另一个DataNode。如果某个特定文件突然出现高需求,那么该方案可能会动态地创建额外的副本,并重新平衡集群中的其他数据。这些类型的数据再平衡计划尚未实施。


3、数据完整性


从DataNode获取的数据块有可能被损坏。这种损坏可能是由于存储设备、网络故障或有缺陷的软件造成的。HDFS客户端软件实现了对HDFS文件内容的校验和检查。当客户机创建一个HDFS文件时,它计算每个文件块的校验和,并将这些校验和存储在同一个HDFS名称空间中的一个单独的隐藏文件中。当客户端检索文件内容时,它会验证从每个DataNode获取的数据与存储在相关的校验和文件中的校验和相匹配。如果没有,那么客户端可以选择从另一个具有该块副本的DataNode获取该块。


4、元数据磁盘故障


FsImage和EditLog是HDFS的中心数据结构。这些文件的损坏会导致HDFS实例的非功能性。因此,可以将NameNode配置为支持维护FsImage和EditLog的多个副本。对FsImage或EditLog的任何更新都将导致每个FsImage和edit日志同步更新。对FsImage和EditLog的多个副本的同步更新可能会降低NameNode可以支持的每秒名称空间事务的速度。但是,这种降级是可以接受的,因为即使HDFS应用程序在本质上是非常密集的,它们也不是元数据密集型的。当NameNode重新启动时,它将选择使用的最新一致的FsImage和EditLog。


另一种提高抗故障恢复能力的方法是使用多个名称空间来启用高可用性,要么使用NFS共享存储,要么使用分布式编辑日志(称为日志)。后者是推荐的方法。


5、快照


快照支持在特定的时间内存储数据的副本。快照特性的一个用法可能是将损坏的HDFS实例回滚到以前已知的一个好的点上。


八、数据组织

 1、数据块


HDFS被设计用来支持非常大的文件。与HDFS兼容的应用程序是处理大型数据集的。这些应用程序只写一次数据,但它们读了一遍或多次,并要求这些读取以流速度满足。HDFS支持在文件上的写一度读很多语义。HDFS使用的典型块大小是128 MB,因此,HDFS文件被分割成128 MB的块,如果可能的话,每个块都位于不同的DataNode上。


2、复制流水线


当一个客户端将数据写入到一个具有3个复制因子的HDFS文件时,NameNode使用一个复制目标选择算法来检索一个DataNodes列表。这个列表包含将会承载该块副本的DataNodes。然后客户端写入第一个DataNode。第一个DataNode开始接收部分数据,将每个部分写到本地存储库,并将该部分传输到列表中的第二个DataNode。第二个DataNode依次接收数据块的每个部分,将该部分写入到它的存储库,然后将该部分刷新到第三个DataNode。最后,第三个DataNode将数据写入本地存储库。因此,DataNode可以从管道的上一个管道接收数据,同时将数据转发到管道中的下一个数据。因此,数据从一个DataNode到下一个DataNode。



发布了52 篇原创文章 · 获赞 4 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/caridle/article/details/77386914