Photon 是Azure Databricks本机矢量化查询引擎,可加速 SQL 工作负荷、数据帧 API 调用、ETL 管道和无状态流式处理工作负载。 Photon 按列式批次处理数据,相较于传统的基于行的执行方式,可显著提升性能。 Photon 还与 Apache Spark API 兼容,因此它适用于现有代码,无需更改。
Photon 的工作原理
对于受支持的操作,Photon 将基于 JVM 的 Spark SQL 执行引擎替换为本机 C++ 运行时。 Apache Spark 查询优化器(Catalyst)仍会对你的查询进行规划,但 Photon 会在执行层接手,以列式批次处理数据,而不是逐行处理。 当 Photon 在查询执行期间遇到不受支持的操作时,会自动无缝回退到 Spark 运行时来执行该操作的剩余部分。
Photon 一次处理成批数千行的数据,使新式 CPU 能够使用 SIMD 指令来评估每个 CPU 周期的多个值。 由于以原生 C++ 运行而非在 JVM 上运行,Photon 消除了垃圾回收暂停、JIT 预热延迟和内存开销。 列式批处理可实现缓存友好的顺序读取,从而最大程度地提高内存带宽和 CPU 管道效率。
Photon 的体系结构通过多种方式提高性能:
- 查询加速:与其他云数据仓库相比,Photon 为数据和分析工作负荷提供高达 5 倍的更好价格/性能,如行业标准 TPC-DS 基准衡量。
- 优化联接和混排:将排序合并联接替换为高性能哈希联接,并使用重新设计的列式随机排列来增加大规模联接的吞吐量。
-
写入性能:Photon 原生 Parquet 写入器可加速 Delta Lake、Apache Iceberg 和 Parquet 的写入,包括
UPDATE、DELETE、MERGE INTO、INSERT和CREATE TABLE AS SELECT操作。 包含数千列的宽表,其改进尤为显著。 - 扫描效率:实现筛选器下推、字典修剪和行组跳过以减少从存储读取的数据,即使在处理许多小文件时也是如此。
- 磁盘缓存和并发:通过磁盘缓存提供更快的重复访问,并提高交互式 BI 工作负荷中并发查询的吞吐量。
- 与 SQL 和数据帧 API 集成:支持跨 Python、R、Scala 和 Java 的 SQL 和数据帧 API,无需更改代码。
Photon 为处理大型数据集的运行时间较长的查询提供了最大的好处。 通常在两秒钟内完成的查询不会看到有意义的改进,因为执行时间由规划和计划开销而不是数据处理主导。
与 Azure Databricks 平台集成
Photon 可在 Azure Databricks 平台上加速工作负载。 无需更改代码或查询即可利用 Photon。
- SQL 分析和 BI:Photon 是所有 SQL 仓库、支持仪表板、即席查询和计划报表的默认引擎。
- ETL 和数据工程:使用 SQL 或数据帧 API 生成的批处理作业受益于更快的扫描、联接、聚合和写入。 原生 Parquet 写入器对于写入到 Delta Lake、Apache Iceberg 或 Parquet 表尤其有效。
- Lakeflow Spark 声明性管道:在管道配置中启用 Photon 有助于加速 Lakeflow Spark 声明性管道 执行。
- 流式处理:在写入 Delta 或 Parquet 接收端时,Photon 支持无状态流式处理。 支持的源包括 Delta、Parquet、CSV、JSON、Kafka 和 Kinesis。 不支持有状态流式处理。
- AI 和机器学习:Photon 可提高 Spark SQL、数据帧、特征工程和 GraphFrames 操作的性能。
Photon 启用
Photon 在无服务器计算、SQL 仓库和无服务器 Lakeflow Spark 声明式管道上始终处于启用状态。
对于经典全用途计算、作业计算和经典 Lakeflow Spark 声明性管道管道,Photon 默认处于启用状态,可以在创建或编辑计算时使用“性能”下的“使用 Photon 加速”复选框进行切换。 请参阅 使用 Photon 加速。 如果使用 群集 API 或 作业 API 创建这些资源,则必须通过将 runtime_engine 设置为 PHOTON 来显式启用 Photon。 如果使用 管道 API,请将 photon 设置为 true。
需要启用 Photon 的功能
以下功能需要 Photon 启用:
- 面向读写操作的预测输入输出 (I/O) 请参阅什么是预测性 I/O?
-
MERGE、UPDATE和DELETE语句中的动态文件修剪。 请参阅动态文件修剪。
支持的实例类型
Photon 在驱动程序和工作器节点上支持许多实例类型。 Photon 实例类型消耗 DBU 的速率与非 Photon 运行时的相同实例类型不同。 有关 Photon 实例和 DBU 消耗的详细信息,请参阅 Azure Databricks 定价页。
支持的运算符、表达式和数据类型
Photon 涵盖以下运算符、表达式和数据类型。 当查询使用不受支持的操作时,Photon 会透明地回退到 Spark 运行时,以便执行该部分。
运算符
- 扫描(Parquet、Delta、CSV、JSON)、筛选器、Project
- 哈希聚合/连接/洗牌
- 嵌套的循环联接
- 支持 Null 的反联接
- 空间联接(支持
ST_Intersects、ST_Contains、ST_Covers、ST_Equals、ST_Touches、ST_Within和ST_DWithin的广播和混洗变体) - 联合、扩展、标量子查询
- Delta/Parquet 写入汇聚点
- Sort、TopK、Limit
- 窗口函数
表达式
这些类别具有代表性,并非详尽无遗。 每个类别中的单个函数可能具有限制。
- 比较/逻辑
- 算术/数学
- 条件(IF、CASE 等)
- String
- 类型转换
- 聚合函数,包括针对嵌套类型的 Min/Max/MinBy/MaxBy
- 日期/时间戳/日期格式
数据类型
监控 Photon 使用情况
可以使用以下工具监视 Photon 上运行的查询量:
- Spark UI(经典全用途和作业计算):在 Spark UI 的 SQL/DataFrame 选项卡中,Photon 运算符在查询 DAG 可视化效果中显示为橙色。 标准 Spark 运算符显示为蓝色。 这有助于确定查询的哪些部分受益于 Photon,以及哪些部分回退到 Spark 运行时。
- 查询分析(SQL 仓库和无服务器计算):执行详细信息视图会显示由 Photon 执行的任务时间百分比。 查询计划将 Photon 运算符(紫色)与标准运算符(灰色)区分开来。
如果发现查询未按预期使用 Photon,请检查查询是否使用不受支持的操作、UDF 或导致 Spark 运行时回退的数据格式。
限制
- 如果工作负载遇到不受支持的操作,计算资源会在该操作的剩余执行过程中无缝切换到 Spark 运行时。 查询仍然生成正确的结果。
- Photon 不支持 UDF(用户定义的函数)、RDD API 或数据集 API。
- 不支持有状态流式处理。 Photon 仅支持无状态流处理。
- Photon 不会改善通常在两秒内运行的查询。