FEMA:基于HDFS的小文件读写优化算法

2019-05-22 10:27张鑫谭海
电脑知识与技术 2019年6期

张鑫 谭海

摘要:HDFS(Hadoop Distributed File System)是目前面向云计算应用最为广泛的分布式文件系统,然而其面对海量小文件存储场景时其存在Namenode开销大,读写效率不理想等问题。基于此提出一种HDFS小文件读写优化算法FMEA(File Merging and name-Encoding Algorithm)。考虑文件存储的目录结构将小文件合并为大文件存储,分配块内file id,与Namenode分配的block id构成二元组唯一表示该文件,编码生成逻辑文件名并建立块内索引,提高小文件访问效率。实验结果表明,FMEA有效地降低了Namenode的内存开销,提高了小文件的读写效率,此方案适用于具有海量小文件的云存储系统。

关键词: HDFS;小文件;FMEA;文件合并;文件名编码

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2019)06-0232-02

FEMA:An Optimizational Algorithm of Small Files Stored and Readed on HDFS

ZHANG Xin,TAN Hai

(Information Engineering,East China University of Technology,Nanchang 330013,China)

Abstract:HDFS (Hadoop Distributed File System) is currently the most widely distributed file system for cloud computing applications. However, it has a problem of large Namenode overhead and unsatisfactory reading and writing efficiency when faced with a large number of small file storage scenarios. Based on this, proposes an HDFS File Merging and name-Encoding Algorithm (FMEA). Consider the file structure of the file storage to merge the small files into large file storage, allocate the file id in the block, and form the binary group with the block id assigned by the Namenode to uniquely represent the file, encode the logical file name and create the blockIndex, and improve the access efficiency of small files. The experimental results show that the FMEA effectively reduces the memory overhead of the Namenode and improves the read and write efficiency of small files. This scheme is suitable for cloud storage systems with a large number of small files.

Key words:HDFS;small files;FMEA;merge files;filename encoding

1 引言

分布式集群文件系統[1]在海量数据的存储与处理上表现优异,其运行在多台计算机上,通过某种方式相互通信从而将集群内所有存储空间资源整合、虚拟化并对外提供文件访问服务。HDFS[2]作为Hadoop的分布式文件系统,通过运行在廉价商业机器上的多个节点之间的协同工作实现了高性能、高可用性以及动态的负载均衡,消除了单点故障以及性能瓶颈,具有高可靠性、高扩展性、高效性、高容错性、经济性等诸多优点。

2 HDFS海量小文件存取问题

HDFS采用主从式架构,由一个Namenode和多个Datanode组成,其中Namenode负责管理文件系统的元数据,Datanode负责数据块的实际存储[3]。由于所有文件系统的元数据均存放于Namenode内存中,因此存储文件的数目受限于Namenode的内存大小[4];此外,HDFS适用于高吞吐量的文件存储,而不适合低时间延迟的访问,同时存入million的文件要几个小时;HDFS中文件以数据块的形式存储,其默认块大小为64M,这样每个小文件都至少占用一个块[5]。因此,由于其本身的架构设计缺陷及大数据对于存储能力的要求不断攀升,HDFS并不适合大量小文件的存储[6]。

针对以上问题,本文提出了一种基于目录结构的小文件合并优化读写策略,主要包含三个方面的内容:(1)将小文件合并为大文件,减少HDFS中文件的数目,提高存取效率。(2)将文件所在块的block id及块内file id编码生成逻辑文件名,降低Namenode内存消耗。(3)通过对逻辑文件名解码的方式建立索引,提高小文件的读取效率。

3 小文件合并及文件名编码算法 -FMEA

其中ClientServer是对文件判别、合并、编码模块的封装,负责响应客户端的请求、合并小文件、与HDFS交互、逻辑文件名的编码,同时还要维护一个实际文件名与逻辑文件名的索引清单。HDFS端负责数据的实际存储。

FMEA包括文件判别、文件合并以及文件编码三个过程。其中文件判别模块负责文件大小类型的识别,文件合并模块将小文件进行合并并建立块内索引,文件编码模块通过将block id及块内file id编码生成逻辑文件名并在读取文件时进行解码。

文件判别模块通过客户端发出的文件写请求判断其为大文件还是小文件,若是大文件则直接存储至HDFS,若为小文件则交由文件合并模块进行处理。考虑到所要存储的文件均具有特定的目录结构,因此依据目录结构进行小文件合并可以提高文件的读写效率。文件合并模块将传来小文件进行合并(优先处理同一目录或父目录下的文件),若合并队列数据量超过合并阈值,放入新的队列,否则继续合并直到超过阈值。同时对块内文件分配file id并建立块内索引blockIndex,其记录的是每个HDFS block中存储的小文件的索引信息。其结构如图2所示,其中keylen表示key的长度,占用一个字节,key是文件的名称,offset和length表示该文件在块内的偏移量及长度,占用四个字节。blockIndex文件对于Namenode而言是透明的,与对应的block一起傳输,并加载在Datanode内存中,并不占用Namenode的内存。

5 结束语

本文针对HDFS在海量小文件存储上存在的问题提出了一种小文件合并及文件名编码优化策略-FMEA。将小文件依据目录结构合并成一个大文件存储,将file id及block id编码生成逻辑文件名,同时建立块内索引blockIndex提高文件的读取速率。通过实验验证FEMA解决了存储海量小文件时Namenode内存开销过大的问题,且有效地提高了HDFS上小文件的读写效率。

参考文献:

[1] 刘智慧,张泉灵.大数据技术研究综述[J].浙江大学学报(工学版),2014,48(6):957-972.

[2] 郝树魁.Hadoop HDFS和MapReduce架构浅析[J].邮电设计技术,2012(7):37-42.

[3] 侯建,帅仁俊,侯文.基于云计算的海量数据存储模型[J].通信技术,2011,44(5):163-165.

[4] 付东华. 基于HDFS的海量分布式文件系统的研究与优化[D].北京邮电大学,2012.

[5] 洪旭升,林世平.基于MapFile的HDFS小文件存储效率问题[J].计算机系统应用,2012,21(11):179-182.

[6] 张海,马建红.基于HDFS的小文件存储与读取优化策略[J].计算机系统应用,2014,23(5):167-171.

【通联编辑:光文玲】