数据倾斜的主要问题在于,某个分区数量很巨大,在做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. C语言按行读文件及字符串分割

    #include<stdio.h> #include<iostream> using namespace std; int main() { char s[50]; char ...

  2. Django rest framework(2)----权限

    一 添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 #!/usr/bin/env python # coding:u ...

  3. HeaderExchangeClient

    HeaderExchangeClient 注释是DefaultMessageClient,类中定义了心跳定时器HeaderExchangeChannel 发送请求HeaderExchangeHandl ...

  4. laravel 连接同一服务器上多个数据库操作 、 连接多个不同服务器上的不同数据库操作以及多个数据库操作的事务处理

    !注意:标红的要注意区分开 第一步.配置.env文件(同一服务器上多个数据库) DB_CONNECTION=pgsqlDB_HOST=IP(例如:127.0.0.1)DB_PORT=端口号(例如:54 ...

  5. SQL Server 调优系列基础篇 - 性能调优介绍

    前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...

  6. 快速切题 hdu2416 Treasure of the Chimp Island 搜索 解题报告

    Treasure of the Chimp Island Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  7. webbrowser 静音(刷新、点击网页的声音)(包括flash静音)

    public enum INTERNETFEATURELIST { FEATURE_OBJECT_CACHING = 0, FEATURE_ZONE_ELEVATION = 1, FEATURE_MI ...

  8. spring学习笔记Core Technologies

    Spring 框架最重要的是Ioc(Inversion of Control)容器,在这个基础之上衍生出了AOP(Aspect-Oriented Programming)技术,80/20法则,这货可以 ...

  9. 关于Predynastic Egypt

    游戏界面(资源增加工人,工人产生资源) 解锁建筑(花费资源增加某一地区产出) 神灵祭祀(献祭资源获得临时buff,如减少建筑时间,一定回合内减少入侵几率,增加粮食产出,减少消耗资源等) 解锁科技(增加 ...

  10. ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: N O) MYSQL

    ERROR 1045 (28000): Access denied for user ODBC@localhost 刚使用mysql, 碰到这个问题.. C:\Program Files\MySQL\ ...