HDFS结构体系和核心流程分析

近年来,随着大数据行业的兴起,hadoop在技术圈内也混得风生水起。hadoop起源于谷歌关于处理大数据量的计算和存储的两篇论文,遵循分而治之,优先计算的思想设计。个人感觉hadoop在计算的思想上跟Java中的fork-join框架很相似。

hadoop包含hadoop common、HDFS、MapReduce这三个组件。HDFS是基于Master-Slave实现的分布式文件系统,Master是NameNode,Slave是DataNode。

1. NameNode

NameNode基于内存,不会与磁盘发生数据交换,收集DataNode汇报的Block块信息。NameNode基于内存存储必然涉及到数据持久化,它采用数据快照+日志记录的方式实现节点数据的持久化。NameNode会定时生成一个数据快照文件fsimage,同时会将所有的操作日志记录到edits文件,通过这两个文件的相互辅助便可实现数据的恢复。

2. SecondaryNameNode

SecondaryNameNode可以看成是辅助角色。随着集群运行的时间越来越久,edits日志文件会记录很多数据,比如,集群运行了1年,edits保存了1年的操作记录,数据恢复时,需要再用1年时间才能跑完所有的edits操作记录,这显然是不现实的。

SecondaryNameNode便是做合并日志文件处理,可以将数据快照文件fsimage与edits合并成一个新的fsimage。可以通过设定阈值(默认64M)或定时的方式实现,持久化机制跟Redis的持久化机制很像。

值得注意的是,HDFS2.x在设计上已经取消改节点,转而将处理的工作交由NamNode从节点处理。

3. Block块

HDFS会将存储的数据分成多个Block快进行存储,例如10GB可以分成多个64MB的数据块存储。对于一个文件拆分的每个块的大小都是相同的,每一个Block块会有与之对应的2个副本的存在,主要是为了提高系统的容错性。



拆分规则是以字节为单位,而一个汉字则是2个字节,拆分成多个Block块,有可能就会涉及到一个汉字被分割在不同的块。对此HDFS在读取的时候有相应的补偿机制,感兴趣的可自行了解。

4. DataNode

DataNode本地磁盘目录存储数据,定时向NameNode汇报Block块信息,HDFS设计存储在廉价机器上,因此也实现了一些校验数据和故障转移的策略。

故障转移:超过一定时间NameNode没有接收到DataNode的数据就认为改节点G了,就会copy上面的数据到其他DataNode
文件校验:DataNode会保存一份存储在自己节点上Block的元数据MD5加密文件,用作文件读取时候的对比

HDFS是基于分布式架构进行设计,能提供高容错,Block副本丢失后会自动恢复,适合大数据处理。但与之对应的,它无法实现低延迟数据访问,无法并发的写入和任意修改,只能是append,不适合小文件存储(小文件存储会在NameNode节点中存储比较多信息,浪费资源)。

HDFS2.x采用zookeeper实现NameNode主从节点选举,切换,监控;采用JournalNode集群共享NameNode节点的日志数据;DataNode则向主NameNode汇报。结构大体如下图:



以上大体了解了HDFS结构体系和组成元素,再介绍一下HDFS的核心功能(读写流程)。

5. 写流程

HDFS通过客户端写入文件,会先向NameNode申请存储Block块的路径,通过FSDataOutputStream将文件写入到对应的DataNode节点并通过ack确认数据写入成功。此时客户端已完成写入操作,但DataNode会遵循Block副本的放置策略,将Block数据另外同步给其他两个节点。大体流程如下图:


6. 读流程

HDFS通过客户端读取文件,会先访问NameNode,获取文件Block块的放置信息,再直接访问对应DataNode获取文件数据。大体流程如下:


小结

以上便是”关于HDFS结构体系和核心读写的介绍“的所有内容。如果您有什么疑问或者文章有什么问题,欢迎私信或留言交流~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章