数据倾斜在分布式计算中是一个很常见的问题,Spark提供了一种比较便捷的方法来处理一些简单的数据倾斜场景。

Spark中定位数据倾斜

1、找到耗时长的stage并确定为shuffle stage。
2、给所有的task按照shuffle records排序,找到最多数据的task。
3、比较其他的task确定是否发生了倾斜。
4、根据业务逻辑,Spark执行计划,找到倾斜的key。

单表

skew hint必须至少包含一个表,所有和这个表有关的join都会自动使用倾斜join的优化策略。

-- orders表倾斜
SELECT /*+ SKEW('orders') */ * FROM orders, customers WHERE c_custId = o_custId-- 临时表倾斜
SELECT /*+ SKEW('C1') */ *FROM (SELECT * FROM customers WHERE c_custId < 100) C1, ordersWHERE C1.c_custId = o_custId

表和字段

一个表可能会有多join,当其中的一个字段发生了倾斜时,由于自动倾斜优化策略有一定的额外开销,所以最好是在需要的时候加上注解,而不处理所有的字段。为此,该注解支持指定某张表的某个字段,这样只有那个字段会被优化。

-- 单字段 orders的o_custId字段
SELECT /*+ SKEW('orders', 'o_custId') */ *FROM orders, customersWHERE o_custId = c_custId-- 多字段 orders的o_custId和o_storeRegionId字段
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId')) */ *FROM orders, customersWHERE o_custId = c_custId AND o_storeRegionId = c_regionId

表、字段以及倾斜值

有些场景,处理单个字段都会是非常耗时的,如果我们明确了join 的key在哪个值上倾斜了,我们也可以进一步的细化注解。这样就能进一步的减少倾斜处理的额外开销了。

-- 单个表的单个字段的单个倾斜值 orders的o_custId字段的0发生了倾斜
SELECT /*+ SKEW('orders', 'o_custId', 0) */ *FROM orders, customersWHERE o_custId = c_custId-- 单个表的单个字段的多个倾斜值 orders的o_custId字段的(0, 1, 2)发生了倾斜
SELECT /*+ SKEW('orders', 'o_custId', (0, 1, 2)) */ *FROM orders, customersWHERE o_custId = c_custId-- 单个表的多个字段的多个倾斜值 orders的o_custId字段的(0, 1001)以及o_storeRegionId字段的(1, 1002)发生了倾斜
SELECT /*+ SKEW('orders', ('o_custId', 'o_storeRegionId'), ((0, 1001), (1, 1002))) */ *FROM orders, customersWHERE o_custId = c_custId AND o_storeRegionId = c_regionId

据说,Delta Lake会自动得出倾斜的值,也不妨试试。

Spark Skew Join Optimization相关推荐

  1. 使用 spark sql extensions 实现 skew join

    文章目录 背景 skew hint 实现方式 原理 用法 语法 编译&配置 Test 局限性 参考 背景 使用 Join 时,如果出现数据倾斜就会导致OOM或者单task长时间执行的现象,如果 ...

  2. Spark SQL JOIN操作代码示例

    title: Spark SQL JOIN操作 date: 2021-05-08 15:53:21 tags: Spark 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据.分别创建 ...

  3. Spark RDD JOIN 调优

    Spark RDD JOIN 调优 一. 大表关联小表 1. 小表数据量非常小时 一般当副表的数据比较小时,可以考虑将这部分的小表数据直接加载到内存中,如加工成为一个Map 结构的对象,在使用的时候将 ...

  4. MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization)

    MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization) 如需转载请标明出处:http://blog.csdn.net/it ...

  5. Spark SQL join的三种实现方式

    引言 join是SQL中的常用操作,良好的表结构能够将数据分散到不同的表中,使其符合某种规范(mysql三大范式),可以最大程度的减少数据冗余,更新容错等,而建立表和表之间关系的最佳方式就是join操 ...

  6. spark outer join push down filter rule(spark 外连接中的下推规则)

    背景 对于spark的不同的join操作来说,有些谓词是能下推,是有谓词是不能下推的,今天我们实地操作一番,从现象和源码级别分析一下,这到底是怎么回事. 版本&环境 spark 3.2.0 m ...

  7. Skewed Join Optimization

    当join两个大表的时候,对于其中较大的一个表存在少量倾斜很严重的key的时候,可以将这部分key先提取出来(distinct (key))和另外一个表join作为后续map join的小表来用.和下 ...

  8. spark left join 和 right join 的坑

    前言 本文隶属于专栏<Spark异常问题汇总>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见 Spark异常问题汇总 问题描述 ...

  9. Spark 的join 什么时候是宽依赖什么时候是窄依赖

    1准备数据 spark-shell --master spark://linux01:7077 --executor-meg --total-executor-cores 4 val sc: Spar ...

最新文章

  1. 洛谷 P1678 烦恼的高考志愿
  2. python——LeetCode刷题
  3. 【HDU - 1520】Anniversary party (树形dp)
  4. 我的编程之路:网编到全栈的漫长路
  5. Linux core dumps 的生成
  6. UVA-1602 Lattice Animals 搜索问题(打表+set)
  7. 各种常用的 Win32Api 汇总(持续更新中. . .)
  8. 十款好用的PDF编辑软件推荐
  9. 2022年软考网络工程师考试备考指南
  10. word打开老是配置进度_打开word文档显示配置进度怎么办 Word文档提示配置进度解决办法...
  11. IOS的疯狂游戏:浮躁气氛正笼罩整个iOS游戏市场
  12. mac/macbook触摸板/鼠标/键盘失灵
  13. offlineimap读取qq邮箱
  14. html中一些界面设计
  15. SQL Server中,备份数据表
  16. Beta 测试和 Alpha 测试有什么区别?
  17. 欧陆风云3实用修改代码
  18. asp+excel通用成绩查询系统 v6.8 工资查询物业费水电费查询通用哦
  19. 基于Springboot+LayUI前后端分离小区物业系统带疫情防疫打卡管理
  20. 博弈论学习笔记(七)纳什均衡伯川德模型与选民投票

热门文章

  1. 阿里云Centos7修改22默认端口
  2. 阿里云服务器修改主机名
  3. 解决笔记本电脑开机速度缓慢的几种措施,亲测有效
  4. 动态规划——宠物小精灵之收服
  5. build-essential unmet dependencies 有未满足依赖 解决办法
  6. 什么是模型?什么是建模?
  7. iOS_CLLocation定位
  8. VB.net读取Outlook签名
  9. SAP导入或更新某网证证书
  10. 【无标题】三星Xpress M2020打印机刷免芯片