2023年6月29日发(作者:)
⼤数据⽣态系统基础:Hadoop(三):Hadoop3.0.0HDFS体系结构⼀、介绍 Hadoop分布式⽂件系统(HDFS)是⼀种分布式⽂件系统,设计⽤于在商品硬件上运⾏。它与现有的分布式⽂件系统有许多相似之处。但是,与其他分布式⽂件系统的区别是显著的。HDFS是⾼度容错的,并且被设计⽤于低成本硬件上。HDFS提供对应⽤程序数据的⾼吞吐量访问,适⽤于具有⼤型数据集的应⽤程序。HDFS放宽了⼀些POSIX要求,以⽀持对⽂件系统数据的流访问。HDFS最初是作为ApacheNutch 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。⼀个检查点可以在给定的时间间隔触发()表⽰在⼏秒钟内,或在给定⽂件系统交易之后积累了()。如果设置了这两个属性,那么要达到的第⼀个阈值就会触发⼀个检查点。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。
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687986216a64003.html
评论列表(0条)