资讯详情

Presto Release 0.90 技术解读:规划器改进、新聚合函数与关键配置项

📅 2026/9/24 13:17:11 | 华诺云谱 👁 阅读
Presto Release 0.90 技术解读:规划器改进、新聚合函数与关键配置项
大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载本文以 Presto 0.90 版本的官方发布说明为主体逐项解读该版本在查询规划、函数与语言特性、Hive 连接器以及 SPI 层面的变更并结合当前仓库源码说明task.writer-count、compiler.interpreter-enabled、hive.assume-canonical-partition-keys等配置项的作用与背景。读完本文你将掌握 0.90 版本引入的核心能力、每项变更背后的设计意图以及升级到该版本时需要注意的兼容性事项。版本警告Presto 0.90 存在内存泄漏问题官方明确提示该版本不应被使用This release has a memory leak and should not be used。本文仅作为技术演进记录与源码解读实际生产部署请选择修复该问题之后的版本。一、General Changes规划器与执行引擎的整体改进0.90 版本在查询规划、任务执行与错误处理上有多项改进以下是官方发布说明中列出的全部变更及其源码侧印证。1. 分区与放置感知Partition and Placement AwarenessInitial support for partition and placement awareness in the query planner. This can result in better plans for queries involvingJOINandGROUP BYover the same key columns.查询规划器开始初步支持分区感知与放置感知。当查询在相同 key 列上同时执行JOIN和GROUP BY时规划器可以据此生成更优的执行计划——例如让数据在本地完成部分聚合减少跨节点 shuffle 的数据量。该特性是后续 Presto 分布式执行优化如 grouped execution、分区感知调度的早期雏形。2. UNION 查询规划改进Improve planning of UNION queries.UNION 查询的规划质量得到提升。这一方向与后续版本对 UNION 的分布式执行优化一脉相承。3. 查询事件中携带 Presto 版本号Add presto version to query creation and completion events.查询创建事件query creation events与查询完成事件query completion events现在会携带 Presto 版本号方便运维侧按版本审计、排查问题。4. 新增配置项 task.writer-count每个任务的写入线程数Add propertytask.writer-countto configure the number of writers per task.该配置项用于设置每个 task 的 writer写入器数量直接影响写入密集型查询如INSERT、CREATE TABLE AS的并行度。从当前仓库源码看该配置的解析入口位于 TaskManagerConfig.javaConfig(task.writer-count) public TaskManagerConfig setWriterCount(int writerCount) { this.writerCount writerCount; return this; }其默认值为1见同文件中private int writerCount 1;即默认每个 task 只有一个 writer。配置方式是在 coordinator 与 worker 的config.properties中加入task.writer-count4与之配套的还有task.partitioned-writer-count位于同一文件中带ConfigDescription注解说明Number of writer threads per task for partitioned writes. If not set, the number set by task.writer-count will be used用于为分区写入单独设置 writer 数未设置时回退到task.writer-count的值。该配置项同样暴露为会话级属性可在 SystemSessionProperties.java 中看到其对应实现。5. 若干 Bug 修复二进制类型常量表达式优化修复了优化涉及 binary 类型的常量表达式时的 bug。表写入器部分提交问题修复了清理失败查询时表写入器可能提交部分结果的问题避免失败查询留下半成品数据。包含 NaN/Infinity 的 double 数组 unnest修复了对包含 NaN 或 Infinity 的 double 数组执行UNNEST时的 bug。空数组元素访问修复了访问空数组中元素时的失败问题。Remote page is too large 错误修复了该远程页过大的报错。CAST 到 UNKNOWN 的错误信息改进了将值 cast 为UNKNOWN类型时的错误提示。approx_distinct 文档修正更新了approx_distinct的文档给出正确的标准误差界。6. 默认关闭解释器回退新增 compiler.interpreter-enabledDisable falling back to the interpreter when expressions fail to be compiled to bytecode. To enable this option, addcompiler.interpreter-enabledtrueto the coordinator and worker config properties. Enabling this option will allow certain queries to run slowly rather than failing.Presto 会将表达式编译为字节码bytecode以提升执行效率。此前若表达式编译失败Presto 会自动回退到解释器interpreter执行0.90 起这一回退行为被默认关闭——编译失败时查询将直接失败而不是静默降级为慢速解释执行。如果希望保留慢速执行而非失败的行为需在 coordinator 和 worker 的config.properties中显式开启compiler.interpreter-enabledtrue从当前仓库源码看该配置已被标记为废弃配置DefunctConfig(compiler.interpreter-enabled)见 CompilerConfig.java说明后续版本已彻底移除该回退路径表达式编译失败一律按错误处理。这是 Presto 执行引擎向编译优先、严格失败演进过程中的重要一步。7. Java 客户端 JDBC 语义收敛Improve Java client conformance. In particular, all unimplemented methods now throwSQLExceptionrather thanUnsupportedOperationException.Java 客户端JDBC 驱动的规范符合性得到改进所有未实现的方法现在统一抛出SQLException而不是UnsupportedOperationException这符合 JDBC 规范对驱动行为的要求方便应用层按标准方式捕获驱动异常。相关文档见 presto-docs/src/main/sphinx/clients/java.rst。二、Functions and Language Features新函数与 SQL 语言增强1. 新增聚合函数bool_and、bool_or、every 与 map_aggAddbool_andandbool_oraggregation functions. Add standard SQL functioneveryas an alias forbool_and. Addmap_aggaggregation function.0.90 新增了四个聚合函数函数语义说明bool_and(boolean)对一组布尔值求逻辑与只要存在一个false即返回falsebool_or(boolean)对一组布尔值求逻辑或只要存在一个true即返回trueevery(boolean)标准 SQL 别名等价于bool_and提供标准 SQL 兼容写法map_agg(key, value)将两列聚合成一个 MAPkey 为 MAP 的键value 为对应的值从当前仓库源码看bool_and与bool_or的实现分别位于 BooleanAndAggregation.java 与 BooleanOrAggregation.javamap_agg的实现位于 MapAggregationFunction.java它们与map_union等函数共同组成 Presto 的 Map 类聚合函数家族。典型用法示例-- 检查某组订单是否全部已支付 SELECT order_id, bool_and(paid) AS all_paid FROM orders GROUP BY order_id; -- 使用标准 SQL 的 every 别名 SELECT order_id, every(paid) AS all_paid FROM orders GROUP BY order_id; -- 将键值两列聚合成 map SELECT user_id, map_agg(attr_key, attr_value) AS attrs FROM user_attributes GROUP BY user_id;2. 新增标量函数year_of_week 与 regexp_extract_allAddyear_of_weekfunction. Addregexp_extract_allfunction.year_of_week(date)返回给定日期所在周所属的年份ISO 周历中的年份。与week()配合使用可正确处理跨年周例如 2020 年最后几天落在 2021 年第 1 周的情况。regexp_extract_all(string, pattern)返回输入字符串中所有匹配正则表达式的子串结果为数组。与仅返回第一个匹配的regexp_extract形成互补。-- 提取字符串中所有数字 SELECT regexp_extract_all(abc123def456, [0-9]); -- [123, 456] -- 获取 ISO 周年份 SELECT year_of_week(DATE 2021-01-01); -- 2020该日期属于 2020 年的第 53 周3. JSON 到 ARRAY/MAP 的 CAST 支持Add support for castingJSONtoARRAYorMAPtypes.此前 JSON 只能转换为标量或ROW结构0.90 起支持将JSON直接 cast 为ARRAY或MAP类型SELECT CAST(JSON [a, b] AS ARRAY(VARCHAR)); -- [a, b] SELECT CAST(JSON {k: 1} AS MAP(VARCHAR, INTEGER)); -- {k1}4. VALUES 子句支持无括号表达式Add support for unparenthesized expressions inVALUESclause.VALUES子句现在可以直接使用无括号包裹的表达式列表SQL 写法更加灵活。5. 新增 SET SESSION / RESET SESSION / SHOW SESSION 语句AddedSET SESSION,RESET SESSIONandSHOW SESSION.0.90 正式引入了会话管理三件套SET SESSION设置会话级属性例如SET SESSION task_writer_count 4;RESET SESSION将会话属性重置为默认值例如RESET SESSION task_writer_count;SHOW SESSION列出当前所有会话属性及其默认值会话属性与配置文件中的属性一一对应如task.writer-count对应会话属性task_writer_count这为用户在不重启集群的情况下按会话调整行为提供了便利。6. EXPLAIN (TYPE DISTRIBUTED) 输出增强Improve formatting ofEXPLAIN (TYPE DISTRIBUTED)output and include additional information such as output layout, task placement policy and partitioning functions.分布式执行计划的格式化输出得到改进新增了**输出布局output layout、任务放置策略task placement policy和分区函数partitioning functions**等信息便于开发者理解数据在集群中的分布方式与 shuffle 策略。EXPLAIN (TYPE DISTRIBUTED) SELECT regionkey, count(*) FROM nation GROUP BY regionkey;三、Hive ChangesHive 连接器的重要修复1. 默认关闭非字符串分区键的优化获取新增 hive.assume-canonical-partition-keysDisable optimized metastore partition fetching for non-string partition keys. This fixes an issue were Presto might silently ignore data with non-canonical partition values. To enable this option, addhive.assume-canonical-partition-keystrueto the coordinator and worker config properties.这是一个重要的数据正确性修复。此前 Presto 对非字符串分区键如INT、DATE使用优化的 metastore 分区批量获取路径但该路径要求分区值必须是规范形式canonical——例如DATE 2021-01-01应存储为2021-01-01而非2021-1-1。若 Hive 表中存在非规范形式的分区值Presto 可能会静默忽略这些分区对应的数据造成查询结果不完整。0.90 的修复方式是默认禁用针对非字符串分区键的优化获取路径。如果确认你的 Hive 表中所有分区值都是规范形式、且希望恢复优化路径的性能可在 coordinator 和 worker 的config.properties中显式开启hive.assume-canonical-partition-keystrue从当前仓库源码看该配置项的解析位于 HiveClientConfig.javaConfig(hive.assume-canonical-partition-keys) public HiveClientConfig setAssumeCanonicalPartitionKeys(boolean assumeCanonicalPartitionKeys) { this.assumeCanonicalPartitionKeys assumeCanonicalPartitionKeys; return this; }字段默认值为falseprivate boolean assumeCanonicalPartitionKeys;与发布说明中默认关闭、需显式开启的表述一致。相关使用逻辑散见于 Hive 连接器的分区元数据与 split 生成代码中如 HiveMetadata.java、HiveSplitSource.java并在 TestHiveClientConfig.java 等测试中有覆盖。2. S3 权限错误不再重试Dont retry operations against S3 that fail due to lack of permissions.针对 S3 的访问请求若失败原因是权限不足如 AccessDeniedPresto 将不再重试避免无意义的重复请求拖慢整体失败速度。四、SPI Changes连接器 SPI 的破坏性变更AddgetColumnTypestoRecordSink. UseSlicefor table writer fragments. AddConnectorPageSinkwhich is a more efficient interface for column-oriented sources.SPI 层有三项变更RecordSink新增getColumnTypes方法写入器可以获知列类型信息。表写入器片段改用Slicewriter fragment 的数据载体统一为SlicePresto 的二进制缓冲抽象。新增ConnectorPageSink接口面向列式数据源提供更高效的写入口替代原先逐行写入的模式。重要兼容性提示官方原文This is a backwards incompatible change with the previous connector SPI. If you have written a connector, you will need to update your code before deploying this release.即这是一次向后不兼容的 SPI 变更。任何基于旧版 SPI 自研连接器的用户在升级到 0.90 之前必须同步更新连接器代码实现getColumnTypes、改用Slice承载 writer fragment、或将写入逻辑迁移到ConnectorPageSink否则将无法正常工作。五、升级建议与注意事项综合以上内容升级到 Presto 0.90 时请重点关注不要在生产使用 0.90该版本存在已知内存泄漏官方明确不建议使用应升级到包含修复的后续版本。检查自定义连接器SPI 变更向后不兼容自定义连接器必须适配RecordSink.getColumnTypes、Slicewriter fragment 与ConnectorPageSink。复核非字符串分区键的 Hive 表若你的表分区值全部规范可开启hive.assume-canonical-partition-keystrue恢复优化路径否则保持默认关闭以保证数据不丢失。表达式编译失败策略变化编译失败不再回退解释器查询会直接失败需要慢速兜底可临时开启compiler.interpreter-enabledtrue后续版本已彻底废弃该配置。按需调整写入并行度task.writer-count默认1写入密集型负载可通过配置文件或会话属性SET SESSION task_writer_count N调大。善用新函数与语句bool_and/bool_or/every/map_agg、year_of_week/regexp_extract_all、SET/RESET/SHOW SESSION与增强版EXPLAIN (TYPE DISTRIBUTED)均可直接投入使用。相关文档与源码索引版本发布说明原文release-0.90.rsttask.writer-count配置实现TaskManagerConfig.javacompiler.interpreter-enabled废弃标记CompilerConfig.javahive.assume-canonical-partition-keys配置实现HiveClientConfig.java新聚合函数实现BooleanAndAggregation.java、BooleanOrAggregation.java、MapAggregationFunction.java会话管理语句文档set-session.rst、reset-session.rst、show-session.rstJava 客户端文档java.rst赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐Presto Release 0.169 版本详解规划回归修复、聚合性能优化与 JDBC/CLI/Cassandra 改进Presto Release 0.169 版本详解规划回归修复、聚合性能优化与 JDBC/CLI/Cassandra 改进 导读 本文基于 Presto 官大数据数据库后端Presto Release 0.82 技术解读ROW 类型原生支持、current_timezone 函数与查询规划优化Presto Release 0.82 技术解读ROW 类型原生支持、current_timezone 函数与查询规划优化 本文以 release 0.82.大数据数据库后端Presto Release 0.86 技术解析新函数、JOIN 能力增强与查询稳定性改进Presto Release 0.86 技术解析新函数、JOIN 能力增强与查询稳定性改进 本篇文章以当前仓库中 release 0.86.rst https大数据数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。