Hive系列(五)hive调优

1.1Hive 调优

explain 关键字

explain select * from psn;

2.Hive 优化

Hive运行方式:

  • 本地模式
  • 集群模式

本地模式:set.hive.exec.mode.local.auto=true;

本地有很多的限制:

  1. 文件个数不能超过四个
  2. hive.exec.mode.local.auto.inputbytes.max默认值为128M,表示加载文件的最大值,若大于该配置仍会以集群方式来运行!

测试使用select t1.*,t2.* from (select count(*) from demo)t1 ,(select count(*) from demo2) t2;

2.1 严格模式

#严格模式– 通过设置以下参数开启严格模式:
#   – (默认为:nonstrict非严格模式)
set hive.mapred.mode=strict;
set hive.mapred.mode=nonstrict;

#严格模式下查询限制:
#     1、对于分区表,必须添加where对于分区字段的条件过滤;
#     2、order by语句必须包含limit输出限制;
#     3、限制执行笛卡尔积的查询。

2.2 并行模式

设置并行后,不相互依赖的任务可以并行计算

#并行计算– 通过设置以下参数开启并行模式:
set hive.exec.parallel=true;

#注意:(一次SQL计算中允许并行执行的job个数的最大值)
set hive.exec.parallel.thread.number
#默认值 8

2.3 Hive排序

  • 1. Order By - 对于查询结果做全排序,只允许有一个reduce处理      

        (当数据量较大时,应慎用。严格模式下,必须结合limit来使用) –

  • 2. Sort By - 对于单个reduce的数据进行排序
  • 3. Distribute By - 分区排序,经常和Sort By结合使用
  • 4.  Cluster By - 相当于 Sort By + Distribute By

        (Cluster By不能通过asc、desc的方式指定排序规则; 可通过 distribute by column sort by column asc|desc 的方式)

2.4 Hive Join

2.4.1 map join 的两种方式:

 1、SQL方式,在SQL语句中添加MapJoin标记(mapjoin hint)

SELECT /*+ MAPJOIN(smallTable) */ smallTable.key, bigTable.value
FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key;

2、开启自动的MapJoin;通过修改以下配置启用自动的mapjoin

#该参数为true时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表使用
Map join
set hive.auto.convert.join = true;

注意:如果两个方式都设置了,要看设置的参数:

#(默认值:true;是否忽略mapjoin hint 即mapjoin标记)
# true 使用自动方式,false 使用手动方式
hive.ignore.mapjoin.hint;

小表的概念:是在系统中进行设置的设置的是文件发小(默认大概25M)

hive.mapjoin.smalltable.filesize;

2.4.2 Hive join

尽可能使用相同的连接键(会转化为一个MapReduce作业),意思为多表关联的时候尽量使用相同的条件

2.4.2 大表关联大表

  1. 空key过滤:有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发 送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很 多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。
  2. 空key转换:有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必 须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据 随机均匀地分不到不同的reducer上(很少)

2.4.5 map-side聚合

2.4.6 合并小文件

合并小文件

文件数目小,容易在文件存储端造成压力,给hdfs造成压力,影响效率 – 设置合并属性

设置合并属性

  1. 是否合并map输出文件:hive.merge.mapfiles=true
  2. 是否合并reduce输出文件:hive.merge.mapredfiles=true;
  3. 合并文件的大小:hive.merge.size.per.task=256*1000*1000

2.4.6 map和reduce数量

2.4.7 JVM重用

适用场景: 

  1. 小文件个数过多
  2. task个数过多

通过 set mapred.job.reuse.jvm.num.tasks=n; 来设置(n为task插槽个数)

缺点:设置开启之后,task插槽会一直占用资源,不论是否有task运行,直 到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值