Hive的优化(十三)

1. 前言

Hive的底层是MapReduce,当数据量太大时,往往可以通过并行来提高效率,比如通过Partition实现运行多个Reduce,可是如果处理不当则容易引发数据倾斜,从而导致效率降低,这就涉及Hive的优化。Hive的优化主要分为MapReduce优化、·配置优化和程序优化。

2. MapReduce优化

HQL解析之后会成为MapReduce程序,所以可以从MapReduce运行的角度来考虑性能优化。
首先考虑的是要避免数据倾斜。在处理大批量数据时,可以通过Partition分区将数据分发到不同的Reduce中进行处理,可是如果分配不当,则可能造成某个Reduce中处理千万条数据,有的Reduce中只处理几十条数据,这就造成了数据倾斜。
另外,应当尽量避免大量的Job,因为Job数较多的作业往往运行效率比较低。比如有十几张表,并多次关联,则可能会产生十几个甚至几十个Job,而Job的初始化等操作都是比较耗费资源的,在这种情况下会造成性能低下。

3. 配置优化

3.1 列裁剪

列裁剪的意思是忽略不需要的列,Hive在读取数据的时候,可以仅仅读取需要用到的列,而不需要把所有的列都读取出来。

3.2 分区裁剪

另外一个参数优化的方式是在查询过程中减少不必要的分区,分区参数为:hive.optimize.pruner=true (默认值为真)。

3.3 join操作

在写join操作的代码时,最好将数目少的表或者子查询放在join操作符的左边,主要原因是在Reduce阶段,处在join左边的表内容会被加载进内存中。同时,对于一个key来说,对应的value值小的放在前面,value值大的放在后面,这也是”小表放前“原则。

3.4 GROUP BY操作

  1. Map端部分聚合

由于并不是所有的聚合操作都必须要在Reduce端进行,很多聚合操作可以先在Map端进行聚合,接着在Reduce端得出最终结果。这时需要修改的参数是hive.map.aggr=true,这个参数用于设定是否需要在Map端进行聚合。另外一个参数是hive.groupby.mapaggr.checkinterval,用于设定Map端进行聚合操作的条目数。

  1. 在有数据倾斜时进行负载均衡

相关参数:hive.groupby.skewindata,当设置为true时,生成的查询计划会有两个MapReduce任务。其中,第一个MapReduce任务中,Map的输出结果会被随机分布到Reduce中,接着每个Reduce做部分聚合操作,并输出结果。

4. 小结

Hive的操作有很多,,但是就到这里吧,有时间再回头深究。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值