【使用场景】  

  对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小(例如几百MB或者1~2GB),比较适用此方案。

【解决方案】

  小表join大表转为小表broadcast+map大表实现。具体为:

  普通的join是会shuffle的,而一旦shuffle,就相当于会将相同key的数据拉取到一个shuffle read task中再进行join,此时就是reduce join,此时如果发生数据倾斜,影响处理性能,而此时恰好一个RDD是比较小的,则可以采用广播小RDD全量数据+map算子来实现与join同样的效果,也就是map join,因为这样不会发生shuffle,也就不会发生数据倾斜。

  也就是说,不使用join算子进行连接操作,而使用Broadcast变量与map类算子实现join操作,进而完全规避掉shuffle类的操作,彻底避免数据倾斜的发生和出现。将较小RDD中的数据直接通过collect算子拉取到Driver端的内存中来,然后对其创建一个Broadcast变量;接着对另外一个RDD执行map类算子,在算子函数内,从Broadcast变量中获取较小RDD的全量数据,与当前RDD的每一条数据按照连接key进行比对,如果连接key相同的话,那么就将两个RDD的数据需要的方式连接起来。

【方案优点】

  join操作导致的数据倾斜,效果非常好,因为根本就不会发生shuffle,也就根本不会发生数据倾斜,是一种治标治本的解决方案。

 

【方案局限】

  这个方案只适用于一个大表和一个小表join的情况。因为解决方案是需要将小表进行广播,此时会比较消耗内存资源driver和每个Executor内存中都会驻留一份小RDD的全量数据。如果广播出去的RDD数据比较大,比如10G以上,那么就可能发生内存溢出了。因此并不适合两个都是大表的情况。

【代码实现】

  我对上述方案做了代码实现,见我的github:https://github.com/wwcom614/Spark

  Java版实现

  Scala版实现

    下一篇:【Spark调优】大表join大表,少数key导致数据倾斜解决方案

  上一篇:【Spark调优】聚合操作数据倾斜解决方案

【Spark调优】小表join大表数据倾斜解决方案的更多相关文章

  1. 【Spark调优】大表join大表,少数key导致数据倾斜解决方案

    [使用场景] 两个RDD进行join的时候,如果数据量都比较大,那么此时可以sample看下两个RDD中的key分布情况.如果出现数据倾斜,是因为其中某一个RDD中的少数几个key的数据量过大,而另一 ...

  2. 大数据开发实战:Hive优化实战3-大表join大表优化

    5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...

  3. Hive优化-大表join大表优化

    Hive优化-大表join大表优化 5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个 ...

  4. hive join 优化 --小表join大表

    1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...

  5. SQL记录-小表join大表查询例子

  6. 6.2 小表驱动大表(exists的应用)

    1. 优化原则:小表驱动大表,即小数据集驱动大数据集. select * from A where id in (select id from B) 等价于: for select id from B ...

  7. Hive中小表与大表关联(join)的性能分析【转】

    Hive中小表与大表关联(join)的性能分析 [转自:http://blog.sina.com.cn/s/blog_6ff05a2c01016j7n.html] 经常看到一些Hive优化的建议中说当 ...

  8. Mysql优化原则_小表驱动大表IN和EXISTS的合理利用

    //假设一个for循环 ; $i < ; $i++) { ; $i < ; $j++) { } } ; $i < ; $i++) { ; $i < ; $j++) { } } ...

  9. 小表驱动大表, 兼论exists和in

    给出两个表,A和B,A和B表的数据量, 当A小于B时,用exists select * from A where exists (select * from B where A.id=B.id) ex ...

随机推荐

  1. window下maven的环境搭建

    一.下载 官网下载地址 二.maven的安装配置 1.环境变量的配置 1)新建环境变量MAVEN_HOME,值如下: D:\install\develop\apache-maven- 2)修改环境变量 ...

  2. springboot无法加载oracle驱动终极解决

    .ctrl+shirt+s .找到 Maven: com.oracle:ojdbc6: .找到classes 下的路径C:\Users\Administrator\.m2\repository\com ...

  3. EF + mysql 异常:Unable to load the specified metadata resource

    数据库连接字符串报错, <add name="xxxx" providerName="MySql.Data.MySqlClient" connection ...

  4. java的基本数据类型和引用类型

    一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...

  5. http 自定义信息头(header)设置与获取

    一.后端设置(如:java) 在你服务端(如:java)返回的时候写上: res.setHeader("Access-Control-Expose-Headers",propNam ...

  6. openstack镜像制作centos7

    1,找一台宿主机安装kvm并检查是否支持虚拟化,这里我用的是vmware来做宿主机 egrep '(vmx|svm)' /proc/cpuinfo 然后安装kvm: yum install epel- ...

  7. 前端学习日记之HTML、CSS 简单总结

    前端学习日记之HTML.CSS 简单总结 标签(空格分隔): html css 前端学习日记 html超文本标记语言 一. h标题标签 h1-h7 <!DOCTYPE html> < ...

  8. MVC Razor视图下ViewData传递html内容被转义

    页面输出: html源码: <div style="width: 90%; height: auto;"> <p>付凯航 阿豆 ADOU</p> ...

  9. union: git command

    # switch one tag # warning: if do that, can't commit any change git clone $project_path git checkout ...

  10. 使用git提交项目到码云

    1.下载git客户端工具(.exe) 点击安装 2.找到你存放项目的根目录(例如:e:/gittest) 3.在该根目录下,右键,选择“Git Bash Here” 4.出现命令行,输入初始化命令: ...