首页 理论教育分布式数据库技术:HDF版本介绍

分布式数据库技术:HDF版本介绍

【摘要】:某一个副本丢失以后,它可以自动恢复,这是由HDFS内部机制实现的。小文件存储的(磁盘)寻道时间会超过读取时间,违反了HDFS的设计目标。HDFS如何存储数据。HDFS采用Master/Slave的架构来存储数据,这种架构主要由四部分组成,分别为Client、NameNode、DataNode和Secondary NameNode。图18.6HDFS的架构图NameNode:是一个主管、管理者,主要负责以下几方面的工作。HDFS如何写入文件,主要包括以下几步。

HDFS(Hadoop distributed file system)是Hadoop架构的核心,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具备的高容错性、高可靠性、高可扩展性、高获得性、高吞吐率等特征,为海量数据提供了不怕故障的存储,为超大数据集(large data set)的应用处理带来了很多便利。

HDFS源于Google公司在2003年10月份发表的GFS(Google file system)论文。它其实就是GFS的一个克隆版本。

大家之所以热衷于选择用HDFS存储数据,因为HDFS具有以下优点。

(1)高容错性。数据自动保存多个副本。它通过增加副本的形式,提高容错性。某一个副本丢失以后,它可以自动恢复,这是由HDFS内部机制实现的。

(2)适合批处理。它迁移计算而不是移动数据。它会把数据位置暴露给计算框架

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

(4)流式文件访问。一次写入,多次读取。文件一旦写入,就不能修改,只能追加。

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

当然,HDFS也有缺点,主要包括以下几方面。

(1)低延时的数据访问。低延时(如毫秒级)地存储数据、毫秒级以内读取数据是很难做到的。它适合高吞吐率的场景,就是在某一时间内写入大量的数据。

(2)小文件存储。存储大量小文件(小文件是指小于HDFS系统的块大小的文件(默认为64 MB))的话,会占用NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存是有限的。小文件存储的(磁盘)寻道时间会超过读取时间,违反了HDFS的设计目标。

(3)并发写入,文件随机修改。一个文件只能有一个写操作,不允许多个线程同时写。仅支持数据追加(append),不支持文件的随机修改。

(4)HDFS如何存储数据。

HDFS采用Master/Slave的架构来存储数据(见图18.6),这种架构主要由四部分组成,分别为Client、NameNode、DataNode和Secondary NameNode。

(1)Client:就是客户端,主要功能主要包括以下几方面。

●文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的块,然后进行存储。

●与NameNode交互,获取文件的位置信息。

●与DataNode交互,读取或者写入数据。

●Client提供一些命令来管理HDFS,比如启动或者关闭HDFS。

●Client可以通过一些命令来访问HDFS。

(www.chuimin.cn)

图18.6 HDFS的架构图

(2)NameNode:是一个主管、管理者,主要负责以下几方面的工作。

●管理HDFS的名称空间。

●管理数据块映射信息。

●配置副本策略。

●处理客户端读/写请求。

(3)DataNode:就是slave。NameNode下达命令,DataNode执行实际的操作。它主要负责以下几方面的工作。

●存储实际的数据块。

●执行数据块的读/写操作。

(4)Secondary NameNode:系统中往往会设置Secondary NameNode。这并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务,但能辅助NameNode,分担其工作任务。

HDFS如何写入文件,主要包括以下几步。

●客户端通过调用类Distributed FileSystem的create方法,创建一个新的文件。

●DistributedFileSystem通过RPC(远程过程调用)调用NameNode,去创建一个没有块关联的新文件。创建前,NameNode会做各种校验,比如文件是否存在、客户端有无权限去创建等。如果通过校验,NameNode就会记录下新文件,否则就会给出I/O异常消息。

●前两步结束后会返回FSDataOutputStream对象,与读文件相似,FSDataOutputStream被封装成DFSOutputStream,DFSOutputStream可以协调NameNode和Data Node。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切分成一个个小数据包(packet),然后排成数据队列(data queue)。

●DataStreamer会去处理数据队列(data queue),先询问NameNode这个新的块最适合存储在哪几个Data Node里,比如重复数是3,那么就找到3个最适合的Data Node,把它们排成一个流水线(pipeline)。DataStreamer把数据包按队列输出到管道的第一个DataNode中,第一个Data Node又把数据包输出到第二个DataNode中,依此类推。

●DFSOutputStream还有一个队列叫ack队列,也是由数据包组成的,等待Data Node收到并响应,当流水线中的所有Data Node都表示已经收到的时候,这时ack队列才会把对应的数据包移除掉。

●客户端完成写数据后,调用close方法关闭写入流。

●DataStreamer把剩余的包都输入到流水线里,然后等待ack信息,收到最后一个ack后,通知Data Node将文件标示为已完成。

NameNode如何选择在哪个Data Node存储副本(replication)?需要对可靠性、写入带宽和读取带宽进行权衡。