数据倾斜的主要问题在于,某个分区数量很巨大,在做map运算的时候,将会发生别的分区task很快计算完成,但是某几个分区task的计算成为了系统的瓶颈,明显超过其他分区时间;
 
1.方案:Kafka的随机主题
如果kafka的topic和分区关联,而且kafka是专用的,那么其实kafka如果能够和随机主机,那么数据将会随机打入到各个分区中,这样可以解决数据热点问题;
 
2. 方案:将不可切割的文件转换为可切割文件
对于gzip这类文件最好转化为可切割文件;因为对于不可切割的压缩文件,将会作为一个单独分区来处理,比如8.5G压缩到了23.5M,但是因为数据量巨大,这个gzip文件所在的分区将会成为性能瓶颈。
 
3. 方案:调整并行度
大量的key分配到同一个分区/Task里面;spark在数据分区的时候,默认使用的HashPartition;通过增加/减少并行度,来对于热点key进行重新分区;
另外一种方式类似:自定义分区函数,将HashPartition中集中分配的key,通过自定义的方式进行分散处理;
 
4. 方案:Reduce侧的Join通过BroadCast转换为Map侧的Join
select... from t1 join t2 on t1.aa=t2.bb
这个sql语句spark正常的执行方式是t1表中map,t2表中数据map(t2表数据量表较小),然后reduce到一起进行关联操作;因为t1表返回的粒度和t2表返回数据粒度不一样,所以导致reduce侧分区可能出现倾斜;
对于这场场景处理,通常都是将t2表中的数据通过broadcast的方式广播到各个分区中;这样各个分区在map阶段就可以进行数据关联,避免了shuffle到reduce阶段再进行关联。
 
5. 方案:拆分热点key
如果倾斜发生在一张表A中(另外一张表数据B比较均匀),而且数据热点集中在少数几个key;
1. 把大表中这几个key单独拎出来:skewRDD,在拎出来的时候,对于key添加随机数,保证对这些(添加了前缀的)key进行合理分区;然后skewRDD和B表进行join;skewJoinedRDD;
2. 过滤A表中那几个key,形成unskewRDD,和B表做join,形成unskewJoinedRDD;
3. skewJoinedRDD和unskewJoinedRDD做union(联合);
 
6. 方案:大表key全部进行添加随机数,小表扩大N倍
如果热点key太多了,那么就需要:
1. 把大表A所有的key都添加随机值,这样,对于大表数据进行数据重新分区,比如48取随机数,填充到key的前面,通过“,”分割;
2. 对于小表B里面所有的数据都扩充N倍,比如数据1,现在有48条数据1,48条记录value都是一样的,但是key为“1,key”,“2,key“... "48, key"
3. 然后A,B做join,这样小表B中必然有一条会和A表关联上(其余47条记录成为冗余记录)
4. A,Bjoin结果做mapToPair,去掉之前前缀,结果集OK;
 
看了这么多的方案,你会发现其实本质就是发现了数据倾斜,考虑怎么将热点数据进行分散(重新分区);这里可以考虑kafka的随机分区;调整并行度;把倾斜的key对应数据单独拎出来进行分区,最后和不包含这些key的key做union;全体key添加随机数,导致全体数据重新分区,再对具有N倍冗余数据的小表进行join获取数据;
比较特殊两个方案一个是对于不可分割的数据的处理,尽量转化为可分割数据(比如压缩文件搞成非压缩文件);另外一个是将join的表(小表)通过broadcast将数据进行广播,reduce阶段的join转化为map阶段的join。
 
 
参考(我觉得作者有些神人之感)
 

spark数据倾斜的更多相关文章

  1. Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势

    原创文章,同步首发自作者个人博客转载请务必在文章开头处注明出处. 摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitio ...

  2. Spark 数据倾斜

    Spark 数据倾斜解决方案 2017年03月29日 17:09:58 阅读数:382 现象       当你的应用程序发生以下情况时你该考虑下数据倾斜的问题了: 绝大多数task都可以愉快的执行,总 ...

  3. spark 数据倾斜的一些表现

    spark 数据倾斜的一些表现 https://yq.aliyun.com/articles/62541

  4. Spark数据倾斜解决方案(转)

    本文转发自技术世界,原文链接 http://www.jasongj.com/spark/skew/ Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势  发表于 2017 ...

  5. spark数据倾斜处理

    spark数据倾斜处理 危害: 当出现数据倾斜时,小量任务耗时远高于其它任务,从而使得整体耗时过大,未能充分发挥分布式系统的并行计算优势. 当发生数据倾斜时,部分任务处理的数据量过大,可能造成内存不足 ...

  6. 最详细10招Spark数据倾斜调优

    最详细10招Spark数据倾斜调优 数据量大并不可怕,可怕的是数据倾斜 . 数据倾斜发生的现象 绝大多数 task 执行得都非常快,但个别 task 执行极慢. 数据倾斜发生的原理 在进行 shuff ...

  7. Spark数据倾斜及解决方案

    一.场景 1.绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有100个task,97个task都在1s之内执行完了,但是剩余的task却要一两分钟.这种情况很常见. 2.原本能够正 ...

  8. Spark 数据倾斜调优

    一.what is a shuffle? 1.1 shuffle简介 一个stage执行完后,下一个stage开始执行的每个task会从上一个stage执行的task所在的节点,通过网络传输获取tas ...

  9. Spark数据倾斜解决方案及shuffle原理

    数据倾斜调优与shuffle调优 数据倾斜发生时的现象 1)个别task的执行速度明显慢于绝大多数task(常见情况) 2)spark作业突然报OOM异常(少见情况) 数据倾斜发生的原理 在进行shu ...

随机推荐

  1. 基于zuul实现自定义路由源码分析

    ZuulFilter定义 通过继承ZuulFilter我们可以定义一个新的过滤器,如下 public class IpAddressFilter extends ZuulFilter { @Autow ...

  2. SSH执行远程命令和传送数据

    $ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub ...

  3. angularjs 中的$digest和$apply区别

    $digest和$apply 在Angular中,有$apply和$digest两个函数,我们刚才是通过$digest来让这个数据应用到界面上.但这个时候,也可以不用$digest,而是使用$appl ...

  4. laravel中通过查询构造器,实现数据的curd

    //查询构造器: public function query1(){ //利用查询构造器,插入数据: /*$num=DB::table('student')->insert( ['name'=& ...

  5. QT环境下实现UI界面的“拼图游戏”

    main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *ar ...

  6. ThreadPoolTaskExecutor多线程使用,及线程池配置

    1.配置 ThreadPoolTaskExecutor bean <?xml version="1.0" encoding="UTF-8"?> &l ...

  7. 软考------(抽象类、接口) 策略设计模式(strategy) 应用

    某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征.需要模拟的飞机种类及其特征如表5-1所示. #include <iostream> #include ...

  8. MQTT连接服务器返回2

    /********************************************************************************* * MQTT连接服务器返回2 * ...

  9. ACM 常见词汇

    rectangular 美:  [rek'tæŋɡjələr] 英:  [rek'tæŋɡjʊlə(r)] adj. 矩形的:成直角的   grid 美:  [ɡrɪd] 英:  [ɡrɪd] n. ...

  10. mac 常用开发软件列表

    toolbox app jetbrains系开发工具箱,包含了phpstorm idea等开发工具 Postman 接口调试工具,有插件版和单独的app两种.类似paw Sublime 文本编辑器,类 ...