8.分区分桶,合并小文件
为什么小文件需要合并?
1.小文件过多,MR处理数据时,会产生多个MapTask,然而每个MapTask处理的数据量很少,
那么导致MapTask启动时间大于执行时间,整体任务时间消耗较大
如何合并小文件:
1)在map执行前合并小文件,减少map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
2)在Map-Reduce的任务结束时合并小文件的设置:
2.1 在map-only任务结束时合并小文件,默认true
SET hive.merge.mapfiles = true;
-- 如果有一个HIVE表,小文件过多,可以通过select * from 表 只产生一个Map
-- 任务将原表中的小文件合并并输出至新表
2.2 在map-reduce任务结束时合并小文件,默认false
SET hive.merge.mapredfiles = true;
合并文件的大小,默认256M
SET hive.merge.size.per.task = 268435456;
当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
SET hive.merge.smallfiles.avgsize = 128000000;
3)--限制Map,Reduce数
set mapreduce.tasktracker.map.tasks.maximum=30; --每个nodemanager节点上可运行的最大map任务数,默认值2,可根据实际值调整为10~100;
set mapreduce.tasktracker.reduce.tasks.maximum=30; --每个nodemanager节点上可运行的最大reduce任务数,默认值2,可根据实际值调整为10~100;
4)--将多个小文件打包作为一个整体的inputsplit,减少map任务数
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set mapreduce.input.fileinputformat.split.maxsize=128000000; --切片大小最大值,不设置,则所有输入只启动一个map任务
set mapreduce.input.fileinputformat.split.minsize.per.node=16000000; --同一节点的数据块形成切片时,切片大小的最小值
5)
-- 最大split大小
set mapred.max.split.size=128000000;