hive的优化

22 篇文章 0 订阅
17 篇文章 0 订阅

hive的优化

优化方式:

  • 1、环境优化(linux 句柄数、应用内存分配、是否负载等)
  • 2、应用配置属性方面的优化。
  • 3、代码优化(hql,尝试换一种hql的写法)。

学会看explain:解释执行计划

  1. explain :显示hql查询的计划。
hive>explain select * from one;
  1. explain extended :显示hql查询的计划。还会显示hql的抽象表达式树。(就是解释器干得事)
hive>explain extended select * from one;
  • 说明一个hql语句将会有一个或者多个stage构成。每一个stage相当于一个mr的job,
    stage可以是一个Fetch 、 map join 、 limit 等操作。每一个stage都会按照依赖关系依次执行,没有依赖关系的可以并行执行。一个hive的hql语句包含一个或者是多个stage,多个之间依赖越复杂,表示任务越复杂,执行效率越低。

对limit的优化:

这些是设置对limit的属性,这些可以在hive的hive-default.xml 文件中设置。

  • 设置是否默认开启limit优化
set hive.limit.optimize.enable=false//建议开启为true.
  • 设置使用limit最多可以查询多少行
set hive.limit.row.max.size=100000
  • 设置最多可以操作的文件数
set hive.limit.optimize.limit.file=10
  • 设置

对join的优化:

  • 永远是小表驱动大表(小结果集驱动大结果集)
  • 必要时候使用小表标识 +STREAMTABLE(小表别名)
  • 将业务调整为能尽量使用map-side join(开启map端的join)
  • 尽量避免笛卡尔积的join查询,即便有咯也需要使用on 或者where 来过滤。
  • hive目前的join 只支持等值连接(=)。其它的不行

使用hive本地模式(在一个jvm里面运行)

  • hive查询数据依靠的是hadoop
  • 是否开启本地模式,建议的是开启本地模式
hive.exec.mode.local.auto=false//true最好
hive.exec.mode.local.auto.inputbytes.max=134217728
hive.exec.mode.local.auto.input.files.max=4

hive并行执行(stage之间没有相互依赖关系的可以并行执行)

  • 是否开启并行
hive.exec.parallel=false 
  • 允许开启的并行数量
hive.exec.parallel.thread.number=8

设置mapper 和 reduce个数

  • mapper个数太多,启动耗时,个数太少,资源利用不充分
  • reducer个数太多,启动耗时,个数太少,资源利用不充分
  • mapper个数:
    • 手动设置:
    hive>set mapred.map.tasks=n;
    
  • 适当调整块大小,从而改变分片数,来改变mapper个数:
    • 通过合并文件小文件来减少mapper个数:
    mapred.max.split.size=25600000; 256M
    mapred.min.split.per.node=1
    mapred.min.split.per.rack=1
    hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
    
  • reducer个数
    • 手动设置:
    set mapreduce.job.reduces=-1;
    

hive使用jvm重用

  • 设置一个jvm中允许的task的数量
mapreduce.job.jvm.numtasks=1
  • 设置一个jvm中可以重用的task
mapred.job.reuse.jvm.num.tasks=8;  

数据倾斜

  • 解释:数据某列的值分布不均匀。

  • 造成数据倾斜的原因:

    • 1、原本数据就倾斜
    • 2、hql语句可能造成
    • 3、join 极容易造成
    • 4、count(distinct col)
    • 5、group by语句也容易
  • 解决方法:

    • 1、如果数据本身倾斜,看数据能否直接分离(找到倾斜的数据)
    • 2、将倾斜的数据单独出来计算,然后和正常的数据进行union all
    • 3、将倾斜的数据赋予随机数来进行join查询,均衡每个task的任务量。
    • 4、试图不变需求改写hql语句。
  • 倾斜解决的几个属性设置:

    • 设置进行group by的时候是否开启map端的聚合
    hive.map.aggr=true
    
    • 时候开启倾斜join的优化,建议是开启
    hive.groupby.skewindata=false 
    
    • 是否开启有倾斜数据的group by查询的优化
    hive.optimize.skewjoin=false  
    
job数量的控制
  • 连接查询的on中的连接字段类型尽可能相同。
  • 通常是一个简单hql语句生成一个job,有join 、limit 、group by 都将有可能会生成一个独立job。所以尽量避免这些语句的出现。

按需求和合理使用一下的技术:这些本身就是hive的一种优化。

  • 合理使用分区
  • 合理使用分桶
  • 合理使用索引
严格模式:

hive提供的严格模式阻挡三种查询:

  • 1、带有分区的表的查询
  • 2、带有orderby的查询
  • 3、join查询语句,不带on条件 或者 where条件。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值