HDFS小文件问题及解决方案

一、概述node

小文件是指文件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上。shell

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

二、HDFS文件读写流程工具

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

(1) 读文件流程性能

1)client端发送读文件请求给namenode,若是文件不存在,返回错误信息,不然,将该文件对应的block及其所在datanode位置发送给clientspa

2) client收到文件位置信息后,与不一样datanode创建socket链接并行获取数据。orm

(2) 写文件流程对象

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

2)client将文件分块,并行存储到不一样节点上datanode上,发送完成后,client同时发送信息给namenode和datanode

3)namenode收到的client信息后,发送确信信息给datanode

4)datanode同时收到namenode和datanode的确认信息后,提交写操做。

三、Hadoop自带的解决方案

对于小文件问题,Hadoop自己也提供了几个解决方案,分别为:Hadoop Archive,Sequence file和CombineFileInputFormat。

(1) Hadoop Archive

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

对某个目录/foo/bar下的全部小文件存档成/outputdir/ zoo.har:

hadoop archive -archiveName zoo.har -p /foo/bar /outputdir

固然,也能够指定HAR的大小(使用-Dhar.block.size)。

HAR是在Hadoop file system之上的一个文件系统,所以全部fs shell命令对HAR文件都可用,只不过是文件路径格式不同,HAR的访问路径能够是如下两种格式:

har://scheme-hostname:port/archivepath/fileinarchive

har:///archivepath/fileinarchive(本节点)

能够这样查看HAR文件存档中的文件:

hadoop dfs -ls har:///user/zoo/foo.har

输出:

har:///user/zoo/foo.har/hadoop/dir1

har:///user/zoo/foo.har/hadoop/dir2

使用HAR时须要两点,第一,对小文件进行存档后,原文件并不会自动被删除,须要用户本身删除;第二,建立HAR文件的过程其实是在运行一个mapreduce做业,于是须要有一个hadoop集群运行此命令。

此外,HAR还有一些缺陷:第一,一旦建立,Archives便不可改变。要增长或移除里面的文件,必须从新建立归档文件。第二,要归档的文件名中不能有空格,不然会抛出异常,能够将空格用其余符号替换(使用-Dhar.space.replacement.enable=true 和-Dhar.space.replacement参数)。

(2) Sequence file

sequence file由一系列的二进制key/value组成,若是为key小文件名,value为文件内容,则能够将大批小文件合并成一个大文件。

Hadoop-0.21.0中提供了SequenceFile,包括Writer,Reader和SequenceFileSorter类进行写,读和排序操做。若是hadoop版本低于0.21.0的版本,实现方法可参见[3]。

(3)CombineFileInputFormat

CombineFileInputFormat是一种新的inputformat,用于将多个文件合并成一个单独的split,另外,它会考虑数据的存储位置。

相关文章
相关标签/搜索