Hive 调整 Map 的个数

摘录自《Hive 性能调优实战》

在调优时不希望生成太多的 Map,而把计算任务的等待时间都耗费在 Map 的启动上;或者不希望生成太多的 Map 对某个文件进行操作,以免引起资源的争用。这时候就需要对 Map 进行控制。在 Hive 中配置“set mapred.map.tasks=task 数量”无法控制 Map 的任务数,调节 Map 任务数需要一套算法,该算法也和 InputFormat 有密切的关系,具体如下:

  1. 在默认情况下 Map 的个数 defaultNum = 目标文件或数据的总大小 totalSize/hdfs 集群文件块的大小 blocksize
  2. 当用户指定 mapred.map.tasks,即为用户期望的 Map 大小,用 expNum 表示,这个期望值计算引擎不会立即采纳,它会获取 mapred.map.tasks 与 defaultNum 的较大值,用 expMaxNum 表示,作为待定选项;
  3. 获取文件分片的大小和分片个数,分片大小为参数 mapred.min.split.size 和 blockSize 间的较大值,用 splitMaxSize 表示,将目标文件或数据的总大小除以 splitMaxSize 即为真实的分片个数,用 realSplitNum 表示;
  4. 获取 realSplitNum 和 expMaxNum 较小值则为实际的 Map 个数;

上述算法用代码表达如下:

defaultNum = totalSize/blockSize;
expNum = mapred.map.tasks;
expMaxNum = max(expNum, defaultNum);

splitMaxSize = max(mapred.min.split.size, blockSize)
realSplitNum = totalSize/splitMaxSize;

实际的 map 个数 = min(expMaxNu, realSplitNum)

通过上面的逻辑知道:

  • 减少 Map 个数,需要增大 mapred.min.split.size 的值,减少 mapred.map.tasks 的值;
  • 增大 Map 个数,需要减少 mapred.min.split.size 的值,增大 mapred.map.tasks 的值;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章