Hive基本调优

调优

推测执行

  1. 集群中NM/机器的负载是不一样
  2. 集群中机器的配置不同
  3. 数据倾斜
    一个job有100个reducer,其中99个很快运行完,只有最后一个花费很长的执行时间,那么这个job它的运行时长是取决于最慢的一个task,也就是长尾作业
    参数:hive.mapred.reduce.tasks.speculative.execution,默认是true

并行执行
并行的前提:多个task之间是没有依赖的
参数:hive.exec.parallel,默认是false
hive.exec.parallel.thread.number,打开并行度,一次执行的job个数,默认是8个

JVM重用
MapTask/ReduceTask其实都是以进程的方式运行的,那么有多少个task就会启动多少个JVM;当task运行完之后该JVM就会被销毁;JVM启动和销毁需要资源的开销;所有需要设置每个JVM可以执行多个task
参数:mapred.job.reuse.jvm.num.tasks,默认是1

Predicate Pushdown
打开谓词下推:hive.optimize.ppd=true

Reduce阶段优化

调整方式:
– set hive.exec.reducers.bytes.per.reducer
每个reduce能够处理的数据量大小,默认是256M
– set hive.exec.reducers.max
最大可以开启的reduce个数,默认是1099个
在只配了hive.exec.reducers.bytes.per.reducer以及hive.exec.reducers.max的情况下,实际的reduce个数 = InputFileSize / bytes per reducer来决定。
– set mapred.reduce.tasks=-1
实际运行的reduce个数,默认是-1,可以认为指定,但是如果认为在此指定了,那么就不会通过实际的总数据量/hive.exec.reducers.bytes.per.reducer来决定reduce的个数了

数据倾斜处理方案

1 设置参数
1)设置hive.map.aggr=true //开启map端部分聚合功能,就是将key相同的归到一起,减少数据量,这样就可以相对地减少进入reduce的数据量,在一定程度上可以提高性能,当然,如果数据的减少量微乎其微,那对性能的影响几乎没啥变化。
2)设置hive.groupby.skewindata=true //如果发生了数据倾斜就可以通过它来进行负载均衡。当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照Key 分布到 Reduce 中(这个过程是按照key的hash值进行分区的,不同于mr job1的随机分配,这次可以保证相同的Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。所以它主要就是先通过第一个mr job将key随机分配到reduce,使得会造成数据倾斜的key可能被分配到不同的reduce上,从而达到负载均衡的目的。到第二个mr job中,因为第一个mr job已经在reduce中对这些数据进行了部分聚合(就像单词统计的例子,a这个字母在不同的reduce中,已经算出它在每个reduce中的个数,但是最终的总的个数还没算出来,那么就将它传到第二个mr job,这样就可以得到总的单词个数),所以这里直接进行最后的聚合就可以了。
3)hive.exec.reducers.bytes.per.reducer= (单位是字节)
每个reduce能够处理的数据量大小,默认是256M
4)hive.exec.reducers.max=999
最大可以开启的reduce个数,默认是999个
在只配了hive.exec.reducers.bytes.per.reducer以及hive.exec.reducers.max的情况下,实际的reduce个数会根据实际的数据总量/每个reduce处理的数据量来决定。
5)mapred.reduce.tasks=-1
实际运行的reduce个数,默认是-1,可以认为指定,但是如果认为在此指定了,那么就不会通过实际的总数据量/hive.exec.reducers.bytes.per.reducer来决定reduce的个数了。

大表和大表的数据倾斜

HIVE Skewed Table

Skewed Table可以提高有一个或多个列有倾斜值的表的性能,通过指定经常出现的值(严重倾斜),hive将会在元数据中记录这些倾斜的列名和值,在join时能够进行优化。若是指定了STORED AS DIRECTORIES,也就是使用列表桶(ListBucketing),hive会对倾斜的值建立子目录,查询会更加得到优化。

可以再创建表是指定为 Skewed Table,如下例子,STORED AS DIRECTORIES是可选择的,它指定了使用列表桶(ListBucketing)

CREATE TABLE list_bucket_single (key STRING, value STRING)
  SKEWED BY (key) ON (1,5,6) [STORED AS DIRECTORIES];

你也可以使用多个列创建Skewed Table,如下使用两列

CREATE TABLE list_bucket_multiple (col1 STRING, col2 int, col3 STRING)
  SKEWED BY (col1, col2) ON (('s1',1), ('s3',3), ('s13',13), ('s78',78)) [STORED AS DIRECTORIES];

Hive Sort Merge Bucket Map Join(大表关联)

Hive 桶

对于每一个表(table)或者分区, Hive可以进一步组织成桶,
也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。
Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:

(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。
具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。
比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。
那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。

(2)使取样(sampling)更高效。在处理大规模数据集时,
在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,
会带来很多方便。

SKEW请参考:https://blog.csdn.net/mhtian2015/article/details/78931236
https://blog.csdn.net/yjgithub/article/details/66972966

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值