HDFS产出背景及定义

1)HDFS产生背景

随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。

2)HDFS定义

HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

HDFS的使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。

 

hdfs分块存储计算 hdfs fencing_客户端

 

 

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、客户端通过调用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所在机架的另一个节点;其它副本随机挑选。