9.4数据倾斜9.4.1合理设置Map数。通常情况下,作业会通过input的目录产生一个或多个map任务。主要的决定因素包括input的文件总个数、input的文件大小以及集群设置的文件块大小。是不是map数越多越好?答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成。而一个map任务启动和初始化的时间远远大于逻辑处理的时间,这会造成很大的资源浪费。同时可执行的map数也是受限的。是不是保证每个map处理接近128m的文件块,就高枕无忧了?答案也是不一定的。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或两个小字段,却有几千万的记录。如果map处理的逻辑比较复杂,用一个map任务去做肯定也比较耗时。针对上述问题,我们需要采取两种方式来解决:即减少map数和增加map数。9.4.2小文件合并以减少map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat则没有这种功能。执行set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 9.4.3复杂文件增加Map数,当input的文件都很大且任务逻辑复杂时,map执行非常缓慢,可以考虑增加Map数,使每个map处理的数据量减少,从而提高任务的执行效率。增加map的方法为:根据computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M公式调整。