本文的目的主要是介绍11月8日发布的Apache Spark3.0预览版所增加的一些功能和特性,希望能让大家对这些新特性有一个基础的了解,以便后面能够更快的上手和适应新版本。
注:以下图片均引用自2019年阿里云栖大会
Spark发展史
1 动态分区(Dynamic Partition Pruning)
在3.0以前,spark是不支持动态分区的,所谓动态分区就是针对分区表中多个表进行join的时候,在on后面的条件语句满足一定的要求后就会进行自动动态分区裁减优化,比如:
1SELECT t1.id,t2.pKey
2FROM t1
3JOIN t2
4ON t1.pKey = t2.pKey
5AND t2.id < 2;
上面这条SQL语句在没有使用动态分区的情况下执行过程如下图所示:
在使用了动态分区以后执行过程变成了下图:
可以看到之前进行join的时候对t1表中满足on条件的所有数据进行扫描,然后再把两张表进行join,在加入动态分区之后,我们过滤掉了t1表中的无用数据,大大减少了join时的内存计算开销,在实际环境中同样的代码,性能提升了有33倍!
2
自适应查询执行(Adaptive Query Execution)
自适应查询是指对执行计划按照实际数据分布和组织情况,评估其执行所消耗的时间和资源,从而选择代价最小的计划去执行。一般数据库的优化器有两种,一种是基于规则的优化器(RBO),一种是基于代价的优化器(CBO),自适应查询指的就是对CBO的优化,SparkSQL的运行流程主要有:
1.将SQL语句通过词法和语法解析生成未绑定的逻辑执行计划;
2.分析器配合元数据使用分析规则,完善未绑定的逻辑计划属性转换成绑定的逻辑计划;
3.优化器使用优化规则将绑定的逻辑计划进行合并、裁减、下推生成优化的逻辑计划;
4.规划器使用规划策略把优化的逻辑计划转换成可执行的物理计划;
5.进行preparations规则处理,构建RDD的DAG图执行查询计划。
Spark以前的调度规则是执行计划一旦确定,即使发现后续执行计划可以优化,也不可更改,而自适应查询功能则是在执行查询计划的同时,基于表和列的统计信息,对各个算子产生的中间结果集大小进行估算,根据估算结果来动态地选择最优执行计划,如下图:
具体可参见此篇文章
3
支持GPU调度(Support GPU Scheduling)
Spark在诞生之初就定位于统一的大数据处理引擎,目前大数据和机器学习已经密不可分,在这种情况下由于数据量比较大还有机器学习的算法迭代时间可能会很长,所以现在好多计算引擎都使用GPU、FPGA或TPU来加速计算,因此从市场需求来看,Spark支持GPU也已经势在必行。
目前大数据组件的资源管理组件YARN和Kubernetes已经支持GPU,并有提供对应的API以供用户使用,在Spark3.0中将支持standalone、YARN以及Kubernetes资源管理下的GPU计算,并且使用对现有正常作业基本无影响,从实现的角度来说是在scheduler层面进行调整,使得scheduler可以在task请求中识别出GPU需求,然后再按照executor上的GPU资源来分配。
4
更好的API扩展(Better API Extensions)
这个功能应该说是完善而不是新添加的功能,因为从Apache Spark2.3.0这个版本开始已经开始引入Data Source API V2,这是因为随着Spark的使用用户数量的增加,旧的Data Source API V1
逐渐出现了一些不足:
01
部分接口还是太过于依赖SQLContext和DataFrame
02
缺乏对列式数据库存储的读取支持
03
写操作不支持事务
04
不支持流式处理,不能进行增量迭代
05
缺乏分区和排序信息
06
扩展能力有限,难以下推其它算子
鉴于以上缺点,Spark从2.3开始在兼容Data Source API V1 的情况下引入并不断改进DataSource API V2,最终的稳定版以及新功能将会解决上述所有问题,在年底和Spark3.0.0一起发布,让我们拭目以待吧!
5
更好的与ANSI SQL兼容
因为Spark原来的SQL语法和函数跟ANSI标准还是存在一些差异,因此这次版本更新将缩小和ANSI标准之间的差异,包括增加一些ANSI SQL的函数、区分SQL保留关键字以及内置函数等,如果这部分ISSUE解决,那么Spark一定会得到更广泛的应用。
最后我们来看一下Spark的生态,spark主要面向两个群体:数据工程师和数据科学家,它们之间的关系应该是相辅相成的,如下图所示:
数据科学
在数据科学方面Spark采用和当前比较主流的数据分析语言python进行衔接来完成,在python中使用pandas可以进行数据分析,但是适用范围只能在数据量比较小的时候,为了解决这个问题,Spark开源了koalas,其和pandas无缝兼容,为广大的数据科学家带来在大数据场景下能轻松的进行数据分析的福音。
下面是单独使用koalas 和 pandas的案例:
可以看到二者在使用语法方面完全没有差异,极大的方便了数据科学家的使用和操作。
数据工程
在数据工程方面,databricks开源了Delta Lake,这个是在实践应用中基于成千上万的用户痛点而总结出来的,Delta Lake的主要特性有以下几点:
能同时连续处理来自历史和实时流的数据;
能确保表干净整洁,不受数据列污染;
允许向表中添加新列,且不会导致破坏性更改;
可进行数据版本的控制,以便在发生失误操作时及时回滚;
与MLflow集成,可自动跟踪和再现实验。
以下是Delta Lake三个使用场景: