什么是 Photon?

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 的写入,包括 UPDATEDELETEMERGE INTOINSERTCREATE 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 启用:

支持的实例类型

Photon 在驱动程序和工作器节点上支持许多实例类型。 Photon 实例类型消耗 DBU 的速率与非 Photon 运行时的相同实例类型不同。 有关 Photon 实例和 DBU 消耗的详细信息,请参阅 Azure Databricks 定价页

支持的运算符、表达式和数据类型

Photon 涵盖以下运算符、表达式和数据类型。 当查询使用不受支持的操作时,Photon 会透明地回退到 Spark 运行时,以便执行该部分。

运算符

  • 扫描(Parquet、Delta、CSV、JSON)、筛选器、Project
  • 哈希聚合/连接/洗牌
  • 嵌套的循环联接
  • 支持 Null 的反联接
  • 空间联接(支持 ST_IntersectsST_ContainsST_CoversST_EqualsST_TouchesST_WithinST_DWithin 的广播和混洗变体)
  • 联合、扩展、标量子查询
  • Delta/Parquet 写入汇聚点
  • Sort、TopK、Limit
  • 窗口函数

表达式

这些类别具有代表性,并非详尽无遗。 每个类别中的单个函数可能具有限制。

  • 比较/逻辑
  • 算术/数学
  • 条件(IF、CASE 等)
  • String
  • 类型转换
  • 聚合函数,包括针对嵌套类型的 Min/Max/MinBy/MaxBy
  • 日期/时间戳/日期格式

数据类型

  • 字节/Short/Int/Long
  • 布尔
  • 字符串/二进制
  • 小数
  • 浮点数/双精度
  • 日期/时间戳
  • TimestampNTZ
  • 结构
  • 数组
  • 地图
  • 变量
  • Null
  • 几何学
  • 地理
  • 排序后的字符串

监控 Photon 使用情况

可以使用以下工具监视 Photon 上运行的查询量:

  • Spark UI(经典全用途和作业计算):在 Spark UISQL/DataFrame 选项卡中,Photon 运算符在查询 DAG 可视化效果中显示为橙色。 标准 Spark 运算符显示为蓝色。 这有助于确定查询的哪些部分受益于 Photon,以及哪些部分回退到 Spark 运行时。
  • 查询分析(SQL 仓库和无服务器计算):执行详细信息视图会显示由 Photon 执行的任务时间百分比。 查询计划将 Photon 运算符(紫色)与标准运算符(灰色)区分开来。

如果发现查询未按预期使用 Photon,请检查查询是否使用不受支持的操作、UDF 或导致 Spark 运行时回退的数据格式。

限制

  • 如果工作负载遇到不受支持的操作,计算资源会在该操作的剩余执行过程中无缝切换到 Spark 运行时。 查询仍然生成正确的结果。
  • Photon 不支持 UDF(用户定义的函数)、RDD API 或数据集 API。
  • 不支持有状态流式处理。 Photon 仅支持无状态流处理。
  • Photon 不会改善通常在两秒内运行的查询。