hive 调优

1. LIMIT限制调整

一般情况下,LIMIT语句需要执行整个查询局域,然后在返回部分结果的。因此这种情况通常是浪费的,所以应该进可能地避免出现这种情况。Hive有一个配置属性可以开启,当使用LIMIT语句时,其可以对数据源进行抽样。

2. JOIN优化

JOIN操作优化,一般讲最大的表放在JOIN的最右边或者直接使用/*streamtable(table_name)*/语句指出。

如果所有表中有一个表足够小,时可以完成载入内存中,那么这是Hive可以执行一个map-site join,这样可以减少reduce过程,有时可以减少map task任务。

3. 本地模式

对于大多数情况,Hive可以通过本地模式在单台机器上处理所有任务。对于小数据,执行时间可以明显被缩短。通过set hive.exec.mode.local.auto=true设置本地模式。

4. 并行模式

Hive会将一个查询转化成一个或者多个阶段。这样的阶段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段。默认情况下,Hive一次只会执行一个阶段,由于job包含多个阶段,而这些阶段并非完全互相依赖,即:这些阶段可以并行执行,可以缩短整个job的执行时间。设置参数:set hive.exec.parallel=true,或者通过配置文件来完成。

5. 严格模式

Hive提供一个严格模式,可以防止用户执行那些可能产生意想不到的影响查询,通过设置

Hive.mapred.modestrict来完成

6. 分区表限制

Where语句的条件字段如果非分区字段,则要求必须通过limit限制来执行。

7. ORDER BY语句

由于order by为了执行排序构成会将所有的结果数据分发到同一个reducer中进行处理,强制要求用户增加LIMIT语句可以防止reducer额外执行一段时间。

8. 限制笛卡尔乘积

对于表A,进行获取两个表的笛卡尔积,一般查询语句:

select * from A join B where A.id=B.id

对于关系型数据库通过where条件可以转为on语句,但是Hive并不会执行这种优化。因此,如果表足够大,那么这个查询就会出现不可控的情况。一般采用下面的方法来完成:

select * from A join B on a.id=b.id

 

9. 调整mapperreducer个数

默认情况下,Hive是按照输入的数据量大小来确认reducer个数的。其中属性:

Hive.exec.reducers.per.reducer默认为1GBHive默认的reducer个数应该是3,可以通过属性mapred.reduce.tasks的数值为不同的数值来确认,为控制资源的使用情况一般需要设置reducer任务的最大的数值,通过hive.exec.reducers.max可以阻止某个查询下消耗太多的reducer资源。一般可以在hive-site.xml来设置。

 

10. JVM重用

Hadoop通常是使用派生JVM来执行mapreduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含偶成百上千的task任务的情况。JVM重用可以使得JVM示例在同一个job中时候使用N此。通过参数mapred.job.reuse.jvm.num.tasks来设置。

 

11. 推测执行

Hadoop推测执行可以触发执行一些重复的任务,尽管因对重复的数据进行计算而导致消耗更多的计算资源,不过这个功能的目标是通过加快获取单个task的结果以侦测执行慢的TaskTracker加入到没名单的方式来提高整体的任务执行效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值