锁屏面试题百日百刷-Hive篇(十二)

 锁屏面试题百日百刷,每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容,还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你在面试中先人一步!接下来的是今日的面试题:

1.如果数据量很大或者出现了数据倾斜比较严重的情况,如何来优化呢?

表连接数据倾斜(Join skewin)

(1)运行时优化

set hive.optimize.skewjoin=true;

默认关闭。

如果大表和大表进行join操作,则可采用skewjoin(倾斜关联)来开启对倾斜数据的优化。

skewjoin原理:

1. 对于skewjoin.key,在执行job时,将它们存入临时的HDFS目录,其它数据正常执行

2. 对倾斜数据开启map join操作(多个map并行处理),对非倾斜值采取普通join操作

3. 将倾斜数据集和非倾斜数据集进行合并Union操作。

开启skewin以后,究竟多大的数据才会被认为是倾斜了的数据呢?

set hive.skewjoin.key=100000;

默认值100000。

如果join的key对应的记录条数超过这个值,就认为这个key产生了数据倾斜,则会对其进行分拆优化。

(2)编译时优化

上面的配置项其实应该理解为hive.optimize.skewjoin.runtime,也就是sql运行时来对偏斜信息进行优化;除此之外还有另外一个配置:

set hive.optimize.skewjoin.compiletime=true;

默认关闭。

此参数的用处和上面的hive.optimize.skewjoin一致,但在编译sql时就已经将执行计划优化完毕。但要注意的是,只有在表的元数据中存储的有数据倾斜信息时,才能生效。因此建议runtime和compiletime都设置为true。

可以通过建表语句来指定数据倾斜元数据:

CREATE TABLE list_bucket_single (key STRING, value STRING) -- 倾斜的字段和需要拆分的key值

SKEWED BY (key) ON (1,5,6) -- 为倾斜值创建子目录单独存放

[STORED AS DIRECTORIES];

(3)Union优化

应用了表连接倾斜优化以后,会在执行计划中插入一个新的union操作,此时建议开启对union的优化配置:

set hive.optimize.union.remove=true;

默认关闭。

此项配置减少对Union all子查询中间结果的二次读写,可以避免union输出的额外扫描过程,当我们开启了skewjoin时尤其有用,建议同时开启。

set hive.optimize.skewjoin=true;

set hive.optimize.skewjoin.compiletime=true;

set hive.optimize.union.remove=true;

                                                   分组统计数据倾斜(Groupby skewin)

(1)Map阶段聚合

hive.map.aggr=true;

开启map端combiner。此配置可以在group by语句中提高HiveQL聚合的执行性能。这个设置可以将顶层的聚合操作放在Map阶段执行,从而减轻数据传输和Reduce阶段的执行时间,提升总体性能。默认开启,无需显示声明。

(2)两个MRJob

hive.groupby.skewindata=true;

默认关闭。

这个配置项是用于决定group by操作是否支持倾斜数据的负载均衡处理。当数据出现倾斜时,如果该变量设置为true,那么Hive会自动进行负载均衡。

当选项设定为 true,生成的查询计划会有两个 MR Job。

第一个MR Job中,Map 的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;

第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

注意:在多个列上进行的去重操作与hive环境变量hive.groupby.skewindata存在冲突。

当hive.groupby.skewindata=true时,hive不支持多列上的去重操作,并报错:

Error in semantic analysis: DISTINCT on different columns notsupported with skew in data. 比如:

(1) SELECT count(DISTINCT uid) FROM log

(2) SELECT ip, count(DISTINCT uid) FROM log GROUP BY ip

(3) SELECT ip, count(DISTINCT uid, uname) FROMlog GROUP BY ip

(4) SELECT ip, count(DISTINCTuid), count(DISTINCT uname) FROMlog GROUP BY ip

1、2、3能够正常执行,但是4会报错。

2.什么是Row Group Index

一个ORC文件包含一个或多个stripes(groups of row data),每个stripe中包含了每个

column的min/max值的索引数据,当查询中有<,>,=的操作时,会根据min/max值,跳过

扫描不包含的stripes。

而其中为每个stripe建立的包含min/max值的索引,就称为Row Group Index行组索引,

也叫min-max Index大小对比索引,或者Storage Index。

在建立ORC格式表时,指定表参数’orc.create.index’=’true’之后,便会建立Row Group

Index,需要注意的是,为了使Row Group Index有效利用,向表中加载数据时,必须对需

要使用索引的字段进行排序,否则,min/max会失去意义。另外,这种索引主要用于数值

型字段的查询过滤优化上。

设置hive.optimize.index.filter为true,并重启hive

创建表:

CREATE TABLE lxw1234_orc2 stored AS ORC

TBLPROPERTIES

(

'orc.compress'='SNAPPY', -- 开启行组索引

'orc.create.index'='true' )

AS

SELECT CAST(siteid AS INT) AS id, pcid

FROM lxw1234_text -- 插入的数据保持排序

DISTRIBUTE BY id sort BY id;

查询:

set hive.optimize.index.filter=true;

SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 1382 AND id <= 1399;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值