小文件过多的问题:
小文件过多会会导致占用过多的内存资源,因为namenode在内存中维护文件系统树和最新的元数据信息,每个小文件都会占用150字节的内存,会影响查询效率
导致小文件过多的原因:
使用动态分区,会产生很多零碎的小文件,插入分区表时最好指定分区字段的值;
reduce过多会产生很多小文件,设置合理的reduce数
减少小文件数量的措施:
1 源头解决:在日增数据中,可以通过设置写入数据的参数,设置map端,reduce端输出时进行文件合并,设置一个输出文件大小均值,当小于这个均值时,会启动一个独立的mapreduce进程进行文件的合并
2 合并hdfs中已有的小文件,有两种方式:
①使用hive自带的concatenate工具进行小文件的合并,但是只能对rcFile和ORC格式存储的表,alter table tableName partition(col='xxx') concatenate; 只能针对分区使用
②创建和原表相同结构的临时表,设置参数,将原表数据写入临时表,此时临时表的小文件就已经减少了,删除原表,然后直接将临时表改名即可,
设置的参数为
set mapred.max.split.size=25000000;
set mapred.min.split.size.per.node=10000000;
set hive.hadoop.supports.splittable.combineinputformat=true;
set mapred.min.split.size.per.rack=10000000;
set hive.exec.compress.output=true;
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=256000000;
set hive.merge.smallfiles.avgsize=16000000;
set hive.input.format=org.apache.hadoop.hive.q

最低0.47元/天 解锁文章
753

被折叠的 条评论
为什么被折叠?



