HDFS无法高效存储大量小文件,如何处理好小文件

小文件是指文件size小于HDFS上block大小的文件这样的文件会给hadoop的扩展性和性能带来严重问题。首先在HDFS中,任何block文件或者目录在内存中均以对象的形式存储,每个对象约占150byte如果有1000 0000个小文件,每个文件占用一个block则namenode大约需要2G空间。如果存储1亿个文件则namenode需要20G空间(见参考资料[1][4][5])。这样namenode内存容量严重制约了集群的擴展 其次,访问大量小文件速度远远小于访问几个大文件HDFS最初是为流式访问大文件开发的,如果访问大量小文件需要不断的从一个datanode跳到另一个datanode,严重影响性能最后,处理大量小文件速度远远小于处理同等大小的大文件的速度每一个小文件要占用一个slot,而task启动将耗費大量时间甚至大部分时间都耗费在启动task和释放task上

本文首先介绍了hadoop自带的解决小文件问题的方案(以工具的形式提供),包括Hadoop ArchiveSequence file和CombineFileInputFormat;然後介绍了两篇从系统层面解决HDFS小文件的论文,一篇是中科院计算所2009年发表的用以解决HDFS上存储地理信息小文件的方案;另一篇是IBM于2009年发表嘚,用以解决HDFS上存储ppt小文件的方案

在正式介绍HDFS小文件存储方案之前,我们先介绍一下当前HDFS上文件存取的基本流程

1)client端发送读文件请求給namenode,如果文件不存在返回错误信息,否则将该文件对应的block及其所在datanode位置发送给client

2) client收到文件位置信息后,与不同datanode建立socket连接并行获取数据

1) client端发送写文件请求,namenode检查文件是否存在如果已存在,直接返回错误信息否则,发送给client一些可用datanode节点

Hadoop Archive或者HAR是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件这样在减少namenode内存使用的同时,仍然允许对文件进行透明的访问

/)的特点提出了解决HDFS小文件存储的方案。Bluesky是中国电子教学共享系统里面的ppt文件和视频均存放在HDFS上。该系统的每个课件由一个ppt文件和几张该ppt文件的預览快照组成当用户请求某页ppt时,其他相关的ppt可能在接下来的时间内也会被查看因而文件的访问具有相关性和本地性。本文主要有2个idea:第一将属于同一个课件的文件合并成一个大文件,以提高小文件存储效率第二,提出了一种two-level prefetching机制以提高小文件读取效率即索引文件预取和数据文件预取。索引文件预取是指当用户访问某个文件时该文件所在的block对应的索引文件被加载到内存中,这样用户访问这些攵件时不必再与namenode交互了。数据文件预取是指用户访问某个文件时将该文件所在课件中的所有文件加载到内存中,这样如果用户继续访問其他文件,速度会明显提高

下图展示的是在BlueSky中上传文件的过程:

下图展示的是在BlueSky中阅览文件的过程:

Hadoop目前还没有一个系统级的通用的解决HDFS小文件问题的方案。它自带的三种方案包括Hadoop Archive,Sequence file和CombineFileInputFormat需要用户根据自己的需要编写程序解决小文件问题;而第四节提到的论文均是针對特殊应用提出的解决方案,没有形成一个比较通用的技术方案

(1)有关小文件问题的表述:

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信