首页 理论教育 Hadoop分布式文件系统,助力云计算

Hadoop分布式文件系统,助力云计算

时间:2023-11-26 理论教育 版权反馈
【摘要】:HDFS作为Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的。它和现有的分布式文件系统有很多共同点。元数据节点和数据节点①元数据节点用来管理文件系统的命名空间。2)HDFS文件读操作流程客户端通过调用FileSystem对象的open()函数来打开希望读取的文件。对于HDFS来说,这个对象是分布式文件系统的一个实例。与此同时,数据节点主动向元数据节点汇报所存储文件块的位置信息。

Hadoop分布式文件系统,助力云计算

HDFS(Hadoop Distributed File System)作为Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的。它和现有的分布式文件系统有很多共同点。同时,它和其他的分布式文件系统的区别也是很明显的:HDFS是一个高度容错性的系统,适合部署在廉价的机器上;HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用;HDFS放宽了一部分POSIX约束来实现流式读取文件系统数据的目的。

1)HDFS的基本概念

(1)数据块(block)

①HDFS默认的最基本的存储单位是64 MB的数据块。

②和普通文件系统相同的是,HDFS中的文件是被分成每块64 MB的数据块存储的。

③不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。

(2)元数据节点(Namenode)和数据节点(Datanode)

①元数据节点用来管理文件系统的命名空间。其将所有的文件和文件夹的元数据保存在一个文件系统树中。这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit log)。其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成。

②数据节点是文件系统中真正存储数据的地方。客户端或者元数据信息可以向数据节点请求写入或者读出数据块。其周期性地向元数据节点回报其存储的数据块信息。

③从元数据节点(Secondary namenode)。从元数据节点并不是元数据节点出现问题时的备用节点,它和元数据节点负责不同的事情。其主要功能就是周期性地将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。这点在下面会详细叙述。合并过后的命名空间镜像文件也在从元数据节点保存了一份,以便在元数据节点失败的时候恢复。

2)HDFS文件读操作流程

客户端通过调用FileSystem对象的open()函数来打开希望读取的文件。对于HDFS来说,这个对象是分布式文件系统的一个实例。Distributed FileSystem通过RPC协议来调用元数据节点,以确定文件开头部分的块位置。对于每一个数据块,元数据节点返回具有该块副本的数据节点的地址。Distributed FileSystem返回一个FSData InputStream对象给客户端,用来读取数据,FSData InputStream转而包装成一个DFS InputStream对象。客户端调用stream的read()函数开始读取数据。DFS InputStream连接保存此文件第一个数据块的最近的数据节点。Data从数据节点读到客户端,当此数据块读取完毕时,DFS InputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。当客户端读取完毕数据的时候,调用FSData InputStream的close()函数。在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。

HDFS文件读操作流程如图6-10所示。

图6-10 HDFS文件读操作流程

3)HDFS文件写操作流程(www.xing528.com)

客户端通过在Distributed FileSystem中调用create()函数来创建文件。Distributed FileSystem使用RPC去调用元数据节点,在HDFS命名空间创一个新的文件。HDFS返回一个文件系统数据输出流FSData OutputStream,让客户端开始写入数据。FSData OutputStream控制一个DFSOutputStream,负责处理数据节点和元数据节点之间的通信。客户端写入数据时,DFSOutputStream将文件切分成一个个的block,每个block又分成一个个数据包写入数据队列。数据队列在数据节点管线中流动。对于任意一个数据包,首先写入管线中第一个数据节点,第一个节点会存储包并且发送给管线中的第二个数据节点。同样地,第二个数据节点存储包并且传给管线中的第三个数据节点。与此同时,客户端会将当前block的下一个包发给第一个数据节点。DFSOutputStream也有一个内部的包队列来等待数据节点收到确认。一个Block只有其所有的包在被管线中所有的节点确认后才会被移除出确认队列。客户端完成数据的写入后,就会在流中调用close()函数,向元数据节点发送写文件已经完成的消息。与此同时,数据节点主动向元数据节点汇报所存储文件块的位置信息。

HDFS文件写操作流程如图6-11所示。

图6-11 HDFS文件写操作流程

4)HDFS的优缺点

(1)优点

①高容错性。数据自动保存多个副本,通过增加副本的形式,提高容错性;副本丢失后检测故障快速,自动恢复。

②适合批处理。通过移动计算而不是移动数据;会把数据位置暴露给计算框架;数据访问的高吞吐量;运行的应用程序对其数据集进行流式访问。

③适合大数据处理。处理数据达到GB、TB级别,甚至PB级别;能够处理百万规模以上的文件数量;能够达到10 000节点的规模。

④可构建在廉价的机器上。通过多副本机制提高可靠性;提供了容错和恢复机制,比如某一个副本丢失,可以通过其他副本来恢复。

(2)缺点

HDFS也有它的劣势,并不适合所有的场合:

①不适合低延迟的数据访问。HDFS涉及更多的是批处理,而不是用户交互使用。重点在于数据访问的高吞吐量,即在某一时间内写入大量的数据,而不是数据访问的低延迟。

②不适合小文件存取。存储大量小文件会占用NameNode大量的内存来存储文件、目录和块信息[这里的小文件是指小于HDFS系统的Block大小的文件(默认64 MB)];小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。

③无法并发写入、文件随即修改。一个文件只能有一个写,不允许多个线程同时写;仅支持数据append(追加),不支持文件随机修改。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈