一 如果小文件过多带来的影响
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的格式。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态