- 大数据
- 数据库
- 后端
【免费下载链接】presto
The official home of the Presto distributed SQL query engine for big data
本文是 Presto 开源版本 0.129 发布说明(release-0.129.rst)的深度技术解读,覆盖该版本在查询引擎、JDBC 驱动、CLI、调度器与 Hive 连接器上的全部功能变更,并结合当前仓库源码(如NodeSchedulerConfig、NetworkTopology、HiveS3Config等)剖析其底层实现原理。读完本文,你将掌握 P4HyperLogLog 的适用场景、node-scheduler.network-topology的配置语义、S3 服务端加密与区域固定选项的正确用法,以及 JDBC 驱动非查询语句支持的具体能力边界。
版本总览与已知问题
Release 0.129 是一次功能型迭代版本,主要亮点包括:
- 引入全新的
P4HyperLogLog数据类型,在基数估计场景中以少量精度换性能; - 调度器支持网络拓扑感知的 split 调度(
node-scheduler.network-topology); - Hive 连接器新增 S3 服务端加密、EC2 区域固定与
retention_days表属性支持; - JDBC 驱动补全非查询语句(DDL/DML)的执行支持。
⚠️ 已知性能回退(务必先读)
该版本存在一处已知性能回退:当GROUP BY或JOIN查询的 key 长度介于16 到 31 字节时,性能会明显下降。此问题已在 Release 0.130(release-0.130.rst)中修复。
升级建议:若生产环境大量使用 16~31 字节的字符串作为分组或关联键(如部分 UUID 短格式、定长业务编码),建议关注此区间查询性能,必要时直接评估升级到包含修复的后续版本。
General Changes:查询引擎与优化器变更
本节逐一解读该版本通用(引擎核心)部分的变更,每条均对应一个可验证的行为差异。
OUTER JOIN 规划器修复
修复了一个可能导致OUTER JOIN(LEFT/RIGHT/FULL 外连接)查询返回错误结果的 planner 问题。这类 bug 通常源于 join 谓词与过滤条件下推时的等价性判断错误,影响面涉及正确性而非性能,属于必须升级修复的类别。若你在此前的版本中遇到过外连接结果与预期不一致、且 SQL 本身逻辑无误的案例,可以重点回归验证。
max_by / min_by 内存统计更真实
使用max_by/min_by聚合函数的查询,现在能更准确地反映真实内存使用量。这意味着从该版本起,这类查询在监控中显示的内存用量会"变大",属于统计口径修正而非真实泄漏。原因是此前这两个函数在计算过程中保留的辅助状态未被完整计入用户内存统计,导致基于内存阈值(如查询内存上限)的评估失真。
SHOW SESSION 隐藏属性过滤
修复了 SHOW SESSION 会展示隐藏(hidden)会话属性的问题。隐藏属性通常用于内部或实验性参数,不应对用户暴露,此修复使会话属性列表更干净、更安全。
ORDER BY + LIMIT 大查询挂起修复
修复了大型查询在ORDER BY与LIMIT组合下可能发生的挂起(hang)。该问题一般出现在排序算子与 top-N 算子配合时,下游无法感知上游完成状态导致管道阻塞。此修复对"取全量数据排序后仅保留前 N 行"这类常见报表查询的稳定性有直接意义。
空数组 / 全 NULL 数组的强制转换修复
修复了将空数组或仅含NULL的数组强制转换为其他类型时的问题。此前CAST(ARRAY[] AS ARRAY<INTEGER>)一类操作可能产生未定义行为或报错,修复后空数组与全 NULL 数组的类型转换行为符合预期。
表属性名大小写不敏感
表属性名(table property names)现在被正确视为大小写不敏感。此前 Hive 等连接器的表属性(如formatvsFORMAT)匹配可能受大小写影响,现在统一按不区分大小写处理,提升了配置容错性。
其他引擎级改进
- 查询详情页 UI 优化:coordinator 的 Web UI 查询详情页面有小幅改进;
- Verifier 异常栈精简:verifier 对预期中的异常不再打印无用的堆栈信息,降低日志噪声;
- UNION ALL 写入性能提升:涉及
UNION ALL且需要写出数据的查询性能得到改善。
新增 P4HyperLogLog 类型
该版本引入了P4HyperLogLog数据类型,它基于 HyperLogLog 基数估计数据结构,核心 trade-off 是:在处理较小集合时,以少量精度与内存开销换取显著的性能提升。P4(P 代表参数化/优化的 HLL 实现变体)实现在小基数场景下优化了稀疏表示的读写路径。
从当前仓库的架构看,Presto 的近似去重函数族(如approx_distinct)与 HLL 相关类型均由引擎内部的统计数据结构支撑,P4HyperLogLog适合追求更高吞吐、且对极小误差不敏感的高基数去重统计场景(如流量 UV 统计、去重计数仪表盘)。如果你使用 Presto 做大规模去重统计,可在该版本起关注此类型在查询中的实际表现,并对比原有 HLL 类型的精度-性能曲线。
JDBC Driver 变更
Release 0.129 对 JDBC 驱动做了两项行为层面的大改动,直接影响下游应用代码的兼容性。
SET / RESET SESSION 由静默忽略改为抛异常
此前驱动对SET SESSION/RESET SESSION(参见 SET SESSION 与 RESET SESSION)会静默忽略,导致应用误以为设置会话属性成功。从该版本起,驱动改为抛出异常,明确告知调用方该操作不被支持。
兼容性提醒:如果你的应用此前通过 JDBC 发送
SET SESSION且依赖"静默通过"的行为,升级后必须改用连接 URL 参数(如session.<name>=<value>)或 Presto CLI 的--session选项来设置会话属性,否则会收到异常。
非查询语句支持补全
驱动现在能正确处理非查询语句(DDL/DML 等),具体能力包括:
Statement接口支持execute方法的全部变体(execute(String)、execute(String, int)、execute(String, int[])、execute(String, String[]));- 支持
getUpdateCount与getLargeUpdateCount方法,用于获取受影响行数。
这意味着通过 JDBC 执行CREATE TABLE、INSERT、DELETE、UPDATE等语句时,驱动行为与标准 JDBC 契约保持一致,应用可以依赖getUpdateCount()判断写入影响行数。
CLI 变更
ctrl-C取消查询时总是清屏:取消查询后终端不再残留查询输出碎片,交互体验更干净;- 客户端请求超时可配置:新增对客户端请求超时的配置能力,便于在慢网络或长任务场景下调整等待上限。
Network Topology Aware Scheduling(网络拓扑感知调度)
Release 0.129 允许调度器在分发 split 时考虑网络拓扑,通过node-scheduler.network-topology配置启用,详见 Tuning Presto。
配置项与取值
在 admin/properties.rst 中对该配置的完整定义如下:
- 类型:
string - 允许值:
legacy、flat - 默认值:
legacy
| 取值 | 行为 |
|---|---|
legacy | 调度 split 时忽略网络拓扑(默认行为) |
flat | 尝试将 split 调度到数据所在主机,为本地 split 保留50% 的工作队列 |
官方建议:当分布式存储与 Presto worker 部署在同一批节点上时,推荐使用flat,可显著减少跨网络数据传输。示例配置(写入 coordinator 的config.properties):
node-scheduler.network-topology=flat源码级实现
从当前仓库源码可以完整还原该特性的实现结构:
- 配置绑定:
NodeSchedulerConfig通过@Config("node-scheduler.network-topology")读取该配置(NodeSchedulerConfig.java),默认值为legacy,同时内部还预留了benchmark类型(同文件NetworkTopologyType常量); - 拓扑抽象:
NetworkTopology接口定义了两个核心方法——NetworkLocation locate(HostAddress address)(将主机地址映射为网络位置)与getLocationSegmentNames()(返回位置分段语义说明),并标注@ThreadSafe,要求实现必须线程安全(NetworkTopology.java); - 实现类:
FlatNetworkTopology将每个主机映射为单段位置machine/<hostname>(FlatNetworkTopology.java),LegacyNetworkTopology则维持原有忽略拓扑的行为; - 模块装配:在 ServerMainModule.java 中,根据配置值将
NetworkTopology接口绑定到LegacyNetworkTopology或FlatNetworkTopology单例。
因此,flat模式的核心机制是:调度器优先把 split 派发给持有对应数据副本的 worker,并保留 50% 队列容量给本地 split,从而最大化数据本地性。若你的集群是存算一体架构(worker 同时运行 HDFS 等服务),此配置几乎是"零成本"的传输优化项。
Hive Changes:S3 支持增强
S3 区域固定(pin to current region)
此前的版本在 EC2 中运行时会自动将 S3 客户端固定到当前区域;Release 0.129 改为默认不再自动固定。如需启用,在 Hive catalog 属性文件中设置:
hive.s3.pin-client-to-current-region=true启用该特性的影响有两面性:
- 必须启用才能访问**中国隔离区域(China isolated region)**的 S3 数据;
- 但启用后无法访问当前区域之外的数据(客户端被钉死在本地区域)。
源码佐证:该选项在 HiveS3Config.java 中定义,@Config("hive.s3.pin-client-to-current-region")的说明为 "Should the S3 client be pinned to the current EC2 region"。同时S3ConfigurationUpdater(S3ConfigurationUpdater.java)中对应系统属性常量为presto.s3.pin-client-to-current-region。
S3 服务端加密(Server-Side Encryption)
该版本新增 S3 服务端加密支持,启用方式:
hive.s3.sse.enabled=true源码佐证:在 HiveS3Config.java 中定义,@ConfigDescription("Enable S3 server side encryption")。与之配套的还有加密类型与密钥配置:
# 加密类型:S3(SSE-S3)或 KMS(SSE-KMS) hive.s3.sse.type=KMS # 使用 KMS 时指定密钥 ID hive.s3.sse.kms-key-id=your-kms-key-id对应源码:hive.s3.sse.type绑定到PrestoS3SseType枚举(S3或KMS,见 HiveS3Config.java),hive.s3.sse.kms-key-id用于 SSE-KMS 模式。使用场景包括:满足数据静态加密合规要求、防止 S3 服务端明文存储敏感数据。
新增 S3 EncryptionMaterialsProvider 支持
该版本还支持自定义 S3EncryptionMaterialsProvider,允许用户通过实现该接口注入自定义加密材料(如自定义密钥管理流程),适用于对加密密钥生命周期有特殊管控需求的场景。具体接入方式是在 Hive catalog 属性中指定实现了EncryptionMaterialsProvider的类。
新增 retention_days 表属性
Hive 连接器新增retention_days表属性,用于为表设置保留天数。该属性允许你在建表时声明数据保留周期(如配合定时清理任务使用),例如:
CREATE TABLE orders ( order_id bigint, ... ) WITH ( format = 'ORC', retention_days = 30 );注意:retention_days只是向元数据(Hive Metastore)写入保留周期声明,实际的过期数据清理仍需由外部运维任务依据该属性执行。
升级与验证清单
围绕 Release 0.129 的变更,建议升级后依次验证:
- 正确性回归:重点跑一遍包含
OUTER JOIN、空数组/全 NULL 数组CAST、ORDER BY ... LIMIT的查询用例; - 内存监控核对:确认使用
max_by/min_by的查询内存曲线变化符合预期(统计口径修正); - JDBC 行为测试:验证应用对
SET SESSION的异常处理,以及INSERT/DELETE后getUpdateCount()返回值; - S3 配置生效:在 Hive catalog 中按需开启
hive.s3.sse.enabled与hive.s3.pin-client-to-current-region,并用SHOW CREATE TABLE确认retention_days属性写入; - 调度优化:存算一体集群可将
node-scheduler.network-topology设为flat,对比前后查询延迟与网络流量。
相关延伸阅读:完整的节点调度属性清单见 admin/properties.rst,性能调优指南见 Tuning Presto,SQL 语法参考见 SET SESSION、RESET SESSION 与 SHOW SESSION。
- 大数据
- 数据库
- 后端
【免费下载链接】presto
The official home of the Presto distributed SQL query engine for big data
相关推荐
Presto Release 0.75 技术解读:Hive S3 调优、JSON 路径语法、负载感知调度与 Row Number 优化
Presto Release 0.75 技术解读:Hive S3 调优、JSON 路径语法、负载感知调度与 Row Number 优化 Release 0.75
大数据数据库后端Kubernetes 批处理工作组 2022 年度报告解读:Job API 增强、Kueue 与拓扑感知调度
Kubernetes 批处理工作组 2022 年度报告解读:Job API 增强、Kueue 与拓扑感知调度 导读 本文围绕 Kubernetes 社区仓库中
开源治理文档研发协作Volcano HyperNode 网络拓扑自动发现实战:从 ConfigMap 配置到调度器拓扑感知
Volcano HyperNode 网络拓扑自动发现实战:从 ConfigMap 配置到调度器拓扑感知 本文围绕 Volcano 的 HyperNode 网络拓
云原生后端任务调度批处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考