码迷,mamicode.com
首页 > 其他好文 > 详细

Hadoop的小文件解决方案

时间:2015-12-05 01:52:15      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

小文件指的是那些size比HDFS的block size(默认64M)小的多的文件。任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个object占用150bytes的内存空间。所以,如果有10million(一千万)个文件,每一个文件对应一个block,那么就将要消耗namenode3G的内存来保存这些block的信息,如果规模再大一些,那么将会超出现阶段计算机硬件所能满足的极限.

相同大小下,小文件越多,对namenode造成的内存压力就越大,因此HDFS不适合存储小文件。

解决方案:

应用程序自己控制,如合并文件

final Path path = new Path("/combinedfile");
        final FSDataOutputStream create = fs.create(path);
        final File dir = new File("C:\\Windows\\System32\\drivers\\etc");
        for(File fileName : dir.listFiles()) {
            System.out.println(fileName.getAbsolutePath());
            final FileInputStream fileInputStream = new FileInputStream(fileName.getAbsolutePath());
            final List<String> readLines = IOUtils.readLines(fileInputStream);
            for (String line : readLines) {
                create.write(line.getBytes());    
            }
            fileInputStream.close();
        }
        create.close();

 

Hadoop Archive

Hadoop Archives (HAR files)是在0.18.0版本中引入的,它的出现就是为了缓解大量小文件消耗namenode内存的问题。HAR文件是通过在HDFS上构建一个层次化的文件系统来工作。一个HAR文件是通过hadoop的archive命令来创建,而这个命令实 际上也是运行了一个MapReduce任务来将小文件打包成HAR。对于client端来说,使用HAR文件没有任何影响。所有的原始文件都 (using har://URL)。但在HDFS端它内部的文件数减少了。

通过HAR来读取一个文件并不会比直接从HDFS中读取文件高效,而且实际上可能还会稍微低效一点,因为对每一个HAR文件的访问都需要完成两层 index文件的读取和文件本身数据的读取。并且尽管HAR文件可以被用来作为MapReduce job的input,但是并没有特殊的方法来使maps将HAR文件中打包的文件当作一个HDFS文件处理。

创建文件 hadoop archive -archiveName xxx.har -p  /src  /dest
查看内部结构 hadoop fs -lsr /dest/xxx.har
查看内容 hadoop fs -lsr har:///dest/xxx.har

  

 

 

 

 

 

Sequence File/Map file

合并小文件,如HBase部分的compact

CombineFileInputFormat

 

Hadoop的小文件解决方案

标签:

原文地址:http://www.cnblogs.com/thinkpad/p/5020888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!