- 大数据
- 数据库
- 后端
【免费下载链接】presto
The official home of the Presto distributed SQL query engine for big data
导读
本文基于 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、Iceberg
UPDATESQL 语句; - 新函数: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_extract、json_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=true9.task.max-drivers-per-task默认值改进
#24642将task.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将调度关键路径中的DataSize、DateTime改为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_columns为true时,使用WITH子句(CTE)的查询此前有时不会检查部分被使用列的权限。修复后引擎会始终检查查询中所有被使用列的权限。
文档同时指出了两个已知边界情况(原样引用):
- 存在同名 CTE时,可能检查的列多于实际使用的列;
- 或者退化为检查查询中引用的全部列。
这意味着该修复以"宁可多查、不可漏查"换取安全性,启用严格列权限检查的集群升级后应关注 CTE 相关查询的权限行为是否符合预期。
2. 依赖升级与 CVE 修复
0.292 响应多个 CVE 与安全公告,批量升级了底层依赖,包括:
| 依赖 | 目标版本 | 响应的安全公告 |
|---|---|---|
| netty | 4.1.115.Final | CVE-2024-47535 |
| libthrift | 0.14.1 | CVE-2020-13949 |
| io.grpc | 1.70.0 | CVE-2024-7254、CVE-2020-8908 |
| log4j-api / log4j-core | 2.24.3 | CVE-2024-47554 |
| commons-text | 1.13.0 | CVE-2024-47554 |
| okhttp / okio | 4.12.0 / 3.6.0 | CVE-2023-3635 |
| org.apache.calcite | 1.38.0 | CVE-2023-2976 |
| org.apache.ratis | 3.1.3 | CVE-2020-15250 |
| aws-java-sdk | 1.12.782 | CVE-2024-21634 |
| json-smart | 2.5.2 | CVE-2024-57699 |
| accumulo | 1.10.1 | CVE-2020-17533 |
| hive-dwrf(含 snappy 0.5) | 0.8.7 | CVE-2024-36124 |
| prismJs | 1.30.0 | CVE-2024-53382 |
| errorprone | 2.36.0 | — |
| jQuery | 3.7.1 | 随 bootstrap 升级 |
| bootstrap | 5 | — |
此外:
- 移除
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.path、UPDATE支持外,还包括:- 新增
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 层有较多破坏性变更,自定义连接器/插件在升级时需重点核对:
- 删除句柄类型化(
#24528、#24721):ConnectorMetadata.beginDelete返回类型、finishDelete入参类型均替换为新增的独立接口ConnectorDeleteTableHandle,取代原先复用ConnectorTableHandle的做法;Metadata中ConnectorTableHandles相关变更同步支持DeleteTableHandle。 ConnectorProtocolTemplate类型参数(#24721):为ConnectorProtocolTemplate实现增加类型参数,以支持连接器特有类型的(反)序列化。已有 Native 连接器实现必须更新定义,为其类型提供具体类型或使用NotImplemented。PlanChecker签名变化(#24557):PlanChecker.validate与PlanChecker.validateFragment新增ConnectorSession参数。- 新增
IndexSourceNode到 SPI(#24678)。 - 表达式优化器工厂扩展点(
#24144):新增CoordinatorPlugin#getExpressionOptimizerFactories,允许自定义协调器侧表达式求值。 - 事件监听增强(
#24456、#24590):支持多个查询事件监听器;QueryCompletedEvent中新增 node ID 到 plan node 的映射。 - 可重试错误标记(
#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-ratioshared-arbitrator.global-arbitration-memory-reclaim-pctshared-arbitrator.global-arbitration-without-spillshared-arbitrator.memory-pool-abort-capacity-limitshared-arbitrator.memory-pool-min-reclaim-bytesshared-arbitrator.memory-reclaim-threads-hw-multiplier
- 系统配置扩展(
#24726、#24774):新增spill-enabled、join-spill-enabled、aggregation-spill-enabled、order-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 的变更,升级前建议重点确认:
- 权限行为变化:启用
check_access_control_for_utlized_columns的集群,升级后 CTE 查询的列权限检查更严格,可能因"多查"而拒绝原本通过的查询——请提前在测试环境验证核心业务查询。 - 连接器 SPI 兼容:使用自定义连接器或基于
ConnectorProtocolTemplate的 Native 连接器实现,需按新类型参数与ConnectorDeleteTableHandle接口适配。 - 属性重命名:
hive.stats_based_filter_reorder_disabled已更名为hive.native_stats_based_filter_reorder_disabled;旧名称不再生效。 - JVM 依赖升级:netty、grpc、calcite、log4j 等大规模升级,注意 classpath 冲突与第三方插件兼容性。
- Native 集群的 TPC-DS:使用 Native worker 时
tpcds.use-varchar-type必须为true。 task.max-drivers-per-task:默认值从固定值改为按主机线程并发度自适应,若此前依赖旧默认值,建议显式配置以保持行为稳定。- 构建环境: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
相关推荐
Presto 0.293 版本发布详解:Thrift 序列化、Router 增强、原生执行与连接器新特性全解读
Presto 0.293 版本发布详解:Thrift 序列化、Router 增强、原生执行与连接器新特性全解读 Presto 0.293 是 Presto(Tr
大数据数据库后端Presto 0.261 版本发布详解:DECIMAL 聚合性能优化、Hive 隐藏列、Iceberg LocationProvider 与连接器增强
Presto 0.261 版本发布详解:DECIMAL 聚合性能优化、Hive 隐藏列、Iceberg LocationProvider 与连接器增强 本篇技术
大数据数据库后端Presto 0.197 版本发布详解:查询调度修复、ORC 写入优化与资源组命名变量支持
Presto 0.197 版本发布详解:查询调度修复、ORC 写入优化与资源组命名变量支持 Presto 0.197 是 Presto 分布式 SQL 查询引擎
大数据数据库后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考