Apache Spark—大数据计算引擎

本文介绍了BIGO大数据团队在Apache Spark本地化计算引擎Gluten的研发成果,旨在解决ETL批处理中的性能瓶颈。Gluten通过本地化执行库实现了性能提升,支持向量化运算,兼容多种数据源和格式,如Hive、HDFS、ORC和Parquet。文中详述了Gluten在内存管理、Shuffle、Scan和Write等方面的优化策略,以及面临的挑战和未来发展方向。
摘要由CSDN通过智能技术生成

本文将介绍BIGO大数据团队在Spark本地化计算引擎-Gluten方面的研发和应用在ETL批数据处理方面的工作。文章结构如下:

背景简介

Gluten架构和技术细节

Gluten在ETL批处理领域的挑战和研发

生产环境上线效果

未来工作简述


|背景简介

Apache Spark(下文简称Spark)是一种开源集群计算引擎,支持批/流计算、SQL分析、机器学习、图计算等计算范式,以其强大的容错能力、可扩展性、函数式API、多语言支持(SQL、Python、Java、Scala、R)等特性在大数据计算领域被广泛使用。

Databricks(Spark背后的商业公司)在2022年SIGMOD会议上发表论文《Photon: A Fast Query Engine for Lakehouse Systems》,其核心思想是使用C++、列式格式、向量化执行等技术来执行Spark物理计划,在客户工作负载上获得了平均3倍、最大10倍的性能提升,这证明Spark本地化是非常令人期待的方向。

随着SSD和万兆网卡普及,IO性能显著提升,基于Spark 的作业负载遇到越来越多的CPU计算瓶颈,而非传统认知中的IO瓶颈,我们的集群也验证了这点。基于 JVM 进行 CPU 指令的优化比较困难,因为 JVM 提供的 CPU 指令级的优化如 SIMD[4]要远远少于其他 Native 语言(如C/C++,Rust)。目前开源社区已有比较成熟的 Native Engine(如ClickHouse、Velox),具备了优秀的向量化执行(Vectorized Execution)能力,并被证明能够带来显著的性能优势。

基于上述背景,Gluten项目诞生于2021年10月,由深耕于Spark加速的Intel OAP团队和Kyligence公司双方共建,其目的是通过开源社区来推进本地化Spark项目。BIGO大数据团队于2022年9月加入研发,为第三支核心研发团队。Gluten架构类似于Photon,两者都将本地Native运行时库实现为Spark插件,结合了Spark的可扩展性框架、优化器、容错能力和Native执行库的高性能,预期可以带来数倍的性能提升。其中Native Library目前支持Velox[6]和Clickhouse[7]

Velox是Meta开源的本地执行库,其目标是构建统一的查询执行层,提供了数据类型、向量数据结构、Pipeline框架、算子、表达式计算、IO和资源管理等功能。当前Intel、美团、网易等公司专注在该方向上。

Clickhouse(下文简称CH)是2016年Yandex公司开源的是一个用于联机分析(OLAP)的列式数据库,以其高性能近年来备受关注,各大公司纷纷跟进大规模应用和改进(如字节跳动基于CH开源的云原生数仓ByConity),吸引全球超过1000余名开发者贡献代码。当前Kyligence和BIGO等公司专注在该方向上。

BIGO早在2018年引入CH作为OLAP服务于生产业务。当时考虑到CH更成熟以及我们对其代码更熟悉,所以在Gluten社区我们主要聚焦于Gluten+CH。经过协同社区近2年的研发,我们已经在生产环境逐步灰度Gluten(基于Spark 3.3),开始替换Spark的ETL工作负载,目前灰度SQL上获得了总体40%+的成本节省。


|Gluten简介

      Gluten总体架构如下:

46703a5935098fc200a22d79a784a764.jpeg

Gluten本质上是基于Spark插件接口开发的项目,不需要侵入Spark代码库,是一个大型的Spark插件库,该插件库使用更高效的指令来执行Spark的物理计划,对于物理计划之前的步骤则可延用Spark现有代码,这样既结合了Spark的框架能力又增强了执行器的性能。

总体而言,Gluten当前可以应用于生产环境,也通过了TPC-H[8]和TPC-DS[9]测试。目前支持的算子覆盖Spark生产环境常用算子,包括Scan、Filter、Project、Hash Aggregation、Sort、Join等,Aggregation、Sort和Join等算子也支持Spill,当内存不足时,可以溢写到外存。表达式方面,我们开发了目前生产环境使用的函数,绝大多数都已经支持,且解决了与Spark的语义上的diff(实际上,这块工作量很大,后文会展开叙述)。


Scan算子:数据源方面,支持Hive,S3。其中HDFS IO通过Libhdfs3[10](C++ native client)支持,我们贡献了Erasure Code[11](纠删码)支持,并引入Intel ISA-L库做了深度优化。数据格式方面,支持ORC[12],Parquet[13],CSV,Text等常用格式,ORC和Parquet都完整支持嵌套复杂类型、Decimal等。

Join算子:支持Broadcast Join和Grace Hash Join[14](GHJ),前者用于至少有一小表Join,后者实现了带Spill功能的Hash Join。经过我们优化,GHJ算法可以在内存充足的情况下性能打平全内存的Hash Join;当内存不足时,支持溢写到外存以避免OOM(out of memory)异常。在Join类型上,支持SQL标准Join类型。目前还不支持全不等值Join以及多不等值条件的ASOF Join[15]

聚合算子:得益于CH对聚合算子的良好实现,支持Spill,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值