HDFS原理理解(一) 基本数据存储和读写

1、HDFS简介:

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件上的分布式文件系统。HDFS有三类节点,一类是NameNode,又名“名称节点/元数据节点”;另一类是DataCode(数据节点),还有一个是Secondary NameCode(第二名称节点)

物理磁盘中有块的概念,磁盘的物理Block是磁盘操作最小的单元,读写操作均以Block为最小单元,一般为512 Byte。HDFS的Block块比一般单机文件系统大得多,默认为128M。HDFS的文件被拆分成block-sized的chunk,chunk作为独立单元存储。比Block小的文件不会占用整个Block,只会占据实际大小。例如, 如果一个文件大小为1M,则在HDFS中只会占用1M的空间,而不是128M。

HDFS的Block为什么这么大? 
是为了最小化查找(seek)时间,控制定位文件与传输文件所用的时间比例。假设定位到Block所需的时间为10ms,磁盘传输速度为100M/s。如果要将定位到Block所用时间占传输时间的比例控制1%,则Block大小需要约100M。 
但是如果Block设置过大,在MapReduce任务中,Map或者Reduce任务的个数 如果小于集群机器数量,会使得作业运行效率很低。
    

2、HDSF架构设计

è¿éåå¾çæè¿°

角色分配

  • HDFS原理理解(一) 基本数据存储和读写_第1张图片

Client:客户端,系统使用者,调用HDSF API操作文件,与NameNode交互获取文件元数据,与DateNode交互进行数据读写。

NameNode

          存储:

               1)文件系统的命名空间,文件名称,文件目录结构,文件的属性(权限、创建时间、副本数

               2)文件对应哪些数据块,数据块对应哪些dataNode节点。

               3)nameNode节点不会持久的存储这种映射关系,是通过集群在启动和运行时,datanode定时发送BlockReport给NameNode,从此NameNode在内存中动态维护这种映射关系。

        作用:管理文件系统的命名空间,它维护着文件系统数以及整颗数的所有文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件fsImage和编辑日志文件editlog.

         高可用:采用HA的HDFS集群配置两个NameNode,分别处于Active和Standby状态。当Active NameNode故障之后,Standby接过责任继续提供服务,用户没有明显的中断感觉。一般耗时在几十秒到数分钟。 

DataNode:

        存储:

              1) 数据块和数据块校验和

              2)与NameNode通信:每隔3秒发送一个心跳包,每10次心跳发送一次blockReport。

        作用:读写文件的数据快。 

SecondaryNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。

        存储:fsImage+editLog。

        作用:

             1)辅助 NameNode,分担其工作量。

             2)定期合并fsimage+editlog文件作为新的fsimage推送给nameNode,俗称检查点动作,checkpoint。

             3)在紧急情况下,可辅助恢复 NameNode。

        参数:fs.checkpoint.period->1h    fs.checkpoint.size->64M          

角色定位:

HDFS原理理解(一) 基本数据存储和读写_第2张图片

客户端:负责文件切割

NameNode:为数据库分配DN地址

DataNode:存储数据,并将数据冗余备份到多个DataNode中。

文件写入流程

用户向客户端发送请求:

HDFS原理理解(一) 基本数据存储和读写_第3张图片

用户在写入请求的时候,需要设定文件的分割大小以及备份文件大小。

文件切分:

               Client根据用户的需求,将文件分割成多份

HDFS原理理解(一) 基本数据存储和读写_第4张图片

文件分配:

                 然后Client去NameNode请求,NameNode通过计算出N个分配的DateNode地址(通过举例进行了排序,优先本地磁盘上有一个)。

HDFS原理理解(一) 基本数据存储和读写_第5张图片

数据写入:

        Client根据NameNode提供的地址,开始写入数据块,当第一个DataNode接收到地址的时候,会按照距离的顺序会依次同步数据。

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

HDFS原理理解(一) 基本数据存储和读写_第6张图片

写入成功

              当每个DataNode完成数据写入后,都会向NameNode发送通知,告知自己写完了数据。

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

HDFS原理理解(一) 基本数据存储和读写_第7张图片

文件读取流程

HDFS采用的是“一次写入多次读取”的文件访问模型,一个文件经过创建、写入和关闭之后,就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为了可能

HDFS原理理解(一) 基本数据存储和读写_第8张图片

用户需求:

HDFS原理理解(一) 基本数据存储和读写_第9张图片

客户端向NameNode发送请求:

HDFS原理理解(一) 基本数据存储和读写_第10张图片

NameNode返回该文件的部分或者全部的block列表:

         Client获得文件的第一批block的locations,同一block按照重复数会返回多个locations,这些locations按照Hadoop拓扑结构排序,距离客户端近的排在前面。

HDFS原理理解(一) 基本数据存储和读写_第11张图片

读取数据(就近原则)

HDFS原理理解(一) 基本数据存储和读写_第12张图片

 

注意:在读取的时候,如果client与datanode通信时遇到一个错误,那么它就会去尝试对这个块来说下一个最近的块。它也会记住那个故障节点的datanode,以保证不会再对之后的块进行徒劳无益的尝试。client也会确认datanode发来的数据的校验和。如果发现一个损坏的块,它就会在client试图从别的datanode中读取一个块的副本之前报告给namenode。 
总结:这个设计的一个重点是,client直接联系datanode去检索数据,并被namenode指引到块中最好的datanode。因为数据流在此集群中是在所有datanode分散进行的。所以这种设计能使HDFS可扩展到最大的并发client数量。同时,namenode只不过提供块的位置请求(存储在内存中,十分高效),不是提供数据。否则如果客户端数量增长,namenode就会快速成为一个“瓶颈”。

 

 

你可能感兴趣的:(大数据学习)