大家好,欢迎来到IT知识分享网。
我们在集群上提交hive作业时,通过打印的运行日志可以看到hive作业有多少个job、多少个mappper、多少个reducer。那么这些数值是如何确定的呢?本篇文章略作分析。
一、job数
job数可以理解为要执行完成这个hive sql,总共要分多少步。hive有个语法解析器,可以对hive sql进行解析,确定有多少步骤(stage),多少个stage就是多少个job。可以使用explain对hive sql查看执行计划,可以知道有多少个job数了。
关于job数的优化,大体上有两个思路:一是减少job数;二是并行化。
减少job数:减少job数就是总的步骤变少了,因此可能会加快执行速度(当然单位时间消耗的资源也更多了)。具体要看解析器对hive是怎么解析的,目前网上资料显示有2个方向可以减少job数,笔者并未尝试过,仅做简单介绍。一是合理使用union all。这个合理使用是说,如果有一些union all的操作,你要把union all的语句放在子查询里面,这样才能有效减少job数。二是多表join的时候,要尽可能都选用一个关联字段。这个意思是说,当多表join,且可以使用多个关联字段的时候(例如,既可以用user_name去关联,也可以用user_id去关联),所有的关联键都要统一,这样能减少job数。
并行化:并行化的思路很好理解,就是我不减少job数,但可以让一些不互相依赖的job并行执行,这样就整体上加快了执行速度。并行化只需要在hive作业里加上参数set hive.exec.parallel=true 即可。当然这个参数是否生效还要看代码里面的job是否有可以并行执行的部分、集群资源是否充足等。
二、mapper数和reducer数
首先要明确一点,就是mapper数和reducer数,不是越多越好、也不是越少越好,要看实际的情况,两者都要在一个合理的范围。
2.1 mapper数
先说mapper数量,mapper的数量主要取决于输入的文件大小(total_size)、集群设定的文件块大小(dfs.block.size)、mapred.min.split.size(split最小值)、mapred.max.split.size(split最大值),有公式一:
mapper_num=min(total_size/max(mapred.min.split.size, min(mapred.max.split.size, dfs.block.size)),max(mapred.map.tasks,total_size/dfs.block.size))
mapper数不是越多越好:如果一个任务输入了小文件(远小于文件块大小128m),那么每个小文件也会被当做一个块,用一个mapper任务来完成,但大量的mapper启动和初始化会带来时间浪费和资源浪费,这个时候是要考虑减少mapper数量的,具体办法是合并小文件、减少mapper数:
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat #进行小文件合并
set mapred.max.split.size=256000000; #每个Map最大输入大小,小于256M的全部合并
set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小 ,决定了多个data node上的文件是否需要合并
set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小,决定了多个交换机上的文件是否需要合并
mapper数也不是越少越好:比如当输入文件小于120M,但却包含几千万的记录时,如果用默认的1个mapper去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。
根据公式一,想增加mapper个数,则设置mapred.map.tasks 为一个较大的值。如果想减小map个数,则可以设置mapred.min.split.size 为一个较大的值。
2.2 reducer数
reducer数量要简单一些,有公式二:
reducer_num = min(total_size/hive.exec.reducers.bytes.per.reducers, hive.exec.reducers.max)
其中hive.exec.reducers.bytes.per.reducers表示每个reduce任务处理的数据量,hive.exec.reducers.max表示每个任务最大的reduce数。
当然,如果设置了mapred.reduce.tasks这个参数,那么reduce的task的数量就直接是这个了,如果没有设置这个参数,那么具体的reduce的数量参照公式二确定。
三、总结
设置合适的job数、mapper数和reducer数,对查询效率有很重要的影响,是hive优化的重要方面。同时需要指出的是,很多参数可能在大数据平台上已经默认设置好了,并不一定需要手动设置(比如小文件合并、并行执行等),具体要看实际的场景。上面的两个公式也不一定好记,开发人员要多根据实际使用、调试加深理解。
附(参考资料):
https://blog.csdn.net/things_use/article/details/105810032
https://blog.csdn.net/evo_steven/article/details/16961619
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6237.html