0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Blaze: 用Rust重写Spark执行层,平均提升30%算力

jf_wN0SrCdH 来源:Rust语言中文社区 2023-11-22 17:46 次阅读

大家好,我是Tim。

前一段时间,快手数据架构团队开源了Blaze项目,它是一个利用本机矢量化执行来加速SparkSQL查询处理的插件。

用通俗的话讲就是通过使用Rust重写Spark物理执行层来达到性能提升的目的。

并且在TPC-DS 1TB的所有测试中,Blaze相比Spark3.3减少了40%的计算时间,降低了近一半的集群资源开销。

此外,在快手内部上线的数仓生产作业也观测到了平均30%的算力提升,实现了较大的降本增效。

1fa3d78c-7fe1-11ee-939d-92fbcf53809c.png

今天我们就来聊一聊这个Blaze,以及近来重写Spark执行层进行提效的诸多项目。

Spark填补了一个空白

在大数据建设的初期,单台机器的 RAM 是有限且昂贵的,所以在进行集群规模计算时唯一可行选择是基于 MapReduce 的 Hadoop,它可以在诸多廉价的普通主机上进行集群计算。

众所周知,MapReduce 对磁盘 IO 的负担非常重,而且并没有真正发挥所有 RAM 的价值。

随着机器硬件的发展,RAM的价格也大幅降低,这时Spark提出了弹性分布式数据集(RDD),这是一种分布式内存抽象,可以让程序员以容错的方式在大型集群上执行内存计算。

Spark 完美地填补了这个空白。突然间,许多大数据处理都可以非常高效地完成。

为什么要重写Spark执行层?

而随着硬件技术的继续发展,Spark也需要进行相应的优化,来充分的发挥出底层硬件提供的能力。

以查询计划执行为例。原有的Spark引擎执行一个查询计划,往往采用火山模型的方式。

这种上层算子递归调用下层算子获取并处理元组的方式,存在虚函数调用次数较多、指令或数据cache miss率高的缺陷,并且这种一次处理一个元组的方式无法使用CPUSIMD指令进行优化,从而造成查询执行效率低下的问题。

向量化执行就是解决上述问题的一种有效手段

然而,我们都知道Spark是使用Scala写的,和JAVA类似是运行在JVM上的。

在Java中,与C++或Rust相比,没有直接的手动向量化特性,实现向量化都是由JVM自动控制的。

例如,JVM会对循环进行分析,判断是否有类似于向量化的优化机会。

如果JVM发现某个循环中其计算次数大于一定量级,且指令可以被SIMD指令集所支持,那么它会将循环展开为并行操作,从而实现向量化执行。

publicstaticvoidvectorAdd(float[]a,float[]b,float[]result){
for(inti=0;i< 200;i++){
result[i]=a[i]+b[i];
}
}

如上面的代码所示,其有可能会被JVM转换为向量化执行。

即使循环符合向量化的条件,JVM也不能保证一定会自动实现向量化执行。在某些情况下,JVM可能会选择跳过向量化执行。

所以,到目前为止,Spark中的性能杀手Shuffle等操作依然采用了行式数据处理。

不过对于读写列式文件的算子,如Parquet、Orc等,已经实现了向量化的批量操作。

除此以外,Scala、Java实现的Spark还会带来垃圾收集(GC)开销,这也是JAVA系语言的通病。

如果垃圾回收的时间太长,会严重影响任务执行的稳定性,甚至会被误识别为节点失联。

最后,Java还存在较高的内存消耗和无法进行低级别的系统优化等问题,这都迫使人们一直在尝试重写Spark执行层算子。

一直没有开源的Photon

其实对于重写Spark执行层算子,Spark的母公司Databricks早已进行了尝试,并已经为其付费用户提供了向量化的执行引擎Photon。

Photon已经被应用多年,其被定位为适用于 Lakehouse 环境的矢量化查询引擎。在Databricks的内部数据上,Photon 已将一些客户工作负载加速了 10 倍以上。

业界也一直有向量化执行引擎出现,例如velox、gluten(gluten可以支持velox或ck作为后端)。

velox就是一个单机/单节点的c++的向量化query runtime实现。

当然velox目标不只是Spark, 它希望统一替换大数据计算引擎的单节点runtime,包括Spark、Presto、Pytorch,以取得加速效果。

其对接Spark就是通过gluten项目进行对接的,velox目前也已基本在Meta公司内部落地。

但其开源社区一直不温不火,甚至凉凉。

Blaze 借助Arrow DataFusion实现向量化执行引擎

Blaze的实现原理和Velox、Photon都是大同小异。

即在运行时尝试使用向量化算子计算,如果不支持则回退回Spark原来的计算算子。

不过需要注意的是,Blaze是将Spark运行时物理运算符转换为 Rust DataFusion的向量化实现。

关于DataFusion是什么,可以参考这篇文章:Apache Arrow DataFusion到底是什么?

目前Blaze可能还不支持聚合运算符,UDF 或 RDD API,这显然会影响 TPC-DS 查询的整体运行时间。不过,在快手内部据传Blaze中已经添加了对聚合运算符的支持。

在开源的Blaze已支持Spark3.0和Spark3.3版本,其使用方式和gluten类似,通过在Spark环境中添加相应的Jar包实现功能扩展。

目前从其跑的TPC-DS 查询性能测试上可以看出,Blaze平均提升30%的性能,节约了40%的集群资源。

然而其问题也和Velox一样。

一方面需要在Spark集群环境中安装特定版本的Rust/C++,而且Rust/C++在庞大的集群机器中可能会存在各种环境问题。

另一方面,其不支持UDF(当然Photon也不支持),在真实的计算任务中可能会存在各种兼容性问题,而导致需要回退到原始的Spark执行引擎上,可能会造成原始任务的性能倒退。

说白了,即不可能全局开启Blaze性能优化,目前也只能针对特定任务特点用户进行开启优化。

Blaze引擎优化定位只是针对Spark引擎,而且在向量化的实现上又是基于DataFusion开源项目,相比Velox引擎其未来开源的路可能会比较好走一点,毕竟目标没那么大嘛。

当然Blaze的出现还有一个作用,也许会迫使Databricks开源他们藏掖已久的Photon,这当然是一件好事。

就像当年Iceberg迫使Databricks开源其收费的数据湖存储引擎Delta Lake一样。

总结

Spark执行算子的向量化是未来必须要走的路,Blaze项目通过将Spark物理执行层算子转换为Rust Arrow DataFusion向量化算子来提升性能,目前已在快手内部部分业务上线,并实现30%的性能提升。

在快手内部的成功,并不一定可以在开源社区获得成功。

一方面,Spark社区并不会允许其并入Spark项目来获得更大关注,另一方面这种优化实现方式在真实重要的业务场景,必然存在很多自定义的函数或算子,这给其在其他公司数据团队上的落地造成了困难。

这可能需要数据团队具有不破不立的精神,否则其并不能带来全平台的性能收益,而这显然会使得使用Blaze项目所需的成本项异常显眼。

最后,希望Blaze项目可以成功,至少可以迫使Databricks开源其Photon,也希望更多native引擎开源来提升Spark任务执行性能。



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 磁盘
    +关注

    关注

    1

    文章

    338

    浏览量

    24883
  • SPARK
    +关注

    关注

    1

    文章

    99

    浏览量

    19731
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6387

原文标题:Blaze: 用Rust重写Spark执行层,平均提升30%算力

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Rust的 match 语句用法

    执行不同的代码,这在处理复杂的逻辑时非常有用。在本教程中,我们将深入了解 Rust 的 match 语句,包括基础用法、进阶用法和实践经验等方面。 基础用法 match 语句是 Rust 中的一种控制流语句,它可以让我们根据不同
    的头像 发表于 09-19 17:08 657次阅读

    iBeLink KS MAX 10.5T大领跑KAS新领域

    挖掘机,它可以为用户提供超高的,低廉的功耗,以及舒适的使用体验。如果您想要加入Kaspa的挖掘行列,或者想要提升您的挖掘效率和收获,那么iBeLink ks max 10.5T是您不可错过的选择。
    发表于 02-20 16:11

    大茉莉X16-P,5800M大称王称霸

    Rykj365
    发布于 :2024年01月25日 14:54:52

    是否有一个PICO BLAZE COMPILER

    我正在使用斯巴达3AN和SPI通信我正在使用KCPSM3。我想知道是否有一个PICO BLAZE COMPILER。如果它在哪里可以找到它。我已经看过PCCOMP但它不支持KCPSM3。所以,如果有
    发表于 05-15 12:22

    Spark job是怎么被调度执行

    Spark job 的执行流程简介
    发表于 08-22 08:24

    基于RDMA技术的Spark Shuffle性能提升

    一篇文章教你使用RDMA技术提升Spark的Shuffle性能
    发表于 10-28 16:46

    rx580,rx580显卡,rx588,rx588显卡 精选资料分享

    约有差别,30Mh左右都是正常的无论是蓝宝石,华硕,技嘉,铭瑄,迪兰,讯景的580显卡都是这个。〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓什么是热钱包?热钱包是指互联网能够访问你私钥的钱包,热
    发表于 07-23 06:59

    数据、算法和其实现载体是什么

    背景介绍数据、算法和是人工智能技术的三大要素。其中,体现着人工智能(AI)技术具体实现的能力,实现载体主要有CPU、GPU、FPGA和ASIC四类器件。CPU基于冯诺依曼架构,
    发表于 07-26 06:47

    如何在STM32 (Cortex M3)和GD32(RISC-V)上Rust开发

    应用非常广泛了,可以说已经是相当很成熟了;然而相比之下 Rust 还是旁观的多,实际的少,微软和 Facebook 也都只是宣称实验性地尝试用 Rust 实现一些新功能,毕竟 Facebook 也在
    发表于 06-21 10:38

    Xilinx Zynq7035指标

    目的本文介绍广州星嵌DSP C6657+Xilinx Zynq7035平台下Xilinx Zynq7035指标。基本概念FLOPs/FLOPSFLOPs,Floating Point
    发表于 12-15 21:19

    微软开发基于Rust的新编程语言,将很快开源

    此前,微软表示正探索将Rust作为C和C++的安全替代方案,并且也对外展示了使用Rust重写Windows组件的体验,根据微软的说法,Rust是一种从根本上考虑安全性的编程语言,他们将
    的头像 发表于 12-03 10:36 3733次阅读

    Cloudflare用Rust重写Nginx C模块,构建没有Nginx的未来

    近日,Cloudflare 工程师介绍了如何使用 Rust 重写基于 C 语言的 Nginx 模块。Cloudflare 工程师在博客写道,他们用 Rust 为 Cloudflare 基础设施中最
    的头像 发表于 03-08 09:36 472次阅读

    Rust重写的LSP:KCL IDE 插件的功能介绍与设计解析

    在这次更新中,我们发布了全新的 KCL VS Code 插件,并且用 Rust 重写了 LSP 的 Server 端。我们提供了 IDE 中常用的代码辅助功能,如高亮、跳转、补全、Outline、悬停、错误提示等。
    的头像 发表于 05-11 09:39 605次阅读
    <b class='flag-5'>Rust</b><b class='flag-5'>重写</b>的LSP:KCL IDE 插件的功能介绍与设计解析

    Windows 11初尝Rust,36000行内核代码已重写

    更早些时候,微软用 Rust 重写了 DirectWrite Core 库的概念验证,它是 Windows 的 DWrite 引擎的 Windows App SDK 实现,用于文本分析、布局和渲染
    的头像 发表于 05-19 16:39 674次阅读
    Windows 11初尝<b class='flag-5'>Rust</b>,36000行内核代码已<b class='flag-5'>重写</b>!

    一次Rust重写基础软件的实践

    受到2022年“谷歌使用Rust重写Android系统且所有Rust代码的内存安全漏洞为零” [1] 的启发,最近笔者怀着浓厚的兴趣也顺应Rust 的潮流,尝试着将一款C语言开发的基础
    的头像 发表于 01-25 11:21 273次阅读