HDFS的架构及原理

  HDFS(Hadoop Distributed File System)是Hadoop核心组成之一,是分布式计算中数据存储管理的基础,被设计成适合运行在通用硬件上的分布式文件系统。HDFS架构中有两类节点,一类是NameNode,又叫“元数据节点”,另一类是DataNode,又叫“数据节点”,分别执行Master和Worker的具体任务。HDFS是一个(Master/Slave)体系结构,“一次写入,多次读取”。HDFS的设计思想:分而治之—将大文件、大批量文件分布式存放在大量独立的机器上。

 

一、HDFS的优缺点

优点:

  1、高容错性。数据保存多个副本,通过增加副本的形式提高容错性,某个副本丢失后,它可以通过其它副本自动恢复。

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

  3、流式文件访问。一次写入多次读取,文件一旦写入不能修改,只能追加,保证数据一致性。

  4、可构建在廉价机器上。通过多副本机制提高可靠性,提供容错和恢复机制。

缺点(不适用HDFS的场景):

  1、低延时数据访问。做不到毫秒级存储数据,但是适合高吞吐率(某一时间内写入大量的数据)的场景。

  2、小文件存储。存储大量小文件会占用NameNode大量的内存来存储文件、目录和块信息。

  3、并发写入、随机读写。一个文件不允许多个线程同时写,仅支持数据追加,不支持文件的随机修改。

 

二、HDFS存储架构

数据存储架构图:

HDFS采用Master/Slave的架构存储数据,由HDFS Client、NameNode、DataNode和Secondary NameNode四部分组成。

Client:客户端

  1、文件切分。文件上传HDFS时,Client按照Block大小切分文件,然后进行存储

  2、与NameNode交互,获取文件位置信息

  3、与DataNode交互,读取或写入数据

  4、Client提供一些命令管理和访问HDFS

NameNode:Master(管理者)

  1、管理HDFS的名称空间

  2、管理数据块(Block)映射信息

  3、配置副本策略

  4、处理客户端读写请求

DataNode:Slave(NN下达命令执行实际的操作)

  1、存储实际的数据块

  2、执行数据块的读/写操作

Secondary NameNode:并非NameNode的热备,当NN停止服务时,它并不能马上替换NN并提供服务

  1、辅助NN,分担其工作量

  2、定期合并fsimage和fsedits,并推送给NN

  3、在紧急情况下,可辅助恢复NN

 

三、HDFS数据读写

文件读取步骤:

  1、首先调用FileSystem的open方法获取一个DistributedFileSystem实例。

  2、DistributedFileSystem通过RPC(远程过程调用)获得文件的第一批block的locations,同一个block按照重复数返回多个locations,这些locations按照Hadoop拓扑结构排序,按照就近原则进行排序。

  3、前两步结束后会返回一个FSDataInputStream对象,通过调用read方法时,该对象会找出离客户端最近的DataNode并连接。

  4、数据从DataNode源源不断地流向客户端。

  5、如果第一个block块数据读取完成,就会关闭指向第一个block块的DataNode连接,接着读取下一个block块。

  6、如果第一批blocks读取完成,FSDataInputStream会向NN获取下一批blocks的locations,然后重复4、5步骤,直到所有blocks读取完成,这时就会关闭所有的流。

文件写入步骤:

  1、客户端通过调用DistributedFileSystem的create方法,创建一个新文件。

  2、DistributedFileSystem通过RPC(远程过程调用)调用NameNode,去创建一个没有blocks关联的新文件。创建前,NN会进行各种校验,如果校验通过,NN就会记录下新文件,否则抛出I/O异常。

  3、前两步结束后会返回一个FSDataOutputStream对象,客户端开始写数据到FSDataOutputStream,FSDataOutputStream会把数据切成一个个小packet,然后排成data queue。

  4、DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。

  5、DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。

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

  7、DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 NameNode 把文件标示为已完成。

  RackAware机架感知功能:

  1、若client为DataNode节点,那存储block时,规则为:副本1存储在同client的节点上;副本2存储在不同机架节点上;副本3同第副本2机架的另外一个节点上;其它副本随机挑选。

  2、若client不为DataNode节点,那存储block时,规则为:副本1随机选择一个节点;副本2存储在不同于副本1的机架节点;副本3同副本2所在机架的另一个节点;其它副本随机挑选。

posted @ 2018-10-22 11:44  firstwin  阅读(4301)  评论(0编辑  收藏  举报