1 ; ; 引言(Introduction)
如今网络的飞速发展,数据量的增多,这就要求数据库能够具有处理超大规模数据的能力。Hadoop分布式平台的出现,很好地解决了处理海量数据的难题。Hadoop集群架构有两个核心的设计,分别是HDFS(Hadoop Distributed File System)和MapReduce[1]。由于HDFS只有一个元数据服务器NameNode,导致HDFS存在单点故障,单点内存不足等问题。本文在分析研究HDFS单点问题的基础上,针对单点内存瓶颈问题,提出了一种新型的上层归档文件系统,用来优化海量小文件的处理,可有效地解决单点内存瓶颈问题。
2 ; ; HDFS架构(HDFS architecture)
Hadoop分布式文件系统(HDFS)是Hadoop分布式平台的一个核心组件,其设计目的是为了解决超大文件存储难题[2]。HDFS是由一个主节点和多个子节点构成的主从结构。主节点被称为名称节点(NameNode),子节点被称为数据节点(DataNode)。HDFS的架构图如图1所示。
图1 HDFS架构图
; ; ; Fig.1 The architecture diagram of HDFS
名称节点主要负责管理分布式文件系统中的元数据信息,处理用户文件访问操作请求等。而被上传到Hadoop分布式文件系统中的大数据则保存在数据节点中。通过心跳机制,每隔一段时间数据节点与名称节点进行信息交互[3]。
Hadoop分布式文件系统包含名称节点、数据节点、数据块、数据包等组件。
名称节点(NameNode)是HDFS的主节点,负责管理并维护整个分布式文件系统的元数据信息,即:FSImage信息和EditLog信息[4]。NameNode又决定了大数据文件与数据块之间的映射,数据块与数据节点之间的映射,处理客户端发来的文件操作访问请求。
数据节点(DataNode)主要负责存储数据文件,并且每隔一段时间向主节点发送存储数据映射列表。
数据块(Data Block)。分布式文件系统存储的数据都存储在数据块中[5]。上传的数据文件首先被分割成默认大小64MB的数据块,然后文件以数据块的形式存放在不同的DataNode节点上,是分布式文件系统存储数据的基本单位。为了防止数据块丢失,每块默认复制三块,其中两个数据块存储在一个机架中,另一个数据块则被存储在其他的机架中,大大提高了HDFS数据的可用性。
数据包(Data Packet)。在执行写操作时,需要将上传的数据先保存在本地目录中,待累计到系统规定值后才将数据一次写入到Hadoop分布式文件系统中。这样,每次上传的数据称为一个数据包。
3 ; ; NameNode单点问题分析(NameNode single
; ; ; ; point problem analysis)
3.1 ; ; 单点故障
单点故障是指引起系统整体失效的部件,当该部件失效时,会造成整个系统无法工作。Hadoop分布式文件系统由一个主节点和多个子节点构成的。NameNode节点负责管理和维护所有的命名空间和元数据信息,名称节点主要负责管理分布式文件系统中的元数据信息,处理用户文件访问操作请求等。一旦发生主节点故障会使整个系统无法正常工作,这对于使用者来说是灾难性的。
3.2 ; ; 性能瓶颈
NameNode节点主要负责管理并维护整个分布式文件系统的元数据信息,处理用户文件访问操作请求。每次用户发出文件访问操作请求时,NameNode节点都需要响应客户端的请求[6]。由于HDFS仅有一个名称节点,当大量客户端同时发出文件访问操作请求,单一的名称节点无法及时一一做出响应,这必然会对HDFS正常运行造成严重的影响,是HDFS的性能瓶颈。
3.3 ; ; 内存瓶颈
NameNode节点中保存了整个系统的命名空间,负责管理并维护整个分布式文件系统的元数据信息,即:FSImage信息和EditLog信息。对于每个上传的文件,NameNode节点会为其自动生成相应的元数据信息,而这些元数据信息会占用少许的主节点内存空间[7]。HDFS适合存储大数据文件,一般情况下,NameNode节点存储的元数据信息不会对整个Hadoop集群造成影响。上传文件后,用户更多的是与数据节点进行访问交互,不会对访问性能造成影响。然而用户选择上传海量的小文件时,元数据节点需要为每个小文件生成对应的元数据信息,这势必对NameNode单点内存性能造成影响,从而对整个Hadoop集群的扩展性造成影响。一般,当用户上传小文件数量达到一亿,相应的元数据信息约占主节点20G的存储空间。若上传的小文件以指数级增长,HDFS集群将不足以支持海量文件的存储。同样,NameNode内存瓶颈严重制约了集群的扩展。
目前,Hadoop0.18.0版本引入了HAR(Hadoop archives)技术,它可以将众多小文件打包成一个大文件进行存储,减少HDFS中小文件数量,主要解决的是小文件占用大量Namenode内存空间。但是它是一个人工干预的过程,同时既不能够支持自动删除原小文件,也不支持追加操作,当有新文件进来以后,需要重新打包。还有一些针对具体问题的小文件解决方案,如WebGIS提出适用于地理信息系统信息存储机制,和指定存储格式为PPT格式的解决方案。这些解决方案可以有效解决HDFS单点内存瓶颈问题[8],但均局限于指定的应用环境,不适用其他类型文件的存储,如海量存储MP3格式的文件。
针对HDFS单点内存瓶颈问题,本文提出了新型的上层归档文件系统,用来优化海量小文件的处理。
4 ; 对小文件存储优化的实现(Implementation of
; ; ; ; small file storage optimization)
4.1 ; ; 基本思想
上传小文件前,首先对海量小文件进行预处理,将本地目录中需要处理的小文件写入HashMap集合中,同时通过格式转换生成文件流式集合,其中小文件文件名作为key,文件内容作为value。然后以SequenceFile作为容器,再将HashMap中存储的海量小文件进行归档合并成一个大文件。最后,将合并后的大文件上传Hadoop服务器序列化存储在HDFS中,从而缓解了NameNode节点内存瓶颈问题。处理海量小文件流程如图2所示。
图2 海量小文件处理
; ; ; ; Fig.2 Massive small files processing
4.2 ; ; SmallFilesWrite类的实现
SmallFilesWrite类中,成员变量有两个,就是String类型的静态成员变量SOURCE_PATH和TARGET_PATH,SOURCE_PATH变量表示源路径,即预上传文件本地目录路径。TARGET_PATH表示目标路径,即上传到指定Had
oop分布式文件系统路径。成员方法主要有readFiles方法、file2Bytes方法和main方法。
(1)readFiles方法
上传小文件前,首先对海量小文件进行预处理,将本地目录中需要处理的小文件写入HashMap集合中,其中小文件文件名作为key,文件内容作为value。
首先,在readFiles方法中创建一个File的对象directory,然后调用listFiles方法获取SOURCE_PATH指定路径中的文件的内容。将获取的文件存储在创建的File[]数组中。最后map对象调用put方法,将读取的小文件循环写入到HashMap集合中。这里file[]数组元素调用getName方法获取文件名,作为Map集合中的key,同时调用file2Bytes方法,将文件内容作为Map集合中的value存储。
(2)file2Bytes方法
在Hadoop分布式文件系统中,读写数据的方式满足流式读写,目的可以提高数据访问的吞吐量。为支持不同格式小文件合并,编写了一个file2Bytes方法,该方法的形式参数为String类型的filename,这个参数代表本地目录中预处理文件的文件名。创建FileInputStream对象fis,对其进行初始化,并抛出异常。然后使用对象fis的available方法,目的使其可以不受阻塞地从此输入流中读取(或跳过)的估计剩余字节数。再然后定义一个byte类型的long_buf数组,将本地目录中的小文件进行格式转换,转换成字节流写入long_buf数组中。这样读写数据的方式满足流式读写,同时解决了不同格式的小文件合并问题。
(3)main方法
main方法实现了将海量小文件进行归并处理,生成一个大文件,最后将其分布并发存储到HDFS中。通过遍历Map,迭代输出集合中元素;创建Text对象key,BytesWritable对象value,key调用set方法获取输出集合中元素的key值,value调用set方法获取拷贝的文件内容,偏移量及文件长度;返回一个SequenceFile.Writer实例,这里需要创建FileSystem和Path对象,将数据内容写入path对象,调用append方法完成小文件的追加写入。实现将海量小文件归并处理,生成一个大文件。
4.3 ; ; 文件的访问
自定义一个FileOutputStream文件输出流对象,指定输出目录将需要访问的文件流式读出,将读出的文件返回给需要访问的用户。访问某文件时,首先获取SmallFilesWrite中HDFS中输入目录,创建SequenceFile.Reader对象,通过迭代获取序列文件名和该文件名所对应的文件。
5 ; ; 结论(Conclusion)
本文针对Hadoop分布式文件系统的单点内存瓶颈问题,提出了采用小文件归并的优化算法。根据Hadoop存储数据特点,利用小文件合并大文件,可有效减少元数据的生成,解决了单点内存瓶颈问题。在Hadoop分布式文件系统单点内存瓶颈优化的基础上,对Hadoop分布式文件系统的性能瓶颈的优化将是本人未来主要研究的内容。
参考文献(Reference)
.北 京:清华大学出版社,2011.