赞
踩
参考资料:
小文件过多的影响:
(1)小文件过多会导致namenode元数据特别大,占用过多内存,严重影响HDFS性能
(2)对Hive来说,在进行查询时,每个小文件都会当成一个块,启动一个Map任务来完成。如果文件过多的话,Map任务启动和初始化的时间可能远远大于逻辑处理的时间,就会造成很大的资源浪费。同时可执行的Map数量是受限的。
解决方法:
1. 使用 hive 自带的 concatenate 命令,自动合并小文件
- # 对于非分区表
- alter table A concatenate;
-
- # 对于分区表
- alter table B partition(day=20201224) concatenate;
注意:
1、concatenate 命令只支持 RCFILE 和 ORC 文件类型。
2、使用concatenate命令合并小文件时不能指定合并后的文件数量,但可以多次执行该命令。
3、当多次使用concatenate后文件数量不在变化,这个跟参数mapreduce.input.fileinputformat.split.minsize=256mb
的设置有关,可设定每个文件的最小size。
2. 调整参数减少Map数量
设置map输入合并小文件的相关参数:
- # 执行Map前进行小文件合并
- # CombineHiveInputFormat底层是 Hadoop的 CombineFileInputFormat 方法
- # 此方法是在mapper中将多个文件合成一个split作为输入
- set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 默认
-
- # 每个Map最大输入大小(这个值决定了合并后文件的数量)
- set mapred.max.split.size=256000000; -- 256M
-
- # 一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
- set mapred.min.split.size.per.node=100000000; -- 100M
-
- # 一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
- set mapred.min.split.size.per.rack=100000000; -- 100M
设置map输出和reduce输出进行合并的相关参数:
- #设置map端输出进行合并,默认为true
- set hive.merge.mapfiles = true;
-
- #设置reduce端输出进行合并,默认为false
- set hive.merge.mapredfiles = true;
-
- #设置合并文件的大小
- set hive.merge.size.per.task = 256*1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。