SQL规范与数据倾斜

原创 2018年04月17日 09:58:45

一.SQL规范
1、SQL编写规范
逗号放字段前面
对用到的表都用子查询的形式,并且只取需要用到的字段
缩进(select/from/where …and …/group by/order by/join/on…)
符号前后留空格
对一些复杂的逻辑和需要注意的点加上注释说明
别名 同级用1、2、3...区分(如 t1、t2、t3)

2.规范的好处
规范的好处逻辑结构清晰
便于调试
便于模块化处理
美观,条理清楚

3.误区
觉得耗费时间,增加工作量
觉得都一样,自己明白就行

二.数据倾斜(spark)
1、现象
1.1 绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在10分钟之内执行完了,但是剩余两三个task却要一两个小时。
1.2 之前能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常
2、原理
2.1 聚合或join等(distinct、groupby、repartition)操作产生shuffle
2.2 拉取各个节点的key到某个节点上的一个task来处理
2.3 整个spark作业的运行进度是由运行时间最长的那个task决定的

2.4 某个task的key特别多,就产生了数据倾斜

一.SQL规范
1、SQL编写规范
逗号放字段前面
对用到的表都用子查询的形式,并且只取需要用到的字段
缩进(select/from/where …and …/group by/order by/join/on…)
符号前后留空格
对一些复杂的逻辑和需要注意的点加上注释说明
别名 同级用1、2、3...区分(如 t1、t2、t3)

2.规范的好处
规范的好处逻辑结构清晰
便于调试
便于模块化处理
美观,条理清楚

3.误区
觉得耗费时间,增加工作量
觉得都一样,自己明白就行

二.数据倾斜(spark)
1、现象
1.1 绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在10分钟之内执行完了,但是剩余两三个task却要一两个小时。
1.2 之前能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常
2、原理
2.1 聚合或join等(distinct、groupby、repartition)操作产生shuffle
2.2 拉取各个节点的key到某个节点上的一个task来处理
2.3 整个spark作业的运行进度是由运行时间最长的那个task决定的

2.4 某个task的key特别多,就产生了数据倾斜


3、定位
3.1 通过log定位到哪一个task发生了数据倾斜(时间特别长,数据量特别大)
3.2 由task得知对应的是哪一个stage
3.3 根据stage划分原理推算出是哪一块代码(这部分代码肯定有shuffle类算子)
4、排查
4.1 分析定位到的代码块涉及到的表或数据集
4.2 查看其中的key分布情况
5、解决
方案一:过滤少数导致倾斜的key
适用场景:导致数据倾斜的key为个别几个,而且对计算本身的影响不大
实现原理:将导致数据倾斜的key过滤掉之后,这些key不在参与shuffle计算,就不会产生倾斜
方案优点:实现简单,可以完全规避掉数据倾斜
方案缺点:适用场景少

方案二:提高shuffle操作的并行度
适用场景:由不少的key导致倾斜,并且这些key的数据量差异不是特别大
方案原理:spark sql 中把参数 spark.sql.shuffle.partitions的值调大(默认是200),增加task数量,让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据
方案优点:实现简单,只需设置参数
方案缺点:无法解决某些特殊情况,比如就某一个key对应的数据量特别大,此时无论怎么调参,这个key还是在某一个task中做处理

方案三:两阶段聚合(局部聚合+全局聚合)
使用场景:使用聚合类操作而发生倾斜时
实现原理:
【局部聚合】先给每个key打上个1~n的随机数,然后进行聚合
【全局聚合】对局部聚合的结果去掉打上随机数的前缀,再进行全局聚合
方案优点:对于聚合类导致的数据倾斜,效果非常不错
方案缺点:仅适用于聚合类操作,对join类的操作不适用


方案四:(采样)随机前缀和扩容表进行join
适用场景:有(少数)大量的key导致数据倾斜
实现原理:对造成倾斜key所在的A表的每条数据都打上1~n的随机前缀,对另一个正常的B表进行n倍扩容,每条数据都打上一个1-n的前缀,然后进行join
方案优点:对join类型的数据倾斜基本可以处理,效果显著
方案缺点:需要对数据进行扩容,对内存资源要求较高


6、解决
尝试不同方案
寻找更多方案
多种方案组合使用




关于飞机射击类游戏的设计原理 (加入时间:2001-3-4)

作者:尹龙水平有限,请别见怪:)   众所周知,飞机射击类游戏几乎是我们接触到的第一类计算机游戏,不论是在街机中还是在计算机中,这一类游戏都是非常容易上手和招人喜爱的。就算是在这个即时战略游戏、3D第...
  • ghj1976
  • ghj1976
  • 2001-04-25 18:16:00
  • 2002

按图索骥:SQL中数据倾斜问题的处理思路与方法

数据倾斜即表中某个字段的值分布不均匀,比如有100万条记录,其中字段A中有90万都是相同的值。这种情况下,字段A作为过滤条件时,可能会引起一些性能问题。 本文通过示例分享部分场景的处理方法 未使用绑定...
  • Enmotech
  • Enmotech
  • 2017-12-28 00:00:00
  • 1455

Spark sql处理数据倾斜方法

定义与表现: 数据倾斜指的是由于数据分区不均匀导致的,spark一部分tasks承担的数据量太大,而导致整体运行时间过长的现象。一般出现在对大表的join过程中,数据表现是大表的join key...
  • lulynn
  • lulynn
  • 2016-05-25 15:09:03
  • 4906

spark1.x-spark-sql-数据倾斜解决方案

聚合源数据过滤导致倾斜的key where条件提高shuffle并行度 spark.sql.shuffle.partitions sqlContext.setConf("spark.sql.shuf...
  • qq_16038125
  • qq_16038125
  • 2017-06-29 14:54:19
  • 332

Spark 数据倾斜 join 调优

原文出处:https://tech.meituan.com/spark-tuning-pro.html前言继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为《Spark性...
  • a1043498776
  • a1043498776
  • 2017-08-17 13:22:52
  • 725

数据倾斜处理

公司博客地址: http://conf.ctripcorp.com/download/attachments/54464460/Hive%E4%BC%98%E5%8C%96%E4%BB%A5%E5%8...
  • amikibaby
  • amikibaby
  • 2016-07-25 17:32:51
  • 110

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

原文:http://www.infoq.com/cn/articles/the-road-of-spark-performance-tuning?utm_campaign=rightbar_v2&ut...
  • u013063153
  • u013063153
  • 2017-06-26 17:15:50
  • 546

hive数据倾斜的解决方案

分布式文件系统HDFS可以存储海量的数据(以T为单位的数据量),分布式计算框架MapReduce可以对存储在HDFS的数据进行处理后再将结果写回到HDFS。MapReduce + HDFS可以完成对海...
  • xiaoshunzi111
  • xiaoshunzi111
  • 2015-10-31 22:01:34
  • 1604

hive数据倾斜解决方法

Hive倾斜—不患寡而患不均 一、数据倾斜的原因 Hive倾斜的原因很大部分是由于sql中的join语句与group by语句。 原因:对于普通的join操作,会在map端根据key的hash值,sh...
  • sun_shang
  • sun_shang
  • 2017-09-10 23:54:14
  • 630

spark性能优化:数据倾斜调优

调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业...
  • LW_GHY
  • LW_GHY
  • 2016-05-15 22:51:53
  • 22265
收藏助手
不良信息举报
您举报文章:SQL规范与数据倾斜
举报原因:
原因补充:

(最多只允许输入30个字)