这篇文章主要介绍了hive如何优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
Hive谓词下推(Predicate pushdown)
参数打开设置:hive.optimize.ppd=true
实现:在不影响结果的情况下,尽量将过滤条件提前执行。谓词下推后,过滤条件在map端执行,减少了map端的输出,降低了数据在集群上传输的量,节约了集群的资源,也提升了任务的性能。
开启Map端聚合功能
参数打开设置:hive.map.aggr=true
实现:在map中会做部分聚集操作,能够使map传送给reduce的数据量大大减少,从而在一定程度上减轻group by带来的数据倾斜。
小文件合并
参数设置:
set hive.merge.mapfiles = true ##在 map only 的任务结束时合并小文件
set hive.merge.mapredfiles = false ## true 时在 MapReduce 的任务结束时合并小文件
set hive.merge.size.per.task =256*1000*1000 ##合并文件的大小
set mapred.max.split.size=256000000; ##每个 Map 最大分割大小
set mapred.min.split.size.per.node=1; ##一个节点上 split 的最少值
sethive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; ##执行 Map 前进行小文件合并
实现:文件数目过多,会给HDFS带来压力,并且会影响处理效率,可以通过合并Map和Reduce的结果文件来消除这样的影响。
解决group by造成的数据倾斜
参数设置:hive.groupby.skewindata=true
实现:当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group ByKey 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce中),最后完成最终的聚合操作。
当hive.groupby.skewindata=true时,hive不支持多列上的去重操作,并报错:
Error in semanticanalysis: DISTINCT on different columns notsupported with skew in data.
并行执行
参数设置:
set hive.exec.parallel=true,可以开启并发执行。
set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
实现:Hive会将一个查询转化为一个或多个阶段,包括:MapReduce阶段、抽样阶段、合并阶段、limit阶段等。默认情况下,一次只执行一个阶段。不过,如果某些阶段不是互相依赖,是可以并行执行的。
限制笛卡尔积查询
两张表join时必须有on语句
参数设置:set hive.mapred.mode=strict
实现:即使数据量不大的情况下,笛卡尔积造成的数据压力也是很可观的,尽量在参数阶段进行限制,防止误操作。
SQL层面优化
对于复杂的逻辑加工,有以下几个原则:
1、数据量大的表应尽早进行数据筛选并可插入到一张临时表,比如按日期筛选或者地区等,再与其他表进行逻辑关联,可大大减少数据处理时间,这是最简单也是最有效的办法;
2、多个结果集union all的时候,可以使用逐个insertinto到结果表的方式,可提高数据处理速度;
3、join操作左表尽可能放置小表,MR的处理逻辑将小表缓存内存里,然后再去扫描大表,此时效率高;
4、hive虽然已经支持in/exists语法,少量查询也是可以用的,但是更推荐用left semi join形式改写一下,可以在数据量大的时候对比下两种写法效率;
5、还有一些基础的原则啰嗦下:sort by代替order by;group by代替distinct;多表join尽量key相同;空值在join中可能会造成数据倾斜,如果空值部分数据对结果集无影响,提前筛掉;等等~
实际生产中一定要结合业务和公司数据特点,某些优化也不是万能药膏,多些实践对比总会发现更多优化空间。
感谢你能够认真阅读完这篇文章,希望小编分享的“hive如何优化”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。