Spark憋了一年半的大招后,发布了3.0版本,新特性主要与Spark SQL和Python相关。这也恰恰说明了大数据方向的两大核心:BI与AI。下面是本次发布的主要特性,包括性能、API、生态升级、数据源、SQL兼容、监控和调试等方面的升级。



本次主要整理了性能方面的优化,包括了自适应查询与动态分区裁剪。

1 自适应查询

AQE,Adaptive Query Execution,说的简单点就是让Spark在运行中根据搜集到的信息灵活采取优化手段,提升性能。

说起这个可以先回想下Spark的发展历史,在1.x时代Spark通过RDD的编程形成DAG图,这个阶段可以说没啥优化完全是按照规则来执行;在2.x时代,引入了代价计算,Spark会通过提前进行代价计算,选择代价最小的查询计划(跟大部分的数据库类似,代价计算依赖于数据本身的统计,如数据量、文件大小、分区数等,由于Spark是存储与计算分离的模式,因此这些统计信息有时候会缺失或者不准确,那么得到的查询代价自然也就不准确了);在3.x时代,引入自适应查询,即在运行的过程中可以根据得到的缓存数据信息动态调整分区策略、join策略等。这样就保证了刚开始表的统计信息不准,可能查询计划不是最高效的,但是随着查询的执行,可以动态优化整个查询计划。

那么到底自适应都可以做什么呢?

1.1 动态分区合并

在Spark的经典优化策略里,调整分区数从而改变并行度是最基本的优化手段,可以调整的分区数却不是那么容易找到最优值的。分区数太小,可能导致单个分区内的数据太多,单个任务的执行效率低下;分区数太大,可能导致碎片太多,任务之间来回切换浪费性能。比如经典的shuffle操作后,每个shuffle数据都需要对应的reduce端接收处理,如果分区数过多,有可能导致某几个任务读取的数据量很小,造成资源的浪费。



引入AQE后,Spark会自动把数据量很小的分区进行合并处理:

1.2 动态join策略选择

在Spark中支持多种join策略,这些策略在不同的分布式框架中差不多。分别是:

  • Broadcast Hash Join(BHJ),广播 join
  • Shuffle Hash Join(SHJ),哈希 join
  • Sort Merge Join(SMJ),排序 join

BHJ是当小表与大表关联时,把小表广播到大表的每个分区中,每个分区都与完整的小表进行关联,最后合并得到结果。像Spark会配置一个参数 spark.sql.autoBroadcastJoinThreshold 来决定小于这个配置的表就认为是小表,然后采用广播策略(默认10MB)。一般广播的套路是把小表拷贝到driver端,然后分发到每个executor工作节点上,因此如果表的数据太大,会导致来回复制的数据太多,性能低下,因此BHJ仅适用于广播小表。

SHJ是针对表的数据量过大时,按照分区列进行打散,两张表按照不同的分区重新排列数据。不过这种JOIN方法也有个弊端,就是需要对应分区的两张表数据都同时加载完成,才能开始计算。如果两张表的数据量都很大,有可能会造成分区节点内存溢出。

SMJ是针对上述的情况,在确定shuffle分区后对数据进行排序,这样两张表可以不需要等待数据全部加载到内存,只要对应的排序数据部分加载完成后就可以提前开始。

总结完三种join策略后,可以发现假设由于数据统计信息的缺失或不准确,或者是过滤条件的影响,可能会按照原来表的大小判断join的策略。比如某个表初始的时候15M,达不到广播join的要求,但是该表在查询过程中有个filter条件可以让表仅保留8M的有效数据,此时就可以采用广播join了。AQE就是利用这种特性,在运行时动态检测表的大小,当表的大小达到要求后会优化join为广播join。

1.3 数据倾斜优化

在分布式查询中某个查询任务会同时分拆成多个任务运行在不同的机器上,假设某个任务对应的数据量很大,就会引发数据倾斜的问题。比如下面的两张表关联,但是左表的第一个分区数据量很多,就会引发数据倾斜问题.



AQE可以在运行时检测到数据倾斜,并把大分区分割成多个小分区同时与对应的右表进行关联。

2 动态分区裁剪

这个比较好理解,正常Spark或Hive在查询时,会根据查询条件与分区字段自动过滤底层的数据文件。但是如果过滤条件没有及时的反映到查询上,就会导致数据被冗余加载。比如左边的是没有动态分区裁剪的情况,两张表进行关联操作,左表包含一个过滤条件,右表需要全表读取。经过动态分区优化后,右表可以直接添加过滤条件,如 id in (select id from lefttable where filter_cond) , 这样可以提前过滤掉部分数据。

3 关联提示

之前在Flink中看到过这种用法,即在sql中使用某种代码提示,让编译器根据代码提示选择优化策略执行。语法如:/** xxx /。比如 select /* BROADCAST(a) */ * from a join b on a.id = b.id,可以强制a表广播与b表进行关联操作。

以上就是主要的性能方面的优化。其他方面由于工作内容涉及的不多,因此就先不过多整理了,感兴趣可以去官网或者观看上面的分享视频。需要额外一提的是,官方文档也有两个很重要的调整:

1 增加了SQL相关的文档



2 增加了UI方面的说明



后续会分享更多Spark相关的原理和特性文章。

更多内容可以关注公众号,不定期更新大数据工作和学习经验。

Spark 3.0 新特性 之 自适应查询与分区动态裁剪的更多相关文章

  1. Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性

    Hadoop3.0新特性介绍,比Spark快10倍的Hadoop3.0新特性 Apache hadoop 项目组最新消息,hadoop3.x以后将会调整方案架构,将Mapreduce 基于内存+io+ ...

  2. Apache Spark 2.2.0 新特性详细介绍

    本章内容: 待整理 参考文献: Apache Spark 2.2.0新特性详细介绍 Introducing Apache Spark 2.2

  3. Spark各个版本新特性

    后续会添加spark生态系统中各个组件的兼容支持情况... Spark2.0.0 * 2016-07-27正式发布 * 它是2.x版本线的上的第一个版本. * 300位contributors的超过2 ...

  4. Mysql 8.0 新特性测试

    Mysql 8.0 新特性测试 Role MySQL8.0版本添加了role特性,role是一种逻辑概念是权限的集合,可以将一个或以上的权限赋予给role,再将role赋给user.Oracle,Po ...

  5. 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性

    [索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...

  6. 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性

    [索引页][源码下载] 精进不休 .NET 4.5 (12) - ADO.NET Entity Framework 6.0 新特性, WCF Data Services 5.6 新特性 作者:weba ...

  7. c# 6.0新特性(二)

    写在前面 上篇文章介绍了c#6.0的using static,Auto Property Initializers,Index Initializers新的特性,这篇文章将把剩下的几个学习一下. 原文 ...

  8. ASP.NET Web API 2.0新特性:Attribute Routing1

    ASP.NET Web API 2.0新特性:Attribute Routing[上篇] 对于一个针对ASP.NET Web API的调用请求来说,请求的URL和对应的HTTP方法的组合最终决定了目标 ...

  9. Django 2.0 新特性 抢先看!

    一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...

随机推荐

  1. QtableWidget用法流程

    QtableWidget用法流程 ​ 作者:流火 日期:2020/5/10 QTableWidget的基本构造函数 QTableWidget 是QTableview的子类.主要去呗是QTableVie ...

  2. 04 . kubernetes资源清单YAML入门

    YAML 通过k8s操作yaml配置文件在node上创建资源,yaml配置文件就像船垛,用来操控docker这艘大船 yam是专门用来写配置文件的语言,非常简洁和强大.而实际上使用yaml配置文件创建 ...

  3. 核心知识点:python入门

    目录 一.python入门day1-day24 day01-03 编程语言 day04 变量 day05 垃圾回收机制(GC机制) 1 引用计数 2 标记清除 3 分代回收 day05 程序交互与基本 ...

  4. 007.Nginx虚拟主机

    一 虚拟主机 1.1 虚拟主机概念 对于Nginx而言,每一个虚拟主机相当于一个在同一台服务器中却相互独立的站点,从而实现一台主机对外提供多个 web 服务,每个虚拟主机之间是独立的,互不影响的. 1 ...

  5. JavaScript学习 Ⅳ

    八. 批量创建对象 使用工厂方法创建对象 function creatPerson(name, age, gender='男'){ var obj = new Object(); obj.name = ...

  6. 深入理解JVM(③)线程与Java的线程

    前言 我们都知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源调度(内存地址.文件I/O等),又可以独立调度. 线程的实现 主流的 ...

  7. 一小时完成后台开发:DjangoRestFramework开发实践

    DjangoRestFramework开发实践 在这之前我写过一篇关于Django与Drf快速开发实践的博客,Django快速开发实践:Drf框架和xadmin配置指北,粗略说了一下Drf配置和基本使 ...

  8. YAPI工具配置LDAP统一用户认证

    背景:因为搭建了LDAP,因此希望将所有配置库或工具都使用LDAP进行统一用户认证,YAPI是其中一个. YAPI:使用docker-compose进行了安装,具体安装步骤自行百度. LDAP:使用d ...

  9. [Android] keytools生成jsk文件以及获取sha1码

    生成jks文件 进入要生的jks文件的路径,打开windows的命令提示符(CMD) keytool -genkey -alias dct -keyalg RSA -keysize 1024 -key ...

  10. 史上最全的 jmeter 获取 jdbc 数据使用的4种方法——(软件测试Python自动化)

    周五,下班了吗?软件测试人. 明天是周末了!给大家推荐一个技术干货好文.史上最全的 jmeter 获取 jdbc 数据使用的四种方法.我也精剪了jmeter的自动化接口测试的视频放在了同名UP主,周末 ...