当Hive的输入由非常多个小文件组成时。假设不涉及文件合并的话。那么每一个小文件都会启动一个map task。
假设文件过小。以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费。甚至发生OutOfMemoryError错误。 因此,当我们启动一个任务时,假设发现输入数据量小但任务数量多时。须要注意在Map前端进行输入小文件合并操作。 同理。向一个表写数据时,注意观察reduce数量。注意输出文件大小。 1、 Map输入小文件合并 #每一个Map处理的最大输入文件大小(256MB) set mapred.max.split.size=256000000; #一个节点上split文件的最小值 set mapred.min.split.size.per.node=100000000; #一个交换机下split文件的最小值 set mapred.min.split.size.per.rack=100000000; #运行Map前进行小文件合并 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 在开启了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat 后, 一个data node节点上多个小文件会进行合并。合并文件数由mapred.max.split.size限制的大小决定。 mapred.min.split.size.per.node决定了多个data node上的文件是否须要合并 mapred.min.split.size.per.rack决定了多个交换机上的文件是否须要合并 2、输出文件合并 #在Map-Only的任务结束时就会合并小文件 set hive.merge.mapfiles = true; #在MapR-educe的任务结束时合并小文件 set hive.merge.mapredfiles = true;(默觉得false) #合并文件的大小 set hive.merge.size.per.task = 256*1000*1000; #当输出文件的平均大小小于该值时。启动一个独立的map-reduce任务进行文件merge set hive.merge.smallfiles.avgsize=16000000 ;