标题 | 基于Hadoop处理小文件的优化策略 |
范文 | 左大鹏+徐薇 摘要:HDFS(Hadoop Distributed File System)作为开源系统广泛地适用于各类存储服务中,具有高容错,易扩展,廉价存储等特点。然而,HDFS基于单一的服务器NameNode来处理元数据信息管理,当处理海量小文件时会造成NameNode内存过分消耗以及存储和读取性能并不理想,使NameNode成为系统瓶颈。本文提出一种基于HAR(HadoopArchive)的优化机制来提高NameNode存储元数据信息的内存利用效率和提高读取小文件的访问效率。另外,该策略也扩展了HAR文件追加的优化和为提高访问效率采用索引预取机制。实验结果表明该优化策略能够提高现有HAR处理小文件的能力和访问海量小文件的效率。 关键词:HDFS;小文件;HAR;索引策略;索引预取 中图分类号:TP391.1 文献标识码:A DOI:10.3969/j.issn.1003-6970.2015.02.023 0 引言 随着网络服务的高速发展,数据的数量呈现井喷之势,云计算技术已经成为提供主机数据和软件与服务部署方面越来越受欢迎的下一代基础设施。分布式文件系统是网络服务基层实施的重要组件。HDFS作为Hadoop的分布式文件系统,已经成为海量存储集群上部署的主流文件系统。由于HDFS是一个开源软件框架,获得了许多大公司的青睐,根据存储与处理海量数据时的优异表现得到广泛用与分析。然而HDFS在处理海量小文件时却忍受着性能降低,因为NameNode把文件系统的元数据信息放置于内存中,所以海量小文件的存储会引发的NameNode内存消耗过度以及NameNode性能降低,使NameNode成为了系统瓶颈。 随着各类社交网络的兴起,产生了大量数据文件,如日志,用户文件,图片等等小文件,所以针对Hadoop小文件问题现在已经有一些解决方案,这些方案可以大体分为两种策略:第一种是通过部署多个NameNode来支持更多的负载以此来提高系统性能;另一种则是通过合并小文件来最大限度的减轻NameNode的内存负载。其中Apache Hadoop基金会已经再次开发了HDFS,HDFS能够在一个集群中支持多命名空间从而提高系统的可扩展性以及隔离性,但是还是存在系统很难去配置各个命名空间的协调问题。文献提出了通过客户端本地缓存来存储索引文件实现索引或者数据预取减少NameNode的使用,从而优化HDFS的I/O性能。但是实验结果表现出的文件访问性能提高不是很显著。文献提出了一种优化I/O性能的方法,但是只是针对存储于HDFS上的地理信息数据。这种方法只适用于特定的数据并且没有提高文件访问效率。另外其他处理小文件的方法包括Sequence文件和Hadoop Archive。SequenceFile是HDFS提供的一种二进制的文件技术,通过将 为了克服上面提到的困难,本文提出一种基于已有的HAR方法的优化机制,HAR被从新设计索引机制来提高对元数据信息的管理,并在不需要改变HDFS体系结构的情况下提升文件访问性能。通过对HAR的索引策略进行改进,并且实现对已有HAR文件进行追加操作和通过客户端对索引文件进行预取,很好的提高了HDFS在面对小文件存储与读取上的性能。 1 研究现状 Hadoop平台提供了与google文件系统相似的分布式文件系统HDFS和MapReduce计算框架。HDFS具有高容错性,易扩展的特点,能够提高极高的数据吞吐量,适合那些有着超大数据集的应用程序,因而被各大公司广泛运用,包括AOL,Amazan,Facebook,Twitter等。HDFS有一个单一的NameNode节点和多个DataNode节点,属于主从式架构。体系结构如图1所示。 NameNode管理元数据信息以及文件系统内部配置数据,HDFS中的文件被分成块,每个块被复制和存储到多个DataNode~L13I。DataNode管理块存储以及响应来至客户端从NameNode指向的请求。HDFS提供了优化方法处理海量数据,计算被分摊到各个节点,使存储输入数据的传输负载最小化,并且数据复制确保了软件与硬件的高容错性。但是HDFS设计初衷是用流数据访问方式存储大文件数据,简而言之,就是说在处理小文件上会有如下问题: (1)高的NameNode内存消耗。NameNode内存存放元数据信息。一个文件的元数据信息大概占用内存250bytes,然后每一个块默认有3个备份,那么大约消耗368bytes。也就是说文件越多,内存消耗越多,而NameNode内存有限,所以需要降低NameNode消耗。 (2)不能接受的存储时间。如文献[7]中提到存储1KB到10KB之间大小的550000个小文件耗时7.7个小时,但是存储这些文件到本地文件系统如ext3,仅仅花费660秒。 (3)NameNode成为瓶颈。元数据信息管理是一个费时的任务。为访问一个文件HDFS客户端会先去NameNode取元数据信息。对于小文件而已数据传输花费非常短,所以磁盘寻找和管理元数据信息变成主要负载对象。当有大量小文件访问时,HDFS客户端访问NameNode会非常频繁,从而影响NameNode性能。 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。