文档章节

关于数据倾斜的解决方案

Ghost_Y
 Ghost_Y
发布于 2017/03/20 14:26
字数 1662
阅读 562
收藏 0

数据倾斜:并行处理的数据集中,某一部分的数据显著多于其他部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈。

spark中同一个stage的不同partition可以并行处理,而具有依赖关系的不同的stage之间只能串行处理。

一个stage可以包含N个task,这N个task可以并行执行,因此一个stage耗费的时间是由最慢的那个task来决定的。

同一个stage内的所有task都是执行相同的计算,在排除不同节点计算能力有不同外,不同的task之间执行时间的差异主要是由该task所处理的数据量来决定的。

stage处理的数据源主要来自两类:从数据源读取,如HDFS、Kafka等;读取依赖关系中前一个stage的shuffle输出数据。

缓解或消除数据倾斜的方案

1.尽量避免数据源的数据倾斜

2.调整并行度,分散同一个task的不同Key

      spark在做shuffle操作时,默认使用的HashPartitioner对数据进行分区。并行度设置不合理,会造成大量不同key对应的数据被分配到同一个task上,造成该task所处理的数据量远大于同stage中其他的task,从而导致数据倾斜。

适用场景:大量不同的key被分配到相同的task,造成该task数据量过大。

解决方案:调整并行度;一般是增大并行度,但有时候减少并行度也能达到效果。

优势:实现简单,可以在需要shuffle的操作算子上直接设置并行度,或者使用spark.default.parallelism设置;如果是Spark SQL操作,可以设置SET spark.sql.shuffle.partitions=[num_tasks];如果出现数据倾斜,可以先用该方法试验机次,如果不能解决问题,再尝试其他方法。

劣势:适用场景少,只能将分配到同一task的不同Key分散开,但是对于同一个key倾斜严重的情况则不适用;并且该方法只能缓解数据倾斜,没有彻底消除,效果一般。

3.自定义Partitioner

      使用自定义的Partitioner,将原本被分配到同一个task的不同key分配到不同的task。

适用场景:大量不同的key被分配到相同的task,造成该task数据量过大。

解决方案:使用自定义的Partitioner实现类,代替原本默认的HashPartitioner,尽量将所有不同的key均匀分配到不同的task中。

优势:不影响原有的并行度设计。因为如果改变了并行度,后续的stage的并行度也会默认改变,可能会影响后续的stage。

劣势:适用场景有限,智能将不同的key分散开,对于同一key对应数据集非常大的场景不适用。效果与调整并行度类似,只能缓解数据倾斜,不能消除;还需要根据特定的数据特点自定义专用的Partitioner,不够灵活。

4.将Reduce side Join转变成Map side Join

      通过spark的Broadcast(广播)机制,将reduce侧Join转化为Map侧Join,避免Shuffle从而完全消除因shuffle带来的数据倾斜。

适用场景:参与Join的一侧数据集足够小,可以被加载进Driver并通过Broadcast方法广播到各个Executor中。

解决方案:在Java/Scala代码中将小数据集数据拉取到Driver,然后通过broadcast方法将小数据集数据广播到各个Executor。或者是在Spark SQL中,将broadcast的阈值调整的足够大(SET spark.sql.autoBroadcastJoinThreshold=104857600),从而使broadcast生效,进而把reduce侧Join转化为Map侧Join。

优势:避免了shuffle,彻底的消除了数据倾斜产生的条件,极大提升性能。

劣势:要求参与Join的一侧数据集足够小,并且主要适用于Join的场景,不适合聚合的场景,条件有限。

5.为倾斜(skew)的key增加随机的前/后缀

      为数据量特别大的key增加随机的前/后缀,使得原来key相同的数据变为key不同的数据,从而使倾斜的数据集分散到不同的task中,彻底解决数据倾斜问题。Join另一侧的数据中,与倾斜key对应的部分数据,与随机前缀集作笛卡尔乘积,从而保证无论数据倾斜key如何加前缀,都能与之正常Join。

适用场景:两张表都比较大,无法使用Map侧Join。其中一个RDD有少数几个key的数据量过大,另外一个RDD的key分布比较均匀。

解决方案:将有数据倾斜的RDD中倾斜key对应的数据集单独抽取出来加上随机前缀,另外一个RDD每条数据分别与随机前缀结合形成新的RDD(相当于将其数据增加到原来的N倍,N即为随机前缀的个数),然后将二者Join并去掉前缀;然后将不包含倾斜key的剩余数据进行Join;最后将两次Join的结果集通过union合并,即可得到全部Join的结果。

优势:相对于Map侧Join,更能适应大数据集的Join。如果资源充足,倾斜部分数据集与非倾斜部分数据集可并行进行,效率明显提升;并且针对倾斜部分数据做数据扩展,增加的资源消耗有限。

劣势:如果倾斜key非常多,则另一侧数据膨胀非常大,此方案就不适用。而且此时对倾斜key与非倾斜key分开处理,需要扫描数据集两遍,增大了开销。

6.大表随机添加N种随机前缀,小表扩大N倍

      如果出现数据倾斜的key比较多,上一种方法将这些大量的倾斜key分拆出来,意义不大。此时更适合直接对存在数据倾斜的数据集全部加上随机前缀,然后对另外一个不存在严重数据倾斜的数据集整体与随机前缀集作笛卡尔乘积。

适用场景:一个数据集中存在的倾斜key比较多,另外一个数据集数据分布比较均匀。

优势:对大部分场景都适用,效果不错。

劣势:需要将一个数据集整体扩大N倍,会增加资源消耗。

 

本文转载自:http://www.jasongj.com/spark/skew/

Ghost_Y
粉丝 0
博文 26
码字总数 676
作品 0
深圳
程序员
私信 提问
Spark性能优化篇三:数据倾斜调优

Spark性能优化篇三:数据倾斜调优 前言 1.数据倾斜调优 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 某个task执行特别慢的情况 某个task莫名其妙内存溢出...

u010262291
2018/05/30
0
0
hive 数据倾斜总结

数据倾斜总结 在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显。主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得...

八戒_o
2016/03/30
41
0
Spark性能优化指南—— 数据倾斜调优

数据倾斜调优 绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。这种情况很常见。 原本能够正...

datacube
2016/07/11
73
0
007.hive调优:大数据倾斜

-----成王败寇(陈小春) 原文章地址:http://www.tbdata.org/archives/2109 hive大数据倾斜总结 在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显。主要...

片刻
2014/01/17
543
0
Hive之数据倾斜的原因和解决方法

数据倾斜 数据倾斜的原因 1.1 操作 关键词 情形 后果 Join 其中一个表较小,但是key集中 分发到某一个或几个Reduce上的数据远高平均值 大表与大表,但是分桶的判断字段0值或空值过多 这些空值...

riseee
2018/06/07
38
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0
redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部