HDFS小文件问题解决方案

来源:互联网 发布:淘宝xbox360手柄 编辑:程序博客网 时间:2024/04/30 18:38

一 如果小文件过多带来的影响

1过多的小文件,意味着需要保存的元数据就更多,那么也就需要更多的NameNode内存了,从而给NameNode带来性能问题

2读取小文件数据的时候,带来集群资源更多开销。首先MapTask每次是读取一个文件,如果这时候文件过多就意味着造成大量MapTask启动;其次要读取更多的文件,意味着需要更多I/O操作。

 

二 解决方案

2.1将数据写入到SequenceFile格式的文件中

SequenceFile文件的结构:


因为小文件内容比较少,我们可以用文件名作为key, 文件内容作为value,直接写到SequenceFile中,创建过程我们可以使用MR来做。

但是一个个的创建会比较慢,我们可以通过并行的方式来创建SequenceFile

private static void writeTest(FileSystemfs, int count, int seed, Path file, 
CompressionType compressionType, CompressionCodec codec)
    throws IOException {
    fs.delete(file, true);
    LOG.info("creating " + count + " records with" + compressionType +
             "compression");

  //指明压缩方式
    SequenceFile.Writer writer = 
      SequenceFile.createWriter(fs, conf, file, 
                               RandomDatum.class, RandomDatum.class, compressionType, codec);
    RandomDatum.Generator generator = newRandomDatum.Generator(seed);
    for (int i = 0; i < count; i++) {
      generator.next();

  //keyh
      RandomDatum key = generator.getKey();

  //value
      RandomDatum value = generator.getValue();
  //追加写入
      writer.append(key, value);
    }
    writer.close();
  }

 

2.2存入外部系统比如HBase

我们通过写HBase的方式进行数据的写入而不是直接写HDFS,HBase数据的存储格式也是类似于SequenceFile中的K-V的格式。

 

 


原创粉丝点击