从一到无穷大 #37 Databricks Photon:打响 Spark Native Engine 第一枪
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。
文章目录
- 引言
- 技术决策
- JVM vs. Native Execution
- Interpreted Vectorization vs Code-Gen
- Row vs. Column-Oriented Execution
- Partial Rollout
- 总结
引言
SIGMOD 2022的Industry Best Paper《Photon: A Fast Query Engine for Lakehouse Systems》对于湖仓一体给出了标准的定义:
Many organizations are shifting to a data management paradigm called the “Lakehouse,” which implements the functionality of structured data warehouses on top of unstructured data lakes.
并定义了Lakehouse对于执行引擎而言最大的挑战就是CPU:
The execution engine needs to provide good performance on the raw uncurated datasets that are ubiquitous in data lakes, and excellent performance on structured data stored in popular columnar file formats like Apache Parquet.
Lakehouse概念的出现是符合历史发展的,DataLakes对于性能要求高的工作负载一般会选择将一部分数据结构化后转移到DataWarehouses中,以实现高性能和Governance,但是这个过程需要昂贵的ETL,而且可能导致两端数据不一致[11]。Lakehouse的数据管理架构在DataLakes之上提供DataWarehouses能力,比如Governance, ACID transactions以及丰富的SQL支持,且需要管理的ETL步骤也更少。其次通过Data Clustering以及Data Skipping Indices可以大幅增加存储的访问性能,接下来就是优化计算。
文中给出了计算部分的三个挑战:
- Supporting raw, uncurated data
- Supporting existing Spark APIs
- To be as fast as possible
Photon与Velox的定位类似,但是动机完全不同,Velox是用单一模块化的执行引擎来减少重新实现计算模块的额外人力开销;而Photon是因为java实现的性能不够,Databricks作为商业公司增加自己的核心竞争力。这也是为什么Photon是闭源的,但是世界始终是向前走的,尤其是在这样的一个火热的领域,Apache Gluten就可以认为是Photon的开源实现,简单浏览了下Gluten的代码结构,其支持将Spark Plan和 Substrait 转化为Velox,ClickHouse的执行计划。

说个题外话,Substrait的流行度越来越高了,除了Apache Gluten外,Velox原生支持Substrait转化为Velox Execution Plan;Arrow-cpp原生支持Substrait转化为Arrow Acero Execution Plan;基本业界顶级执行引擎都支持了Substrait,可以认为其已经成为Serialization for Relational Algebra的事实标准了[13]。
文章本身并没有新东西,但是从工程的角度非常具有借鉴价值,因为其详细的讨论了项目设计的基本技术决策,接下来的文章重点放在这里。
技术决策
JVM vs. Native Execution
这也是文章的核心所在,即Lakehouse的瓶颈在计算引擎[8]。技术背景为:
local NVMe SSD caching和autooptimized shuffle等底层优化大大减少了 IO 延迟Delta Lake启用的data clustering等技术允许查询通过file pruning更积极地跳过不需要的数据,进一步减少了 IO 等待时间Lakehouse引入了新的工作负载,需要对未规范化数据、大型字符串和非结构化嵌套数据类型进行繁重的数据处理
瓶颈永远不会消失,它只会从一个指标转移到另一个指标,放弃现有JVM引擎的核心观点是目前的瓶颈集中在CPU,提高现有引擎的性能越来越困难,
- 提升性能需要大量的 JVM 内部知识,以确保 JIT 编译器生成最佳代码(比如使用 SIMD 指令的循环)
- 堆的大小超过 64GB时,GC的性能就会受到严重影响,此时需要手动管理堆外内存,增加代码复杂性
- 执行引擎中的
Java code generation[5][14]受到方法大小或代码缓存大小的限制,可能退化到火山模型,造成性能极具下降
Interpreted Vectorization vs Code-Gen
Vectorization和Code-Gen的区别可以学习[16],论文中给出了详细的实验对比,以及两种方法的优劣。
文章提到Databricks尝试了两种方法,最终选择矢量化执行引擎的原因如下:
- Easier to develop and scale:矢量化执行引擎更容易开发,调试器,堆栈跟踪工具等都是现成的,相比之下
Code-Gen的开发难度就大很多 - Observability is easier:
Code-Gen通常会将操作符折叠内联到少量流水线函数中,从而消除解释和函数调用开销,但丧失了可观察性 - Easier to adapt to changing data:可以轻松的通过多分支运行时选择代码路径来适应各种情况,
Code-Gen引擎要做到相同的效果需要在运行时编译过多的分支,或者动态地重新编译查询的部分内容 - Specialization is still possible:虽然
Code-Gen在某些情况下具有明显的性能优势,但可以通过特殊的工程优化来消除差异,文中给了一个例子,col >= left and col <= right如果被解释为conjunction的话会有很高的解释开销,所以Photon为这样的表达式创建了一个特殊的fused operator
Velox和Photon一样,使用矢量化执行引擎,没有混合使用Code-Gen。
这两种方法其实是可以结合的,框架采用vectorization,具体到表达式计算可以采用Code-Gen,达到最高的性能,Clickhouse就是这样做的,具体可以参考[17][18]

Row vs. Column-Oriented Execution
核心观点如下:
Column-Oriented更适合SIMD,通过将操作符作为循环来实现,可以更高效地进行数据流水线处理和预取,并能让exchanges和spilling的数据序列化更高效- 执行引擎主要与 Parquet 等列式文件格式对接,列表示可以在扫描数据时跳过昂贵的列到行的转换
- 可以维护字典以减少内存使用
之前我们组自己实现了一个执行引擎,就是存在使用row做Operator之间的数据转换导致无法解决的性能问题。
Partial Rollout
这其实不能算是技术取舍而是工程实践中必须要做的,因为不但开源社区会定期积极提供改进、功能和错误修复,其次等功能全做完再上线黄花菜都凉了,这种级别的人力投入是希望尽快看到成果的。
总结
技术细节中有几点比较有意思,但不是文章的重点:
- 将Photon融入Databricks Runtime,因为部分算子Photon是不支持的,还需要使用原生的运算符,这里就涉及到行列转换的问题
- Vectorized Execution 的具体方法,包括
Batched Columnar Data Layout,Filters and Conditionals,Vectorized Hash Table,Vector Memory Management,Adaptive Execution
文章的重点是笔者深深的感受到了这个领域的卷,Databricks Photon,Apache Arrow Datafusion,Apache Arrow Acero,Meta Velox,Apache Calcite,ClickHouse,DuckDB等都已经做的非常非常好。Substrait,Apache Gluten,这样的项目也是大大降低了使用门槛,技术发展的未来想在性能,成本上超越友商变的越来越困难。
换句话说,顶级开源产品的技术能力一般大公司的绝大多数部门(不是全部,国内互联网公司也拥有一众顶级项目)没有人力做出来,技术规划上如果业界有现成的,且开源许可证允许,对接业界先进开源产品是绝对强于从零到一,投入更多精力在运维,可观测性,增值服务上收益更高,当然有能力一定要回馈社区。
其次业务真的很重要,在做一件事情之前务必知道盘子大小(技术型还是关系型不重要),不然风险极高,在此向行业内垂直领域公司致敬,真的很不容易。
参考:
- Photon A Fast Query Engine for Lakehouse Systems
- CMU 15-721
- Photon 基本论文总结
- Photon论文解读 : A Fast Query Engine for Lakehouse Systems
- 深度解读|Spark 中 CodeGen 与向量化技术的研究
- 【Gluten】Spark 的向量化执行引擎框架 Gluten
- 向量化执行引擎框架 Gluten 宣布正式开源,并亮相 Spark 技术峰会
- Spark Commiter 深度解读:Apache Spark Native Engine
- Gluten + Celeborn: 让 Native Spark 拥抱 Cloud Native
- Gluten 首次开源技术沙龙成功举办,更多新能力值得期待
- Lakehouse: A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics.
- 从一到无穷大 #26 Velox:Meta用cpp实现的大一统模块化执行引擎
- https://substrait.io/community/powered_by/
- Project Tungsten: Bringing Apache Spark Closer to Bare Metal
- 列存数据库 Code Generation & Vectorized Mode
- Everything You Always Wanted to Know About Compiled and Vectorized Queries But Were Afraid to Ask vldb2018
- Overview of ClickHouse Architecture
- Vectorization vs. Compilation in Query Execution
相关文章:
从一到无穷大 #37 Databricks Photon:打响 Spark Native Engine 第一枪
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言技术决策JVM vs. Native ExecutionInterpreted Vectorization vs Code-GenRow vs…...
Java 字符串占位格式化
Java 提供了几种方式来处理字符串占位符,最常用的是 String 类的 format 方法和 MessageFormat 类。以下是这两种方法的详细说明和示例。 1、String.format 基本语法: String formatted String.format("格式字符串", 参数1, 参数2, ...); …...
基于netty实现简易版rpc服务-理论分析
1.技术要点 1.1 rpc协议 定义一个rpc协议类,用于rpc服务端和客户端数据交互。 1.2 netty粘包半包处理 由于数据传说使用tcp协议,rpc协议的数据在网络传输过程中会产生三种情况: 1)刚好是完整的一条rpc协议数据 2)不…...
Elasticsearch高级搜索技术-全文搜索
目录 倒排索引 (Inverted Index) 示例 分词器 (Analyzer) 评分机制 (Scoring) 查询执行 match 查询 match_phrase 查询 全文搜索是Elasticsearch的核心功能之一,它通过复杂的算法和数据结构来提供高效的搜索能力。为了深入理解其工作原理,我们需要…...
案例分享—国外优秀UI卡片设计作品赏析
国外UI设计注重用户体验,倾向于采用简洁的布局、清晰的排版和直观的交互方式,减少用户的认知负担。卡片式设计能够完美利用屏幕空间,使内容一目了然,易于用户快速浏览和阅读,从而提升了整体的用户体验。 更加注重扁平化…...
Go语言基础学习(Go安装配置、基础语法)
一、简介及安装教程 1、为什么学习Go? 简单好记的关键词和语法;更高的效率;生态强大;语法检查严格,安全性高;严格的依赖管理, go mod 命令;强大的编译检查、严格的编码规范和完整的…...
STM32—FLASH闪存
1.FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程 我们怎么操作这些存储器呢?这就需要用到这个闪存存储器接口了,闪…...
AP上线的那些事儿(1)capwap建立过程、设备初始化以及二层上线
1、了解FITAP与AC的建立过程 之前我们已经知道了FATAP与FIT是一对双胞胎一样的兄弟,FAT哥哥能够直接独立使用当AP桥接、路由器等,而弟弟FIT则比较薄弱,独自发挥不出功效,需要一位师傅(AC)来带领,…...
10 django管理系统 - 管理员管理 - 新建管理员(通过模态框和ajax实现)
在文章“04 django管理系统 - 部门管理 - 新增部门”中,我们通过传统的新增页面来实现部门的添加。 在本文中,我们通过模态框和ajax来实现管理员的新增。 首先在admin_list.html中新建入口,使用按钮 <div class"panel-heading&quo…...
Mysql中表字段VARCHAR(N)类型及长度的解释
本文将针对MySQL 中 varchar (N)类型字段的存储方式进行解释,主要是对字符和字节的关系的理解。 1. varchar (N) 中的 N varchar (N) 中的 N 表示字符数,而不是字节数。这意味着 N 表示你可以存储多少个字符。 字符数:指的是字符的个数&…...
git提交信息写错处理方式
在Git中,你可以通过使用rebase命令来合并提交记录。以下是一个简单的步骤来合并一系列提交: 使用git rebase -i开始交互式变基。在打开的编辑器中,你会看到一个提交列表。若要合并提交,将要合并的提交前面的pick改为squash或s。保…...
C#从零开始学习(用unity探索C#)(unity Lab1)
初次使用Unity 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp Unity的下载与安装 从 unity官网下载Unity Hub Unity的使用 安装后,注册账号,下载unity版本,然后创建3d项目 设置窗口界面布局 3D对象的创建 点击对象,然后点击Move Guzmo,就可以拖动…...
【SpringBoot】15 Echarts+Thymeleaf 绘制各种图表
Gitee仓库 https://gitee.com/Lin_DH/system 介绍 ECharts是百度开源的一个前端组件。它是一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,…...
网络学习笔记
一、网络的结构与功能 网络的鲁棒性与抗毁性 如果在移走少量节点后网络中的绝大部分节点仍然是连通的,那么就该网络的连通性对节点故障具有鲁棒性 网络上的动力学 动力系统:自旋、振子或混沌的同步、可激发系统 传播过程:信息传播与拥堵…...
[论文笔记]HERMES 3 TECHNICAL REPORT
引言 今天带来论文HERMES 3 TECHNICAL REPORT,这篇论文提出了一个强大的工具调用模型,包含了训练方案介绍。同时提出了一个函数调用标准。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 聊天模…...
MySQL-19.多表设计-一对多-外键
一.多表问题分析 二.添加外键 三.外键约束的问题...
MySQL程序介绍<一>
目录 MySQL程序简介 mysqld - MySQL 服务器 编辑 mysql - MySQL 命令⾏客⼾端 MySQL程序简介 1.MySQL安装完成通常会包含如下程序: Linux系统程序⼀般在 /usr/bin⽬录下,可以通过命令查看 windows系统⽬录: 你的安装路径\MySQL Server…...
Leetcode 第 419 场周赛题解
Leetcode 第 419 场周赛题解 Leetcode 第 419 场周赛题解题目1:3318. 计算子数组的 x-sum I思路代码复杂度分析 题目2:3319. 第 K 大的完美二叉子树的大小思路代码复杂度分析 题目3:思路代码复杂度分析 题目4:3321. 计算子数组的 …...
那些年 我们说走就走
那些年 我们说走就走 —— 2022-03-20 二月十八 春分 我总是钟情于原生景色,犹如那句 “落霞与孤鹜齐飞,秋水共长天一色。” 所绘。 我热爱骑行,向往自然,对有着 “中国人的景观大道” 之称的 318 国道川藏线憧憬已久。 17 年暑…...
MySQL初识
在了解什么是MySQL前,我们先了解一下什么是数据库?? 1. 数据库简介 1.1 什么是数据库 数据库是20世纪60年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的⼀个重要分⽀。数据库技术主要是⽤来解决数据处理的⾮数值计算问…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
Selenium 查找页面元素的方式
Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素,以下是主要的定位方式: 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
P10909 [蓝桥杯 2024 国 B] 立定跳远
# P10909 [蓝桥杯 2024 国 B] 立定跳远 ## 题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 $n$ 个检查点 $a_1, a_2, \cdots , a_n$ 且 $a_i \ge a_{i−1} > 0$。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时࿰…...
Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)
13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...
VUE3 ref 和 useTemplateRef
使用ref来绑定和获取 页面 <headerNav ref"headerNavRef"></headerNav><div click"showRef" ref"buttonRef">refbutton</div>使用ref方法const后面的命名需要跟页面的ref值一样 const buttonRef ref(buttonRef) cons…...
数据可视化交互
目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装 pyecharts 二、下载数据 三、实验任务 实验 1:AQI 横向对比条形图 代码说明: 运行结果: 实验 2:AQI 等级分布饼图 实验 3:多城市 AQI…...
AI书签管理工具开发全记录(十八):书签导入导出
文章目录 AI书签管理工具开发全记录(十八):书签导入导出1.前言 📝2.书签结构分析 📖3.书签示例 📑4.书签文件结构定义描述 🔣4.1. 整体文档结构4.2. 核心元素类型4.3. 层级关系4.…...
