Presto 0.292 版本发布详解:Arrow Flight 连接器、原生 ORC Reader 与 Iceberg 更新支持
2026/9/24 9:37:19 网站建设 项目流程
  • 大数据
  • 数据库
  • 后端

【免费下载链接】presto

The official home of the Presto distributed SQL query engine for big data

项目地址:https://gitcode.com/gh_mirrors/pre/presto
点击查看免费下载

导读

本文基于 Presto 官方发布说明 release-0.292.rst,系统梳理 0.292 版本的核心变更:新增的 Java / Native 双形态 Arrow Flight 连接器、原生 ORC Reader、Iceberg 表UPDATE支持与 sort order、bit_length函数、JDK 17 构建支持,以及涉及安全、调度、Hive/Iceberg/Kudu 连接器与 SPI 的大量修复与增强。读者可据此快速判断该版本的新能力边界、迁移关注点与升级前需要确认的配置项。


一、版本概览:0.292 的关键数字与主题

Presto 0.292 是一次横跨核心引擎、连接器、原生执行引擎(Prestissimo)与安全依赖的大型发布。其 Highlights 包含 16 项主要变更,涵盖:

  • 新连接器:Java 与 Native 两种形态的 Arrow Flight 连接器(presto-base-arrow-flight);
  • 新执行能力:原生 ORC reader、IcebergUPDATESQL 语句;
  • 新函数:MySQL 兼容的bit_length
  • 构建与运维:JDK 17 支持、task.max-drivers-per-task默认值改为按宿主线程并发度自适应;
  • 安全:修复WITH子句查询中列权限检查遗漏的安全漏洞,并升级十余个依赖以修复 CVE。

版本详情中还新增了:doc:../troubleshoot`` 故障排查专题与/installation/deployment中文档化文件型 Hive Metastore 部署方式,说明该版本同时强化了文档体系。


二、核心新特性深度解析

1. MySQL 兼容函数bit_length

0.292 新增bit_length(string)函数,返回给定字符串所占用的比特数,与 MySQL 语义对齐。其实现位于 StringFunctions.java:

@Description("count of bits for the given string") @ScalarFunction("bit_length") @LiteralParameters("x") @SqlType(StandardTypes.BIGINT) public static long bitLength(@SqlType("varchar(x)") Slice slice) { return (long) slice.length() * 8; }

从源码可以看出:

  • 返回类型固定为BIGINT,入参为带长度参数的varchar(x)
  • 计算逻辑为字节数乘以 8(按字节计比特),因此对多字节 UTF-8 字符(如中文)返回的是 UTF-8 编码后的字节数 × 8,而非字符数 × 8;
  • 示例:SELECT bit_length('Presto')48(6 字节 × 8);SELECT bit_length('你好')48(UTF-8 下 6 字节 × 8)。

该函数与既有length(字符数/码点数)、octet_length(字节数)形成互补,方便从 MySQL 迁移的查询直接复用。

2. JSON 输出规范化会话属性canonicalized_json_extract

版本新增会话属性canonicalized_json_extract,用于对 JSON 提取(extract)结果进行规范化输出。该属性在 SystemSessionProperties.java 中定义:

public static final String CANONICALIZED_JSON_EXTRACT = "canonicalized_json_extract";

这意味着 JSON 函数(如json_extractjson_extract_scalar)的输出格式可以通过会话级开关控制,便于在不同 JSON 文本表示(键顺序、空白、转义等)之间获得可预测、可比较的规范结果。实际使用时通过 SQL 会话设置:

SET SESSION canonicalized_json_extract = true;

从源码结构看,该属性被注册进SystemSessionProperties会话属性体系,可通过 JDBC/CLI 的SET SESSION或连接参数全局开启。

3. Java 与 Native 双形态 Arrow Flight 连接器

0.292 引入base-arrow-flight连接器模块(对应源码目录 presto-base-arrow-flight),同时提供:

  • Java 形态:由 Java worker 服务 Arrow Flight 端点;
  • Native 形态:由 Presto C++ worker(Prestissimo)支持 Apache Arrow Flight 协议(#24504)。

配套文档见 base-arrow-flight.rst,这是 0.292 为"以 Arrow Flight 作为列式传输协议对外提供查询服务"打下的基础,也是 Presto 走向高性能原生列式服务的关键一步。

4. 原生 ORC Reader 支持

#23037为 Presto 增加原生 ORC Reader 能力,使 ORC 文件读取可以下沉到 C++ 执行路径(Prestissimo 侧同步新增 ORC reader 支持)。对于以 ORC 为主要存储格式(Hive/Iceberg 表)的部署,这意味着原生执行引擎可以直接读取 ORC 数据而无需回到 Java 侧,为全链路向量化执行补齐了重要一环。

5. IcebergUPDATE语句支持

#24281为 Iceberg 连接器带来UPDATESQL 支持,这是继DELETE之后 Iceberg 表写入能力的重要补全。同时:

  • SPI 层面引入独立的ConnectorDeleteTableHandle接口替代原先复用ConnectorTableHandle的方式(见下文 SPI 变更);
  • 新增 DELETES 的 pagesink 以支持未来 DELETE 写入路径(#24528)。

搭配 0.292 同时落地的 Iceberg 表 sort order 与write.data.path表属性(详见下文),Iceberg 连接器在写入侧的能力趋于完整。

6. Iceberg 表 Sort Order 与独立写路径

  • 表排序(sort order)#21977支持在建表时通过sorted_by列列表声明排序键,写入的文件将按该顺序排序后再落盘,从而提升后续查询的局部性(如按排序键的范围裁剪与预聚合)。相关实现可在 IcebergTableProperties.java 中追溯。
  • 独立写路径#24397新增表属性write.data.path,允许为 Iceberg 表指定独立的数据写入路径;配套的连接器配置项为iceberg.catalog.hadoop.warehouse.datadir(Hadoop catalog 下新表的根写入路径)。这对于将数据写入与元数据目录分离、或写入特定存储介质(如 SSD、冷存储)的场景非常实用。
  • 同时新增表属性read.split.target-size与会话属性target_split_size_bytes#24417),用于精细化控制读取 split 的目标大小。

7. JDK 17 构建支持

#24677使 Presto 可以使用 JDK 17 构建。这是一项对部署环境有直接影响的变更:升级前请确认集群所有节点(coordinator、worker、native worker)的运行时 JDK 版本与构建脚本(根 pom.xml、mvnw)兼容,并配合jvm.config中的 GC 与内存参数做回归验证。

8. TPC-DS 连接器新增tpcds.use-varchar-type

#24406为 TPC-DS 连接器增加配置属性tpcds.use-varchar-type,用于将char列切换为varchar列。其解析逻辑位于 TpcdsConnectorFactory.java:

private boolean useVarcharType(Map<String, String> properties) { try { return parseBoolean(firstNonNull(properties.get("tpcds.use-varchar-type"), String.valueOf(false))); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("Invalid property tpcds.use-varchar-type"); } }

源码还揭示了该属性的一个关键约束:在 Native(Prestissimo)集群中该属性必须为true,否则连接器工厂会直接抛出IllegalArgumentException(TpcdsConnectorFactory.java),因为原生执行仅支持varchar列。配置示例:

# etc/catalog/tpcds.properties connector.name=tpcds tpcds.use-varchar-type=true

9.task.max-drivers-per-task默认值改进

#24642task.max-drivers-per-task的默认值改为跟随宿主机的线程并发度。该配置定义于 TaskManagerConfig.java:

private int maxDriversPerTask = Integer.MAX_VALUE; ... @Config("task.max-drivers-per-task") public TaskManagerConfig setMaxDriversPerTask(int maxDriversPerTask)

变更后,未显式配置时系统会根据 worker 节点的 CPU 并发能力自动计算每个 task 可运行的 driver 上限,替代此前偏保守的默认值,减少手动调优负担。若需要固定值,仍可在config.properties中显式设置:

task.max-drivers-per-task=16

三、查询分析与调度优化

0.292 在协调器(coordinator)与调度路径上做了多处针对性优化:

  • 调度热路径去装箱#24582#24673将调度关键路径中的DataSizeDateTime改为long原语,减少对象分配与装箱开销,提升大规模任务调度吞吐;
  • 任务事件循环可配置#24565将 task 事件循环线程数改为可通过配置文件调整,修复潜在阻塞问题;#24668新增task.enable-event-loop开关,用于改善协调器在运行大量任务时的效率;
  • 优化器统计合并#24414重构了多个 operator 统计信息的合并逻辑,并将指标创建过程中的局部变量抽取为专用类,降低指标系统开销;
  • 新增优化器规则#24047增加"在 partial aggregation + GroupId 组合下方插入 exchange"的优化规则,由布尔会话属性add_exchange_below_partial_aggregation_over_group_id控制;
  • 利用列分析增强#24638提升对查询中"已利用列"的分析能力——通过展开视图定义并检查底层表的利用列,使列裁剪与权限检查更准确;#24789修复 map 列传入unnest时的索引错误,利用列分析器将 key/value 输出字段正确映射回输入表达式。

四、错误处理与正确性修复

  • INTERVAL 溢出处理#24353改进INTERVAL DAY/HOUR/SECOND运算符溢出时的错误处理;#24617修复INTERVAL YEAR TO MONTH值的加、减、乘、除运算。
  • 时间戳构造边界#24674修复从过大/过小的 unix 时间戳构造TimestampWithTimeZone时静默返回错误结果的问题。
  • Hive UUID 解析#24538修复 HiveUUID类型解析。
  • Parquet 嵌套 Decimal#24440修复嵌套 Decimal 类型导致 Parquet 读取失败的问题(Hive 连接器条目同步收录)。

五、安全修复与依赖升级

1.WITH子句列权限检查安全漏洞(重点)

#24647修复了一个安全漏洞:当check_access_control_for_utlized_columnstrue时,使用WITH子句(CTE)的查询此前有时不会检查部分被使用列的权限。修复后引擎会始终检查查询中所有被使用列的权限。

文档同时指出了两个已知边界情况(原样引用):

  • 存在同名 CTE时,可能检查的列多于实际使用的列;
  • 或者退化为检查查询中引用的全部列。

这意味着该修复以"宁可多查、不可漏查"换取安全性,启用严格列权限检查的集群升级后应关注 CTE 相关查询的权限行为是否符合预期。

2. 依赖升级与 CVE 修复

0.292 响应多个 CVE 与安全公告,批量升级了底层依赖,包括:

依赖目标版本响应的安全公告
netty4.1.115.FinalCVE-2024-47535
libthrift0.14.1CVE-2020-13949
io.grpc1.70.0CVE-2024-7254、CVE-2020-8908
log4j-api / log4j-core2.24.3CVE-2024-47554
commons-text1.13.0CVE-2024-47554
okhttp / okio4.12.0 / 3.6.0CVE-2023-3635
org.apache.calcite1.38.0CVE-2023-2976
org.apache.ratis3.1.3CVE-2020-15250
aws-java-sdk1.12.782CVE-2024-21634
json-smart2.5.2CVE-2024-57699
accumulo1.10.1CVE-2020-17533
hive-dwrf(含 snappy 0.5)0.8.7CVE-2024-36124
prismJs1.30.0CVE-2024-53382
errorprone2.36.0
jQuery3.7.1随 bootstrap 升级
bootstrap5

此外:

  • 移除reload4j依赖以响应 WS-2022-0467;
  • dagre-d3-es替换废弃的dagre-d3以修复高危漏洞 WS-2022-0322;
  • 从根 POM 移除 log4j-api / log4j-core 的显式声明(#24605);
  • Elasticsearch 连接器改进加密协议,响应 SonarQube 规则java:S4423("不应使用弱 SSL/TLS 协议")。

这些升级同时带来了对运行时 JVM 依赖(netty、grpc、calcite 等)的版本约束变化,升级后建议关注第三方插件与自定义 SPI 实现的类路径冲突。


六、连接器变更一览

Hive 连接器

  • 修复 Parquet 嵌套 Decimal 读取(#24440)、Hive metastore 2.3+ 视图获取(#24466);
  • 新增会话属性hive.stats_based_filter_reorder_disabled以禁用基于 reader 统计的过滤重排(#24630),随后在#24637中重命名为hive.native_stats_based_filter_reorder_disabled——升级时需注意旧属性名已失效
  • 文件型 Hive metastore 支持使用 HDFS/S3 路径作为 warehouse 目录(#24660),相关部署文档已补充至 /installation/deployment;
  • beginDelete返回类型替换为新的ConnectorDeleteTableHandle#24528)。

Iceberg 连接器

  • 除前文所述 sort order、write.data.pathUPDATE支持外,还包括:
    • 新增FileHiveMetastore专用子类以隔离 Iceberg 连接器的行为差异(#24573);
    • manifest 文件缓存:为使用 Hive metastore 的部署增加 manifest 缓存,并默认开启以改善查询性能(#24481),同时修复缓存部分缺失(partial miss)时统计信息丢失的问题(#24480);
    • 支持hive.affinity-scheduling-file-section-size配置与会话属性affinity_scheduling_file_section_size#24598);
    • 修复 Iceberg 日期列过滤(#24583);
    • Iceberg 类型转换器支持带时区的时间戳(#23534);
    • 配置HIVE文件 catalog 时支持表重命名(#24312);
    • 废弃部分表属性名,改为采用 Iceberg 库自身的属性命名(详见 iceberg.rst)。

Kudu 连接器

  • beginDelete返回类型替换(#24528)。

Elasticsearch 连接器

  • 改进加密协议(弱 SSL/TLS 加固)。

TPC-DS 连接器

  • 新增tpcds.use-varchar-type(详见上文)。

七、SPI 变更(面向连接器与插件开发者)

0.292 的 SPI 层有较多破坏性变更,自定义连接器/插件在升级时需重点核对:

  1. 删除句柄类型化#24528#24721):ConnectorMetadata.beginDelete返回类型、finishDelete入参类型均替换为新增的独立接口ConnectorDeleteTableHandle,取代原先复用ConnectorTableHandle的做法;MetadataConnectorTableHandles相关变更同步支持DeleteTableHandle
  2. ConnectorProtocolTemplate类型参数#24721):为ConnectorProtocolTemplate实现增加类型参数,以支持连接器特有类型的(反)序列化。已有 Native 连接器实现必须更新定义,为其类型提供具体类型或使用NotImplemented
  3. PlanChecker签名变化#24557):PlanChecker.validatePlanChecker.validateFragment新增ConnectorSession参数。
  4. 新增IndexSourceNode到 SPI#24678)。
  5. 表达式优化器工厂扩展点#24144):新增CoordinatorPlugin#getExpressionOptimizerFactories,允许自定义协调器侧表达式求值。
  6. 事件监听增强#24456#24590):支持多个查询事件监听器QueryCompletedEvent中新增 node ID 到 plan node 的映射。
  7. 可重试错误标记#24808):将REMOTE_BUFFER_CLOSE_FAILED设为可重试错误,修复相关查询失败。

八、Prestissimo(Native Execution)变更

原生执行引擎在 0.292 中同步获得大量能力:

  • Native 类型管理器#24179)与Native 函数命名空间管理器#23358);
  • Native 侧 Arrow Flight 连接器支持#24504),与 Java 侧base-arrow-flight呼应;
  • 共享仲裁器(shared arbitrator)配置属性#24720),新增以下属性用于全局内存仲裁:
    • shared-arbitrator.global-arbitration-abort-time-ratio
    • shared-arbitrator.global-arbitration-memory-reclaim-pct
    • shared-arbitrator.global-arbitration-without-spill
    • shared-arbitrator.memory-pool-abort-capacity-limit
    • shared-arbitrator.memory-pool-min-reclaim-bytes
    • shared-arbitrator.memory-reclaim-threads-hw-multiplier
  • 系统配置扩展#24726#24774):新增spill-enabledjoin-spill-enabledaggregation-spill-enabledorder-by-spill-enabled四个 spill 开关,以及exchange.http-client.request-data-sizes-max-wait-sec
  • 新错误码#24773):在INSUFFICIENT_RESOURCE下新增MEMORY_ARBITRATION_FAILURE
  • C++ worker 向协调器上报节点池类型#24569);
  • task.max-drivers-per-task默认值改进同样作用于 Native 侧(#24642);
  • 新增 presto-native-tests 模块,用于与 Presto Native worker 运行端到端测试(#24234);
  • Spark 侧新增spark.dynamic-presto-memory-pool-tuning-enabled配置(#24714),根据容器可用内存动态调整 Spark executor 内存。

九、升级建议与注意事项汇总

综合 0.292 的变更,升级前建议重点确认:

  1. 权限行为变化:启用check_access_control_for_utlized_columns的集群,升级后 CTE 查询的列权限检查更严格,可能因"多查"而拒绝原本通过的查询——请提前在测试环境验证核心业务查询。
  2. 连接器 SPI 兼容:使用自定义连接器或基于ConnectorProtocolTemplate的 Native 连接器实现,需按新类型参数与ConnectorDeleteTableHandle接口适配。
  3. 属性重命名hive.stats_based_filter_reorder_disabled已更名为hive.native_stats_based_filter_reorder_disabled;旧名称不再生效。
  4. JVM 依赖升级:netty、grpc、calcite、log4j 等大规模升级,注意 classpath 冲突与第三方插件兼容性。
  5. Native 集群的 TPC-DS:使用 Native worker 时tpcds.use-varchar-type必须为true
  6. task.max-drivers-per-task:默认值从固定值改为按主机线程并发度自适应,若此前依赖旧默认值,建议显式配置以保持行为稳定。
  7. 构建环境:JDK 17 已获得支持,可逐步迁移构建环境,但需配合 JVM 参数回归验证。

参考资源

  • 完整发布说明:release-0.292.rst
  • Arrow Flight 连接器文档:base-arrow-flight.rst
  • Iceberg 连接器文档:iceberg.rst
  • 相关实现:StringFunctions.java、SystemSessionProperties.java、TaskManagerConfig.java、TpcdsConnectorFactory.java、IcebergTableProperties.java
  • 大数据
  • 数据库
  • 后端

【免费下载链接】presto

The official home of the Presto distributed SQL query engine for big data

项目地址:https://gitcode.com/gh_mirrors/pre/presto
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询