前言
通常情况下,作业会通过input目录产生一个或多个任务。
主要决定因素:
- input的文件总个数
- input的文件大小
- 集群设置的文件块大小
1. 是不是越多越好呢?
答案:不是!
原因:假如一个任务有很多小文件,并且文件大小远远小于块大小128M(默认值),则每个小文件也会被当作一个块,用一个map任务来完成,一个map任务启动和初始化的时间远大于逻辑处理时间,就会造成很大的资源浪费,
注意:同时可执行的map数量是有限制的。
解决方法:合并小文件
在map执行前合并小文件,减少map数。
HiveInputFormat:没有对小文件合并的功能。
CombineHiveInputFormat:具有合并小文件的功能(系统默认开启),如果不是这种格式,可以对hive.input.format选项进行设置:
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
2. 是不是越少越好呢?
答案:不一定!
原因:假如保证每个map处理的文件大小都接近128M,但是这个文件只有一个或者两个比较少的字段,却有上千万的记录,正常会用一个map去完成,但是如果处理的逻辑比较复杂,只用一个map任务的话,肯定会比较耗时。
解决方法:增加map数
当input文件很大且任务处理逻辑比较复杂,map执行非常慢的时候,可以增加map数来减少map处理的数据量,提高执行效率。
增加map的方法如下:
根据公式 computeSplitSize(Math.max(minSize,Math.min(maxSize,blockSize))),blockSize默认值128M,我们可以调整maxSize的值,使 maxSize < blockSize就可以增加map个数。
总结
在Hive中,map个数并不是越多越好,也不是越少越少越好,而是根据不同的使用场景来调整map个数,从而来提高整个作业的执行效率。