Hive企业级PB级数据倾斜优化大全(建议收藏)「建议收藏」

Hive企业级PB级数据倾斜优化大全(建议收藏)「建议收藏」背景:由于数据倾斜,导致某一个或者几个reduce任务一直卡住在99%。特别当数据量越来越多的情况下,更加容易发生。

大家好,欢迎来到IT知识分享网。

背景:由于数据倾斜,导致某一个或者几个reduce任务一直卡住在99%。特别当数据量越来越多的情况下,更加容易发生。MR程序从map到reduce的过程中shuffle过程,hadoop默认按照key的hash值进行分区,那么当某个key过多时,这个key都进行同一个reduce处理,就会导致数据倾斜。

注意还有一种倾斜,发生在map阶段,对,你没看错。map也会发生数据倾斜,任务对压缩的数据文件进行读取之前,会进行切分。默认128M一个块,但对文件采用不支持切分的压缩算法时,任务读取时无法切分,就只能一个map去读取这个文件。如果一个超大及不支持切分的文件都有有一个map去读取就会产生倾斜。

总结:核心目的主要体现在两个层面——尽可能的减小数据集、尽可能将map产生的结果均匀的分布到reduce。


数据倾斜情形与解决方式

1.不同数据类型join产生的数据倾斜

关联A表与B表,两边关联的id类型不一致。A表id是string类型,B表id是int类型,当关联时 Hive的hash默认会按照int类型的id分配这样string类型都会被当成同一个id,结果所有string类型字段都会进入同一个reduce中,这样就会导致倾斜

解决秘籍:

可以把int类型的id全部cast成string类型之后在join,这样hash就会按照string类型进行分区了。这样就解决数据倾斜了!

Hive企业级PB级数据倾斜优化大全(建议收藏)「建议收藏」

2.热点key group by操作产生数据倾斜

对于某个key的数据占绝大部分,那么map出来之后,按照默认的hash进行分配这些key都会进入同一个reduce中,那么等着你的就是数据倾斜。

解决秘籍:

同理,我们就要想方法不要这些key都进入同一个reduce中。这里可以在key之后拼接一个随机数,然后再按照拼接之后的key,再进行hash分区,这样就可以保证“key”平均的分配到reduce中,之后再切割出原来key出来。秒啊!,这样就可以消除热点key的问题!

方案1:

Hive企业级PB级数据倾斜优化大全(建议收藏)「建议收藏」

Hive企业级PB级数据倾斜优化大全(建议收藏)「建议收藏」

方案2:

通过hive本身提供的参数设置

(1)是否在 Map 端进行聚合,默认为 True

set hive.map.aggr = true

(2)在 Map 端进行聚合操作的条目数目

set hive.groupby.mapaggr.checkinterval = 100000

(3)有数据倾斜的时候进行负载均衡(默认是 false)

set hive.groupby.skewindata = true

当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

3.关联id空值产生的数据倾斜

同样,id存在大量null值时,再关联时,shuffle阶段就会把null值都会发往同一个reduce中处理。这样也会引发数据倾斜

这也是生产上经常出现的场景。

解决秘籍:

3.1 如果null值字段所在行的其他字段的数据也不需要时,就提前过滤掉,不让其参与join操作就可以。

Hive企业级PB级数据倾斜优化大全(建议收藏)「建议收藏」

3.2 如果其他字段的数据也要的话,就可以赋予随机值,可以让其平均进入reduce中

Hive企业级PB级数据倾斜优化大全(建议收藏)「建议收藏」

4.表关联时产生的数据倾斜

如果表关联的键存在倾斜,那么在 Shuffle 阶段必然会引起数据倾斜。

解决秘籍:

通常做法是将倾斜的数据存到分布式缓存中,分发到各个Map任务所在节点。在Map阶段完成join操作,即MapJoin,这避免了 Shuffle,从而避免了数据倾斜。

MapJoin是Hive的一种优化操作,其适用于小表JOIN大表的场景,由于表的JOIN操作是在Map端且在内存进行的,所以其并不需要启动Reduce任务也就不需要经过shuffle阶段,从而能在一定程度上节省资源提高JOIN效率。

–开启 MapJoin 参数设置

set hive.auto.convert.join = true; 默认为 true

–大表小表的阈值设置,如果表的大小小于25M就会被加载进内存中。

set hive.mapjoin.smalltable.filesize = 25000000;

–调整map端的内存大小,可以调大的

set mapreduce.map.memory.mb=4096;

–调整reduce端的内存大小

set mapreduce.reduce.memory.mb=4096;

5.map阶段倾斜的,遇到超大不可切分的数据文件

根据数据的访问频率情况,选择性的对数据采用的压缩算法。对不可切割的压缩算法,极易出现单个map读取数据。

解决秘籍:

针对这种情况,输入只能采用读取之后再采用可支持切分的压缩算法,防止不可切分的超大数据集产生。

写在最后的话:原创不易,点赞关注转发支持一波,持续输出的原动力。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6232.html

(0)
上一篇 2022-12-17 10:40
下一篇 2022-12-17 11:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信