快手自研Spark向量化引擎正式发布,性能提升200%

ops/2024/9/20 1:23:21/ 标签: spark, 大数据, 分布式

Blaze 是快手自研的基于Rust语言和DataFusion框架开发的Spark向量化执行引擎,旨在通过本机矢量化执行技术来加速Spark SQL的查询处理。Blaze在快手内部上线的数仓生产作业也观测到了平均30%的算力提升,实现了较大的降本增效。本文将深入剖析blaze的技术原理、实现细节及在快手实际生产环境中的真实表现。 

一、研究背景

当下,Spark 的重要发展方向之一是通过向量化执行进一步提升性能。向量化执行的思想是将算子的执行粒度从每次处理一行变成每次处理一个行组,以此来避免大量的函数调用。通过对行组内部处理按列进行计算,同时利用编译技术减少分支判断检查以及更多的 SIMD 优化执行计划。

Blaze 是快手自研的基于Rust语言和DataFusion框架开发的Spark向量化执行引擎,旨在通过本机矢量化执行技术来加速Spark SQL的查询处理。在性能方面,Blaze展现出显著的优势:在TPC-DS 1TB的测试中,Blaze相较于Spark 3.3版本减少了60%的计算时间、Spark 3.5版本减少了40%的计算时间,并大幅降低了集群资源的消耗;此外,Blaze在快手内部上线的数仓生产作业也观测到了平均30%的算力提升,实现了较大幅度的降本增效。

如今,Blaze已开源,拥抱更广阔的开发者社区。开源版本全面兼容Spark 3.0~3.5,用户能够轻松集成Blaze至现有Spark环境中,仅需简单添加Jar包,即可解锁Blaze带来的极致性能优化,享受前所未有的数据处理速度与资源效率。

Github地址: https://github.com/kwai/blaze

二、Blaze的整体架构及核心

Spark on Blaze架构的整体流向

Spark+Blaze 的架构设计原理如下图:

图片

对比Spark原生的执行流程,引入Blaze Session Extension组件所带来的作用是显著的,特别是在提升数据处理效率和性能方面。

Spark原生执行流程主要依赖于Java虚拟机(JVM)进行任务的执行,尽管JVM在提供跨平台、内存管理等方面有着卓越的表现,但在大数据处理场景下,尤其是涉及大规模数据计算和复杂查询时,JVM的性能开销可能会成为瓶颈。

Blaze Session Extension组件的引入,巧妙地解决了这一问题。该组件在Spark生成物理执行计划之后介入,通过其翻译逻辑将这一计划转换为等效的、native向量化引擎可以识别的形式,随后提交到Executor端由native引擎执行计算,从而实现了数据处理效率的飞跃

图片

而这一切的背后,离不开Native向量化引擎这一核心模块的支持。该引擎由Rust语言实现,凭借其卓越的性能、安全性和并发处理能力,成功实现了Spark中大多数关键算子的等效替代,包括但不限于Project、Filter、Sort等。这些经过优化的算子在执行过程中,通过向量化技术显著提升了计算效率,使得数据处理过程更加流畅、快速

四大核心组件

Blaze 架构中的核心模块有四个,共同驱动着大数据性能的显著提升。这些模块分别为:

  • Native Engine:基于 Datafusion 框架实现的与 Spark 功能一致的 Native 算子,以及相关内存管理、FFI 交互等功能。

  • ProtoBuf:定义用于 JVM 和 native 之间的算子描述协议,对 Datafusion 执行计划进行序列化和反序列化。

  • JNI Bridge:实现 Spark Extension 和 Native Engine 之间的互相调用。

  • Spark Extension:Spark 插件,实现 Spark 算子到 Native 算子之间的翻译。

具体的执行过程中,遵循以下步骤:

  • 物理执行计划的转换:首先,Spark Extension将 Spark 生成的物理执行计划转换为对应的 Native Plan;

  • 生成和提交Native Plan:转换完成后,Native Plan通过JNI Bridge被提交给Native Engine进行进一步的处理。

  • Native 执行层:最后,Native Engine利用其高效的内存管理机制和向量化处理技术,对Native Plan进行真正的执行。执行结果通过JNI Bridge返回给Spark,从而完成整个数据处理流程。

三、Blaze的技术优势:面向生产的深度优化

在跑通 tpch 和 tpcds 测试集并取得预期性能提升后,我们面向线上生产环境进一步做了系列深度优化,包括性能和稳定性等方面工作:

细粒度的FailBack机制

我们针对Spark执行效率的提升,设计并实现了演进式向量化执行方案。这一方案旨在逐步优化算子与表达式的向量化覆盖,同时解决Java UDF无法直接转化为Native执行的问题。通过引入细粒度的FailBack机制,Blaze在翻译过程中遇到暂无Native实现的算子、单个表达式或UDF时,支持算子/单个表达式粒度的回退,能够灵活回退到Spark原生执行。此机制首先确定算子/表达式的依赖参数列,利用Arrow FFI技术将这些参数列作为行传递给Spark进行处理,然后将结果以列的形式回传至Blaze,从而在JVM与Native执行之间构建了一座桥梁。

此方案不仅加速了向量化执行的全面部署,还确保了即便在用户SQL中有少量UDF等不支持的场景,细粒度回退单个表达式开销较小,作业整体依然可以得到优化。

图片

更高效的向量化数据传输格式

在Spark中,Shuffle操作因其复杂的数据流转过程成为性能瓶颈,涉及编码、压缩、网络传输、解压及解码等多个环节。原生Spark采用基于行的序列化与压缩方式,而业界向量化数据则倾向于Arrow格式传输,但实践中发现Arrow与主流轻量压缩算法适配不佳,导致压缩率低下且存在冗余信息。针对此问题,Blaze定制了优化的数据传输格式,不仅去除了列名、数据类型等冗余数据,还使用了byte-transpose列式数据序列化技术,通过重组整型/浮点型数据的字节顺序,显著提升数据压缩效率。这一改进大幅减少了Shuffle过程中的数据传输量,并在实际测试与TPC-DS基准测试中展现出显著的性能提升与资源消耗降低,有效解决了原有问题并优化了系统整体性能。

图片

线上2000多个作业的真实数据,上线后输入数据量小幅上涨的情况下,Shuffle数据量相比spark降近30%

减少用户成本的多级内容管理策略

面对Spark与Native执行模式在内存管理上的差异,我们设计了跨堆内堆外的自适应内存管理机制。该机制根据任务的向量化覆盖情况智能调整内存分配,确保资源高效利用。同时,我们构建了堆外内存、堆内内存与磁盘文件之间的多级管理体系,有效防止了内存不足及频繁数据溢写的问题。这些措施不仅保障了向量化引擎上线后任务的稳定运行,无需用户手动调整内存参数,大幅降低了用户操作成本,提升了整体系统的易用性与可靠性。

图片

复杂度更优的聚合算法实现

为深度适配Spark的复杂需求,Blaze在aggregate、sort、shuffle等关键算子的实现上并未直接采用DataFusion的现成方案,而是进行了定制化开发。以HashAggregate为例,当面对大规模group-by聚合且内存不足时,Spark会转而采用基于排序的聚合,这涉及高复杂度的排序与归并过程。而在Blaze中,我们采用了基于分桶的归并方式,利用基数排序在spill时进行分桶、溢写,并在合并阶段通过hash 表快速合并,整个流程保持O(n)的复杂度,显著提升了聚合算子的执行效率与资源利用率

图片

向量化计算场景的表达式重复计算优化

针对SQL执行中算子间常见的重复表达式计算问题,Blaze借鉴了Spark的Whole-stage codegen技术,应用了这一项优化策略。该策略能够智能识别并合并包含重复表达式的算子,如下图中的Project与Filter合并为一个大算子,并在其中对表达式计算结果进行缓存、复用,达到了减少重复计算、提高执行效率的目的。这一优化在应对复杂计算逻辑(如JSON解析多个字段、UDF调用)时尤为显著,能将执行效率提升一倍以上。特别是在内部业务场景中,对于高频调用的重负载UDF,该优化成功减少了约40%的计算开销,显著增强了系统的整体性能与响应速度。

图片

四、当前进展及未来规划

当前进展

Blaze 作为一款高性能数据处理引擎,已取得了显著进展,全面支持多项核心功能,展现出强大的技术实力与广泛的应用潜力。具体而言,Blaze 目前已具备以下关键能力:

  • Parquet向量化读写能力:实现了对Parquet格式数据的高效向量化读写,极大地提升了数据处理的速度与效率。

  • 全面算子与表达式支持:覆盖了线上常用的所有算子与表达式,少量不支持的表达式和UDF也可以细粒度回退,确保用户能够无缝迁移并享受向量化处理带来的性能提升。

  • Remote Shuffle Service集成:内部集成了自研的Remote Shuffle Service,同时我们也在和阿里合作,增加对Apache Celeborn 的支持,预计9月份可以提交到社区。

  • TPC-H/TPC-DS测试优异表现:在业界权威的TPC-H/TPC-DS基准测试中,Blaze成功通过全部测试场景,并以TPC-H平均3倍以上、TPC-DS 2.5倍的性能提升展示了其在复杂查询处理上的卓越能力。

图片

在真实的生产环境中,向量化引擎大规模上线应用,算力平均提升 30%+,成本节约年化数千万元。

未来规划

1. 持续迭代优化,内部线上推全:通过不断收集用户反馈与性能数据,我们将精准定位并修复潜在问题,同时引入更多先进的算法与优化策略,以进一步提升Blaze的性能与稳定性。

2. 支持更多引擎或场景,例如数据湖等:为了满足用户日益多样化的数据处理需求,我们将不断拓展Blaze的应用场景,支持更多类型的数据处理引擎与场景,如数据湖等。通过加强与业界主流技术的兼容性,我们将为用户提供更加灵活、便捷的数据处理方案,助力用户解锁数据价值,推动业务创新与发展。

3. 加强开源社区运营建设,共建生态繁荣:我们深知开源社区对于技术发展与生态繁荣的重要性。因此,我们将在之后加强Blaze开源社区的运营建设,积极构建一个开放、包容、协作的社区环境。当前我们已经与阿里、B站、携程、联通云等公司达成合作。

如果您对该项目感兴趣,欢迎您为项目点个star。

项目地址:https://github.com/kwai/blaze


http://www.ppmy.cn/ops/110912.html

相关文章

Anaconda 安装与使用教程

Anaconda 安装与使用教程 介绍 Anaconda 是一个用于科学计算的 Python 和 R 的发行版,它包含了众多流行的科学计算、数据分析、机器学习等领域的库。本教程旨在帮助初学者快速上手 Anaconda,并学会如何使用其管理环境以及安装包。 第一步:…

Linux下的gcc与gdb

目录 Linux下的gcc与gdb 代码编译与链接 函数库 gdb介绍和安装 gdb基本使用指令 示例代码 debug模式和release模式 基本指令 进入gdb调试与显示调试代码 创建断点与删除断点 启用和禁用断点 执行代码 逐语句和逐过程调试 断点跳转 显示指定变量以及对应内容 打印变量的值 执行到…

代码随想录算法day30 | 动态规划算法part03 | 01背包问题 二维 ,01背包问题 一维,416. 分割等和子集

正式开始背包问题,背包问题还是挺难的,虽然大家可能看了很多背包问题模板代码,感觉挺简单,但基本理解的都不够深入。 背包问题,力扣上没有原题,题目是在卡码网找的 动态规划:01背包理论基础 本…

简单易懂的方式来解释机器学习(ML)和深度学习(DL)的区别与联系

让我们从多个角度出发,用一些简单易懂的方式来解释机器学习(ML)和深度学习(DL)的区别与联系。 1. 概念上的区别 机器学习 想象一下你在教一个小孩子如何分辨猫和狗。你可能会给这个孩子看很多猫和狗的照片&#xff…

Unity-Time类

目录 Time.timeScale Time.deltaTime Time.unscaledDeltaTime Time.time Time.frameCount Time.fixedDeltaTime Time.timeScale 时间缩放比例 时间停止 Time.timeScale 0; //回复正常 //Time.timeScale 1; //2倍速 …

VSCode 离线安装中文语言包

1.插件市场 Extensions for Visual Studio family of products | Visual Studio Marketplace 输入: language 在version history里面下载相应的版本,若没有就下载最新的 在下面安装 安装完重启就可以了。 可能会提示的失败: Unable to ins…

【vscode】 快速生成react组件

在VSCode中快速生成React组件的方法主要包括使用内置的代码片段和安装第三方插件。以下是具体的步骤和方法: 使用内置代码片段‌ VSCode支持用户自定义代码片段,你可以通过输入特定的前缀,然后按下Tab键,来快速生成React组件的基…

Cenos7镜像+Docker问题

前言 好用的镜像 阿里 curl -o /etc/yum.repos.d/Centos7-aliyun.repo https://mirrors.wlnmp.com/centos/Centos7-aliyun-x86_64.repo科大 curl -o /etc/yum.repos.d/Centos7-ustc.repo https://mirrors.wlnmp.com/centos/Centos7-ustc-x86_64.repo网易 curl -o /etc/yum…

概率论原理精解【14】

文章目录 拓扑空间拓扑空间映射一、连续映射二、同胚映射三、开映射与闭映射四、其他映射五、映射空间 第一可数空间第一可数性公理第一可数空间的性质例子与反例 邻域基定义性质例子应用 参考文献 拓扑空间 拓扑空间映射 是一个相当宽泛且复杂的话题,因为拓扑空间…

HW蓝队某知名大厂面试题分享

🤟 基于入门网络安全/黑客打造的资源包无偿分享中: 👉黑客&网络安全入门&进阶学习资源包 应急响应流程 1)首先判断服务器资产、影响范围以及严重程度,确认有没有必要将服务器下线隔离,然后根据服务…

基于python+django+mysql+Nanodet检测模型的水稻虫害检测系统

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

第158天:安全开发-Python-Socket编程反弹Shell分离免杀端口探针域名爆破

前置知识 使用 socket 模块 1. 导入模块 首先,你需要导入 Python 的 socket 模块。 import socket 2. 创建套接字 使用 socket.socket() 函数创建一个新的套接字。这个函数可以接收两个参数:地址族和套接字类型。 地址族(Address Family&…

筑牢网络安全防线:为数字时代保驾护航

《筑牢网络安全防线:为数字时代保驾护航》 一、网络安全:数字时代的关键课题 网络安全在当今数字时代的重要性愈发凸显。2024 年国家网络安全宣传周以 “网络安全为人民,网络安全靠人民” 为主题,深刻体现了网络安全与每个人息息…

OpenGL(四) 纹理贴图

几何模型&材质&纹理 渲染一个物体需要: 几何模型:决定了物体的形状材质:绝对了当灯光照到上面时的作用效果纹理:决定了物体的外观 纹理对象 纹理有2D的,有3D的。2D图像就是一张图片,3D图像是在…

MyBatis 如何将 Mapper 接口与其 XML 映射文件关联:深入原理与实现

MyBatis 如何将 Mapper 接口与其 XML 映射文件关联:深入原理与实现 1. 概述 MyBatis 是一个简单、灵活的持久层框架,它通过 SQL 语句将 Java 对象与数据库进行映射。MyBatis 支持基于 XML 和注解的配置方式。在实际开发中,XML 映射文件与 M…

云服务与虚拟主机:数字时代的网络托管选择

当今数字化的时代,无论是个人博主、小型企业还是大型企业,都需要一个可靠的网络托管解决方案来展示自己的网站或应用程序。云服务和虚拟主机是两种常见的选择,它们各有特点,适用于不同的需求。 一、虚拟主机 虚拟主机&#xff0…

SpringBoot闲一品交易平台

SpringBoot闲一品交易平台 #vue项目实战 #计算机项目 #java项目 SpringBoot闲一品交易平台通过运用软件工程原理和开发方法,借助Spring Boot框架,旨在实现零食交易信息的高效管理,提升用户的购物体验和满意度。 技术栈 开发语言:…

想了解医疗大模型吗?请看《智能系统学报》实验室最新综述论文

本文改编自实验室的最新综述论文《医疗领域的大型语言模型综述》,该论文发表于《智能系统学报》。《智能系统学报》是中国人工智能学会会刊、“中国人工智能学会推荐中文学术期刊”列表中的A类期刊。该论文合作单位包括上海理工大学、上海儿童医学中心、复旦大学附属…

文件存储阿里云

1.图片存储 图片存储是指将图片文件保存在服务器或云存储中的技术或服务。图片存储的主要目的是方便用户上传、存储、管理和分享图片文件。 图片存储可以分为两种主要类型:本地存储和云存储。 本地存储是将图片文件保存在本地服务器或计算机上的一种方式。这种存…

服务网关Gateway快速入门

1.引入 网关可以把它理解成坐高铁时的安检,他可以对用户做身份验证,哪些人能通过,哪些人不能通过,都由他决定,如果没有安检,那么高铁的安全性将受到打击,一个微服务没有网关,那么接口…