【叶凡网络】浅谈Hadoop处理大量小文件的问题以及解决方法

2014-02-27 12:09:46 | 新闻来源:叶凡网络 | 点击量:727

如果有可能最好设计自己的数据pipelin来将数据直接写入一个SequenceFil将已有的许多小文件转换成一个SequenceFil可能会比较慢。但是完全有可能通过并行的方式来创建一个一系列的SequenceFilStuartSierrahawrittenaveriuspostaboutconvertatarfileintoaSequenceFiltoollikethiarverius更进一步。那么在HDFS中肯定会含有许许多多这样的小文件(不然就不会用hadoop而HDFS问题在于无法很有效的处置大量小文件。小文件指的那些size比HDFSblocksize默认64M小的多的文件。如果在HDFS中存储小文件。

这些小文件都是一个大的逻辑文件的piec由于HDFS仅仅在不久前才刚刚支持对文件的append因此以前用来向unboundfile例如log文件)添加内容的方式都是通过将这些数据用许多chunk方式写入HDFS中;文件自身就是很小。例如许许多多的小图片文件。每一个图片都是一个独立的文件。并且没有一种很有效的方法来将这些文件合并为一个大的文件。文件是由许许多多的record组成的那么可以通过件邪行的调用HDFSsync方法(和 append方法结合使用)来解决。或者,这两种情况需要有不同的解决方式。对于第一种情况。可以通过些一个顺序来专门合并这些小文件(seeNathanMarzspostaboutatoolcalltheConsolidwhichdoeexactlithi,就需要某种形式的容器来通过某种方式来group这些filehadoop提供了一些选择:对于第二种情况。而这个命令实 际上也是运行了一个MapReduc任务来将小文件打包成HA R对于client端来说,HadoopArchiveHA Rfile0.18.0版本中引入的出现就是为了缓解大量小文件消耗namenod内存的问题。HA R文件是通过在HDFS上构建一个层次化的文件系统来工作。一个HA R文件是通过hadooparchiv命令来创建。使用HA R文件没有任何影响。所有的原始文件都 visibl&&accessushar://URL但在HDFS端它内部的文件数减少了

目录和blockHDFS中都会被表示为一个object存储在namenod内存中,任何一个文件。没一个object占用150byte内存空间。所以,如果有10million个文件,没一个文件对应一个block那么就将要消耗namenod3G内存来保存这些block信息。如果规模再大一些,那么将会超出现阶段计算机硬件所能满足的极限。HDFS并不是为了有效的处置大量小文件而存在主要是为了流式的访问大文件而设计的对小文件的读取通常会造成大量从datanoddatanodseek和hop来retriev文件,不只如此。而这样是非常的低效的一种访问方式。并且拥有大量的这种小文件,Maptask通常是每次处置一个blockinput默认使用FileInputFormat如果文件非常的小。那么每一个maptask都仅仅处理了非常小的input数据,并且会产生大量的maptask每一个maptask都会消耗一定量的bookkeep资源。比较一个1GB文件,默认blocksize为64M和1Gb文件,没一个文件100KB那么后者没一个小文件使用一个maptask那么job时间将会十倍甚至百倍慢于前者。

默认为11为无限制)另一种方法为使用MultiFileInputSplit可以使得一个map中能够处置多个splithadoop中有一些特性可以用来减轻这种问题:可以在一个JVM中允许taskreus以支持在一个JVM中运行多个maptask以此来减少一些JVM启动消耗(通过设置mapred.job.reuse.jvm.num.task属性。

而且实际上可能还会稍微低效一点,通过HA R来读取一个文件并不会比直接从HDFS中读取文件高效。因为对每一个HA R文件的访问都需要完成两层 index文件的读取和文件自身数据的读取(见上图)并且尽管HA R文件可以被用来作为MapReducjobinput但是并没有特殊的方法来使map将HA R文件中打包的文件当作一个HDFS文件处置。可以考虑通过创建一种inputformat利用HA R文件的优势来提高MapReduc效率,但是目前还没有人作这种inputformat需要注意的MultiFileInputSplit即使在HA DOOP-4565改进(choosfileinasplitthatarnodelocal但始终还是需要seekpersmallfile

 

使用filenam作为kei并且filecontent作为valu实践中这种方式非常管用。回到10000个100KB文件,通常对于“thesmallfileproblem回应会是使用SequenceFil这种方法是说。可以写一个顺序来将这些小文件写入到一个单独的SequenceFil中去,然后就可以在一个streamfashiondirectliorusmapreduc中来使用这个sequenceFil不只如此,SequenceFil也是splittabl所以mapreduc可以breakthemintochunk并且分别的被独立的处置。和HA R不同的这种方式还支持压缩。block压缩在许多情况下都是最好的选择,因为它将多个 record压缩到一起,而不是一个record一个压缩。

上一篇:【叶凡网络】俄罗斯或军事介入不会“丢下”乌克兰 下一篇:【叶凡网络】今年卫生工作宁夏的部署