HIVE Map和Reduce数量 优化点

一、Map的数量是怎么计算

代码位置:org.apache.hadoop.hive.ql.io.(HiveInputFormat | CombineHiveInputFormat)
函数:getSplits
Hive的HiveInputFormat类 是对 MR的InputFormat接口 的封装
下面介绍MR的Map数量获取

1、计算 splitSize
// org.apache.hadoop.mapred.FileInputFormat getSplits函数

// totalSize 是Map端输入的数据量, numSplits 是mapred.map.tasks参数值
long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
// minSize: mapred.min.split.size
long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);
// blockSize,文件物理划分成块,大小配置在hadoop-default.xml,它的默认值是64MB
long splitSize = Math.max(minSize, Math.min(goalSize, blockSize));

总结: max( 文件最小切割值, min(Map端输入量 / mapred.map.tasks, Hdfs Block Size) )

2、计算 Map数量:通过 splitSize 和 输入文件的数量和大小

例如: Map输入端有两个文件,一个40M,一个20M。 splitSize是30M。
最终会切分成3个Map (40M的文件切分成30M、10M, 20M的文件不切分)

Map数量 优化点
>>> 在什么情况下 应该增加Map数量
如果是CPU密集型任务、例如cube、rollup、UDF类,可以增加 mapred.map.tasks 数量 或者 增加mapred.min.split.size 

>>> 在什么情况下 应该减少Map数量
一般是合并输入的小文件
PS. Hive计算Map数量可以参考文章:hive小文件造成map多

二、Reduce的数量是怎么计算

代码位置:org.apache.hadoop.hive.ql.exec.mr.MapRedTask
函数:setNumberOfReducers、estimateNumberOfReducers

影响参数:

  • mapred.reduce.tasks (用户直接设定reduce的数量)
  • hive.exec.reducers.bytes.per.reducer (每个reduce处理的数据量)
  • hive.exec.reducers.max (reduce的最多数量)
  • hive.exec.infer.bucket.sort.num.buckets.power.two (暂不考虑)

处理步骤:
1、mapred.reduce.tasks 是否设置,有的话reduce数量直接为设置的数量
2、简单说:Map 端的输入数据量(totalInputFileSize)/ 每个reduce处理的数据量(hive.exec.reducers.bytes.per.reducer)

// 下面是具体代码
// bytesPerReducer: hive.exec.reducers.bytes.per.reducer
// maxReducers: hive.exec.reducers.max
double bytes = Math.max(totalInputFileSize, bytesPerReducer);
int reducers = (int) Math.ceil(bytes / bytesPerReducer);
reducers = Math.max(1, reducers);
reducers = Math.min(maxReducers, reducers);
Reduce数量 优化点
>>> 在什么情况下 应该增加Reduce数量
Map的输出量比输入量还大,比如有UDTF操作,单行变多行。
可以 hive.exec.reducers.bytes.per.reducer 参数值调低  或者 直接设置reduce数量。

>>> 在什么情况下 应该减少Reduce数量
Map的输出量相比输入量少很多,有大量的数据被过滤或聚合。
可以 直接设置reduce数量 或者 限定reduce个数的最大值。
参考文章

https://blog.csdn.net/u010824946/article/details/81772631
https://blog.csdn.net/moon_yang_bj/article/details/17901371
https://www.iteblog.com/archives/1697.html

你可能感兴趣的:(Hive)