hdfs可以高效存储大量的小文件,HDFS小文件问题解决方案

 2023-09-24 阅读 15 评论 0

摘要:一 如果小文件过多带来的影响 1过多的小文件,意味着需要保存的元数据就更多,那么也就需要更多的NameNode内存了,从而给NameNode带来性能问题 2读取小文件数据的时候,带来集群资源更多开销。首先MapTask每次是读取一个文件,如果这时候文件过

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

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的格式。

 

 


版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/93076.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息