Hadoop的小文件解决方案

小文件指的是那些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

时间: 2024-10-25 11:12:32

Hadoop的小文件解决方案的相关文章

Hadoop之小文件处理与调优经验

HDFS上每个文件都要在namenode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会大量占用namenode的内存空间,另一方面就是索引文件过大是的索引速度变慢. 解决的方式:   1:Hadoop本身提供了一些文件压缩的方案 2:从系统层面改变现有HDFS存在的问题,其实主要还是小文件的合并,然后建立比较快速的索引. Hadoop自带小文件解决方案 1:Hadoop Archive: 是一个高效地将小文件放入HDFS块中的文件存档

[Hadoop]大量小文件问题及解决方案

1. HDFS上的小文件问题 小文件是指文件大小明显小于HDFS上块(block)大小(默认64MB)的文件.如果存储小文件,必定会有大量这样的小文件,否则你也不会使用Hadoop(If you're storing small files, then you probably have lots of them (otherwise you wouldn't turn to Hadoop)),这样的文件给hadoop的扩展性和性能带来严重问题.当一个文件的大小小于HDFS的块大小(默认64MB

Hadoop对小文件的解决方案

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

Hadoop合并小文件的几种方法

1.Hadoop HAR 将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-Reduce进行操作,打包后的文件由索引和存储两大部分组成: 缺点: 一旦创建就不能修改,也不支持追加操作,还不支持文档压缩,当有新文件进来以后,需要重新打包. 2.SequeuesFile 适用于非文体格式,可作小文件容器,并可压缩: 3.CombineFileInputFormat 将多个文件合并成一个split作为输入,减少map输入与HDFS块的耦合: 4.Java代码实现,使用HDF

大数据技术之_05_Hadoop学习_04_MapReduce_Hadoop企业优化(重中之重)+HDFS小文件优化方法+MapReduce扩展案例+倒排索引案例(多job串联)+TopN案例+找博客共同粉丝案例+常见错误及解决方案

第6章 Hadoop企业优化(重中之重)6.1 MapReduce 跑的慢的原因6.2 MapReduce优化方法6.2.1 数据输入6.2.2 Map阶段6.2.3 Reduce阶段6.2.4 I/O传输6.2.5 数据倾斜问题6.2.6 常用的调优参数6.3 HDFS小文件优化方法6.3.1 HDFS小文件弊端6.3.2 HDFS小文件解决方案第7章 MapReduce扩展案例7.1 倒排索引案例(多job串联)7.2 TopN案例7.3 找博客共同粉丝案例第8章 常见错误及解决方案 第6章

解决Hadoop一些小问题(整理版)

1 dfsadmin -setQuota的问题 dfsadmin -setQuota 限制文件数量 dfsadmin -setSpaceQuota 限制磁盘空间 2 解决Hadoop小文件问题? 数据块的默认大小是64M,如果一个文件的大小小于64M,那么它就属于Hadoop的小文件. 这样会浪费空间,所以要使用archive的方式来实现归并小文件.数据块的大小可以使用 dfs.block.size这个属性进行配置. 3 start-dfs.sh的告警信息 unable to load nati

Hadoop小文件问题及解决方案

1.概述 小文件是指文件size小于HDFS上block大小的文件.这样的文件会给hadoop的扩展性和性能带来严重问题.首先,在HDFS中,任何block,文件或者目录在内存中均以对象的形式存储,每个对象约占150byte,如果有1千万个小文件,每个文件占用一个block,则NameNode大约需要2G空间.如果存储一亿个文件,则NameNode需要20G空间.这样NameNode内存容量严重制约了集群的扩展.其次,访问大量小文件速度远远小于访问几个大文件.HDFS最初是为流式访问大文件开发的

大数据-Hadoop小文件问题解决方案

HDFS中小文件是指文件size小于HDFS上block(dfs block size)大小的文件.大量的小文件会给Hadoop的扩展性和性能带来严重的影响.HDFS中小文件是指文件size小于HDFS上block大小的文件.大量的小文件会给Hadoop的扩展性和性能带来严重的影响. 大数据学习群:716581014 小文件是如何产生的? 动态分区插入数据,产生大量的小文件,从而导致map数量剧增 reduce数量越多,小文件也越多,reduce的个数和输出文件个数一致 数据源本身就是大量的小文

Hive优化之小文件问题及其解决方案

小文件是如何产生的 1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增. 2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的). 3.数据源本身就包含大量的小文件. 小文件问题的影响 1.从Hive的角度看,小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能. 2.在HDFS中,每个小文件对象约占150byte,如果小文件过多会占用大量内存.这样NameNode内存容量严重制约了集群的扩展. 小