Hive的底层查询原理,也是讲sql语句转化为map-reduce进行查询和计算的,所以设置正确的map和reduce的task的数量对查询效率有很重要的影响。
1. 设置mapper的task数量
在分布式计算系统中,决定map数量的一个因素就是原始数据,在不加干预的情况下,原始数据有多少个块,就可能有多少个起始的task,因为每个task对应要去读取一个块的数据;当然这个也不是绝对的,当文件数量特别多,并且每个文件的大小特别小,那么我们就可以限制减少初始map对相应的task的数量,以减少计算资源的浪费,如果文件数量较少,但是单个文件较大,我们就可以增加map的task的数量,以减小单个task的压力。
在hive里面有个决定mapper的task数量的参数:mapred.map.tasks,因为决定mapper的task的数量因素相对比较复杂,所以这个参数不一定起作用,具体决定mapper的task数量的过程如下:
(1)hive的文件基本上都是存储在HDFS上,而HDFS上的文件,都是分块儿的,所以具体的hive数据文件在HDFS上分多少块,就可能是默认的hive起始task的数量,我们记做:default_mapper_num。在网上还有人这么解释,就是用数据总大小除以dfs的默认最大块大小(total_size/dfs.block.size)来决定初始默认数据分区数,感