文档章节

【Spark调优】小表join大表数据倾斜解决方案

o
 osc_a22drz29
发布于 2019/03/24 00:23
字数 642
阅读 22
收藏 0

精选30+云产品,助力企业轻松上云!>>>

【使用场景】  

  对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调优】聚合操作数据倾斜解决方案

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
三、Spark性能优化:数据倾斜调优

前言 继《Spark性能优化:开发调优篇》和《Spark性能优化:资源调优篇》讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的高级篇,将深入分析数...

osc_yea0up70
04/08
13
0
SparkCore的调优之数据倾斜调优

转载自:https://www.cnblogs.com/qingyunzong/p/8946679.html 一:数据倾斜 (一)数据倾斜调优了解 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性...

osc_m616vxy7
04/04
10
0
Spark性能优化:数据倾斜调优

前言 继《Spark性能优化:开发调优篇》和《Spark性能优化:资源调优篇》讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性能优化指南》的高级篇,将深入分析数...

citibank
2018/07/19
0
0
Spark SQL

Hive On Spark和SparkSQL都是一个翻译层 把一个SQL翻译成分布式可执行的Spark程序。而且大家的引擎都是spark。两种方式使用SparkSQL,Spark SQL is a Spark module for structured data pro...

ericSM
2019/04/11
13
0
SparkCore的调优之数据倾斜调优

转载自:https://www.cnblogs.com/qingyunzong/p/8946679.html 一:数据倾斜 (一)数据倾斜调优了解 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性...

山上有风景
04/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在Bash脚本中,如果发生某种情况,如何退出整个脚本?

问题: I'm writing a script in Bash to test some code. 我正在Bash中编写脚本来测试一些代码。 However, it seems silly to run the tests if compiling the code fails in the first pl......

技术盛宴
9分钟前
7
0
Windows安装Python+OpenCV

1、更新PyCharm中pip来源,使用清华和阿里云:https://pypi.tuna.tsinghua.edu.cn/simple/ http://mirrors.aliyun.com/pypi/simple/ 2、PyCharm查看已安装packets,添加新的安装包,从pip云端...

极客行
33分钟前
17
0
tomcat8配置虚拟目录,实现一个tomcat运行两个项目, tomcat配置URL不区分大小写

<?xml version="1.0" encoding="UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distri......

青峰Jun19er
39分钟前
19
0
HBase和MySQL存储方式的差别?或者说是,行存储和列存储的区别?

HBase借鉴列存储的思想,但是最底层依然是依靠键值对来存储数据,HBase为非关系型数据库 而MySQL则是行存储,MySQL为关系型数据库 写过程 行存储因为数据是连续的,所以只需要进行追加即可;...

其乐m
43分钟前
25
0
一个老程序员在互联网寒冬下的感悟

1. 你千万不要认为学习技术就可以换来稳定的生活和高的薪水待遇,你更不要认为那些从事市场开发,跑腿的人,没有前途。 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开...

北柠Java
47分钟前
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部