基于Hadoop的分布式文件系统
作者:陈忠义
来源:《电子技术与软件工程》2017年第09期
摘要HDFS是Hadoop应用用到的一个最主要的分布式存储系统,Hadoop分布式文件系统具有方便、健壮、可扩展性、容错性能好、操作简单、成本低廉等许多优势。
深入了解HDFS的工作原理对在特定集群上改进HDFS的运行性能和错误诊断都有极大的帮助。
本文介绍了HDFS的主要设计理念、主要概念及其高可靠性的实现等。
【关键词】Hadoop 分布式文件系统
Hadoop是新一代的大数据处理平台,在近十年中已成为大数据革命的中心,它不仅仅承担存储海量数据,还通过分析从中获取有价值信息。
进行海量计算需要一个稳定的,安全的数据容器,管理网络中跨多台计算机存储的文件系统称为分布式文件系统。
Hadoop分布式文件系统(Hadoop Distributed File System)运应而生,它是Hadoop的底层实现部分,存储Hadoop 集群中所有存储节点上的文件。
1 HDFS的设计理念
面对存储超大文件,Hadoop分布式文件系统采用了流式数据访问模式。
所谓流式数据,简单的说就是像流水一样,数据一点一点“流”过来,处理数据也是一点一点处理。
如果是全部收到数据以后再进行处理,那么延迟会很大,而且会消耗大量计算机内存。
1.1 存储超大文件
这里的“超大文件”通常达到几百GB甚至达到TB大小的文件。
像大型的应用系统,其存储超过PB级数据的Hadoop集群比比皆是。
1.2 数据访问模式
最高效的访问模式是一次写入、多次读取。
HDFS的构建思路也是这样的。
HDFS存储的数据集作为Hadoop的分析对象。
在数据集生成以后,采用各种不同分析方法对该数据集进行长时间分析,而且分析涉及到该数据集的大部分数据或者全部数据。
面对庞大数据,时间延迟是不可避免的,因此,Hadoop不适合运行低时间延迟数据访问的应用。
1.3 运行在普通廉价的服务器上
HDFS设计理念之一就是让它能运行在普通的硬件之上,即便硬件出现故障,也可以通过容错策略来保证数据的高可用。
2 HDFS的主要概念
2.1 数据块(block)
HDFS最基本的存储单位是64M的数据块,与普通文件系统相比,HDFS有这样的优点:假如一个文件小于一个数据块的大小,则不会占用整个数据块存储空间。
抽象块具有文件的所有块不需要存储在同一磁盘上的优点,使用抽象块作为存储单元,则大大简化了存储子系统的设计。
数据块如设置过大,会导致集群利用率过低。
如设置过小,要维护的元数据信息过多,由于元数据信息是存储在内存中的,所以可能会造成内存溢出。
2.2 HDFS数据节点
2.2.1 元数据节点(Namenode)
(1)其将所有的文件和文件夹的元数据保存在一个文件系统树中。
(2)元数据中存放着文件包括哪些数据块以及这些数据分布到哪些DataNode数据节点上。
· VERSION——保存着Hadoop分布式文件系统的版本号。
· fsimage——元数据的镜像文件,元数据保存在磁盘上的一个副本。
· edits——修改日志文件,记录引发元数据改变的操作。
· fstime——合并fimage和edits的时间。
2.2.2 数据节点(DataNode)
(1)文件系统数据真正存储在数据节点。
(2)将存储的数据块信息周期性的向元数据信息(namenode)回报。
(3)数据节点为客户端(client)或者元数据信息(namenode)提供写入或者读出数据块的请求。
2.2.3 从元数据节点(secondary namenode)
(1)元数据节点和从元数据节点分工不同,它们负责的事情并不相同,从元数据节点并不是元数据节点的备用节点。
(2)从元数据节点主要功能以防edits修改日志文件过大,周期性将元数据节点的fsimage和edits合并。
(3)simage和edits合并过后的命名空间镜像文件从元数据节点也保存了一份,以防元数据节点失败的时候,可以恢复,确保数据的安全性。
3 HDFS高可靠性的实现
3.1 安全模式
所谓安全模式就是Hadoop分布式文件系统刚刚启动时,名字节点进入一个特殊的状态。
当处于安全模式时,名字节点不能做任何文件操作,甚至不允许内部的副本创建。
名字节点需要收集各个数据节点的报告,当数据块达到最小副本数以上时,会被认为是“安全”的。
当认为安全的数据块所占的比例达到了某个阈值(可配置),在过若干时间,安全模式结束,当检测到副本数不足的数据块是,该块会被复制,直到达到最小副本数。
3.2 数据一致性
在HDFS中,每一个数据块,都有一个版本标识,假如数据发生变化,则版本标识将会相应变化,在元数据信息(namenode)里,保存着各个数据块的版本,如果出现与数据服务器上版本不一致,则会启动恢复流程。
由于各个网络情况非常复杂,仅仅靠简单的版本信息不能保证内容一致。
依照内容,采取签名的方法有效解决了数据内容一致性问题。
当客户端向数据服务器追加写人数据包时,HDFS 会对写入的所有数据进行校验和(checksum)计算,并在读取数据时验证该数据的校验和。
各个数据包签名验证的基本单位为512字节。
一个由多个数据节点组成的队列会同时接收客户端发送数据和校验和,最后一个数据节点负责验证校验和。
假如发现当前的传输块签名与在客户端中的签名不一致时,整个数据包的写入则为无效。
3.3 心跳包(HeartBeats)机制
所谓心跳包就是通过周期性的活动来检查数据节点的活性,就像跳动的心脏一样。
HDFS 采用了心跳包(Heart beat)机制保证名字节点和各个数据节点的联系。
名字节点周期性向管理的各个数据节点发送心跳包,而收到心跳包的数据节点则有效回复。
通过定时发送心跳包,名字节点把要执行的命令通过心跳包发送给数据节点,而数据节点收到心跳包,及时回复名字节点,同时开始与用户或者应用的数据传输。
3.4 租约机制
在Linux中,为了防止出现多个进程向同一个文件写数据的情况,采用了文件加锁的机制。
在HDFS中需要一种机制来防止同一个文件被多个人写入数据,这就是租约。
名字节点在
打开或创建一个文件,准备追加写之前,会与此客户端签订一份租约。
名字节点保证同一个文件只发放一个租约,就有效防止出现多人写入的情况。
假如文件被删除了,客户端宕机了,当超过租约期限时,名字节点就会剥夺此租约,将这个文件的享用权,分配给他人。
如此,来避免由于客户端停机带来的资源被长期霸占的问题。
3.5 回滚机制
HDFS安装或者升级时,会将当前的版本信息保存起来,一旦系统升级导致BUG或者不兼容,这一问题可以通过回滚回到旧版本解决。
如果升级之后一段时间内运行正常,则保存版本信息。
若运行不正常,则根据旧版本信息,恢复至之前的版本。
参考文献
[1]陆嘉恒.Hadoop实战[M].机械工业出版社,2014.
[2]Tom White.Hadoop权威指南[M].清华大学出版社,2015.
作者简介
陈忠义(1976-),男,浙江省温州市人。
硕士研究生。
工程师。
主要研究方向为计算机应用技术等。
作者单位
浙江省温州市公安局浙江省温州市 325000。