ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Presto Release 0.271 特性解析:Distinct 聚合大块溢出、Cast 语义收紧与 Hive/Iceberg 连接器增强

Presto Release 0.271 特性解析:Distinct 聚合大块溢出、Cast 语义收紧与 Hive/Iceberg 连接器增强 Presto Release 0.271 特性解析Distinct 聚合大块溢出、Cast 语义收紧与 Hive/Iceberg 连接器增强【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto导读Presto 0.271 是 Presto 分布式 SQL 查询引擎的一次功能与稳定性并重的版本发布核心亮点包括新增基于块大小的 Distinct 聚合溢出spill控制能力为内存压力治理提供更细粒度的手段收紧 bigint 转 varchar 的语义避免数据静默截断同时修复了一致性哈希调度下的缓存性能问题与 Join 重排优化缺陷并为 Hive、Iceberg 连接器带来多项改进。本文以官方 Release Notes 为骨架结合仓库源码逐一解析每个变更的技术原理、配置方法与升级注意事项帮助读者准确评估升级影响并正确使用新特性。一、通用引擎变更General Changes1. 修复一致性哈希调度下的缓存性能问题Release 0.271 修复了当CONSISTENT_HASHING被用作调度策略scheduling strategy时缓存性能可能受到影响的问题。在 Presto 中调度策略决定了分片split在 worker 节点间的分布方式而一致性哈希Consistent Hashing被用于提升缓存亲和性cache affinity让相同数据的查询尽可能命中同一批节点从而提升 fragment cache 等缓存模块的命中率。该版本修复了该策略下缓存命中率被意外削弱的问题使启用一致性哈希调度的集群能够获得预期的缓存收益。2. Cast 语义修正bigint 转 varchar 不再静默截断此版本修复了bigint到varchar的转换行为。此前将一个数值转换为宽度不足的定长varchar时可能不会报错现在当目标varchar的宽度小于容纳结果所需的大小时转换将直接失败。官方给出的 CLI 示例select cast(1234500000000000000 as varchar(3));执行结果将报错Query ... failed: Value 1234500000000000000 cannot be represented as varchar(3)这一变更属于行为收紧类破坏性变更breaking change如果业务 SQL 中存在依赖截断不报错的隐式转换逻辑升级后可能触发查询失败。建议在升级前扫描线上 SQL将此类转换改为显式的varchar(N)长度声明或使用try_cast进行容错处理。3. 修复 Reorder Joins 优化缺陷修复了重排 Join 优化reorder joins optimization的一个缺陷当原始构建侧build side大于配置的join-max-broadcast-table-size时生成的执行计划可能不是最优的。该配置用于控制广播 Joinbroadcast join的构建侧大小上限。本次修复确保了即使原始 build 侧尺寸超过阈值、需要切换到其他 Join 策略如分桶 Join时Join 顺序重排仍能产生合理的执行计划避免因策略切换导致计划质量下降。4. 核心新特性Distinct 聚合大块溢出Large Block Spill这是本版本最值得关注的新功能面向高基数 Distinct 聚合场景下的内存管理问题。当单个数据块block体积过大时将其整体保留在内存中进行 Distinct 去重会占用大量内存。0.271 引入了两个新的配置属性允许将超过阈值的块单独溢出spill到独立的溢出文件中。新增配置属性experimental.distinct-aggregation-large-block-size-threshold作用定义块大小阈值字节超过该阈值的块将被溢出到单独的 spill 文件。可被 Session 属性distinct_aggregation_large_block_size_threshold覆盖。默认值50MB由源码确认见下文。experimental.distinct-aggregation-large-block-spill-enabled作用启用将大于上述阈值的块溢出到独立 spill 文件的行为。可被 Session 属性distinct_aggregation_large_block_spill_enabled覆盖。默认值false默认关闭需要显式开启。源码级解析配置定义与默认值配置类位于 JavaFeaturesConfig.java其中明确了两个属性的定义方式与默认值private boolean distinctAggregationLargeBlockSpillEnabled; private DataSize distinctAggregationLargeBlockSizeThreshold new DataSize(50, MEGABYTE); Config(experimental.distinct-aggregation-large-block-size-threshold) ConfigDescription(Block size threshold beyond which it will be spilled into a separate spill file) public JavaFeaturesConfig setDistinctAggregationLargeBlockSizeThreshold(DataSize distinctAggregationLargeBlockSizeThreshold) { ... } Config(experimental.distinct-aggregation-large-block-spill-enabled) ConfigDescription(Spill large block to a separate spill file) public JavaFeaturesConfig setDistinctAggregationLargeBlockSpillEnabled(boolean distinctAggregationLargeBlockSpillEnabled) { ... }即distinctAggregationLargeBlockSizeThreshold默认值为50 MBdistinctAggregationLargeBlockSpillEnabled默认值为false。该文件还展示了本特性所在的溢出特性族中的其他相关配置便于读者理解上下文配置属性默认值说明experimental.aggregation-spill-enabledtrue聚合运算是否允许溢出experimental.distinct-aggregation-spill-enabledtrueDistinct 聚合是否允许溢出experimental.dedup-based-distinct-aggregation-spill-enabledfalse溢出前是否先对 Distinct 输入去重experimental.distinct-aggregation-large-block-spill-enabledfalse大块是否溢出到独立 spill 文件本版本新增experimental.distinct-aggregation-large-block-size-threshold50MB大块溢出阈值本版本新增Session 属性覆盖机制配置项对应的 Session 属性常量定义在 JavaWorkerSessionPropertyProvider.java 中public static final String DISTINCT_AGGREGATION_LARGE_BLOCK_SPILL_ENABLED distinct_aggregation_large_block_spill_enabled; public static final String DISTINCT_AGGREGATION_LARGE_BLOCK_SIZE_THRESHOLD distinct_aggregation_large_block_size_threshold;这意味着无需修改集群配置即可针对单个查询或会话临时调节行为例如SET SESSION distinct_aggregation_large_block_spill_enabled true; SET SESSION distinct_aggregation_large_block_size_threshold 100MB;运行时的实际溢出判断逻辑在 GenericAccumulatorFactory.java 中聚合算子会在执行期读取这两个参数通过isDistinctAggregationLargeBlockSpillEnabled(session)与getDistinctAggregationLargeBlockSizeThreshold(session)并在构建聚合状态时判断if (isDistinctAggregationLargeBlockSpillEnabled) { if (rowBlock.getSizeInBytes() distinctAggregationLargeBlockSizeThreshold.toBytes()) { // 将大块溢出到单独的 spill 文件 } }可以看出实际生效路径是查询会话 → Session 属性/集群配置 → GenericAccumulatorFactory 运行时判断块大小 → 超过阈值则整块溢出。当单个块包含大量 Distinct 值时将其整体移出内存可以显著降低内存峰值代价是引入额外的磁盘 I/O因此该特性适合内存紧张但磁盘充裕的部署环境。配置解析的单元测试可参考 TestJavaFeaturesConfig.java用于验证属性到配置对象的正确绑定。配置示例config.properties# 启用大块溢出并将阈值调整为 100MB默认 50MB experimental.distinct-aggregation-large-block-spill-enabledtrue experimental.distinct-aggregation-large-block-size-threshold100MB5. Web UI 支持查看展开后的 Prepared Query0.271 在 Web UI 中新增了对**展开后 prepared query预处理查询展开结果**的查看支持。用户通过 Prepared Statement 提交查询时实际执行的是参数替换、宏展开后的完整查询文本此功能便于在排查问题时直接查看最终下发的展开后 SQL而无需手动拼参数。6. 使用 double/real 作为 Map 键时生成警告从本版本开始当查询中创建以double或real浮点类型作为键的map时Presto 会生成一条警告。浮点数在计算机中以近似值存储如0.1实际为二进制近似直接作为 Map 键存在精度与相等性判断上的隐患如NaN、0.0/-0.0等问题因此引擎对该用法给出提示帮助用户在编写 SQL 时尽早发现潜在风险。二、Hive 连接器变更Hive Connector Changes1. 修复分区 Hive 表带复杂列的 ANALYZE TABLE修复了针对包含复杂列array、map、struct的分区 Hive 表执行ANALYZE TABLE时的缺陷。此前对这类表收集统计信息可能失败或产生错误结果本版本修复了该场景确保复杂列类型也能正确完成统计信息采集。2. 提升复杂列表的 ANALYZE TABLE 性能在修复正确性的同时本版本还优化了含复杂列 Hive 表上ANALYZE TABLE的性能。复杂列的统计收集如嵌套结构的 null 比例、唯一值估算等通常比标量列开销更大此优化直接降低了 CBO基于成本的优化器在复杂表上的统计收集成本进而改善后续 Join 顺序选择与表扫描计划的生成质量。实践建议升级到 0.271 后对于此前 ANALYZE 异常的复杂列分区表建议重新执行一次ANALYZE TABLE ...以刷新统计信息从而让优化器获得准确的成本依据。三、Iceberg 连接器变更Iceberg Connector Changes1. 移除 iceberg.catalog.uri 配置本版本移除了iceberg.catalog.uri配置项统一改用hive.metastore.uri。此前 Iceberg 连接器内部存在独立的 catalog URI 配置与 Hive Metastore URI 配置并存且易造成混淆升级后 Iceberg 的元数据访问将统一走hive.metastore.uri。升级注意如果现有 Iceberg catalog 配置中设置了iceberg.catalog.uri升级到 0.271 后该配置不再生效必须将其值迁移到hive.metastore.uri否则连接器可能无法访问元数据。迁移示例catalog 配置文件如etc/catalog/iceberg.properties# 迁移前 # iceberg.catalog.urithrift://metastore-host:9083 # 迁移后 hive.metastore.urithrift://metastore-host:90832. Iceberg 连接器支持 ORC 格式缓存模块Iceberg 连接器新增了对ORC 格式缓存模块的支持使得 Iceberg 表上的 ORC 读取可以接入 Presto 的缓存框架在重复查询热点数据时利用缓存降低底层存储访问开销。这一能力与 Presto 的 fragment cache / 数据缓存体系一致适合冷热数据访问不均、希望降低远程存储延迟的场景。3. Iceberg 连接器支持基本时间戳类型Iceberg 连接器新增了对基本 timestamp时间戳类型的支持使时间戳列可以在 Iceberg 表上正常读写与参与运算。该变更扩大了 Iceberg 连接器的类型覆盖面此前因类型不支持而无法使用的 timestamp 字段在升级后可直接使用。四、版本 Credits本版本由以下贡献者共同完成Abhishek Aggarwal, Amit Dutta, Arjun Gupta, Arunachalam Thirupathi, Beinan, Chunxu Tang, James Petty, James Sun, JySongWithZhangCe, Masha Basmanova, Mayank Garg, Neerad Somanchi, Otakar Trunecek, Pranjal Shankhdhar, Rebecca Schlussel, Rongrong Zhong, Sergii Druzkin, Shashwat Arghode, Swapnil Tailor, Timothy Meehan, Zitong Wei, Abhisek Saikia, Eric Liu, Mengdi Lin, singcha, v-jizhang。五、升级检查清单变更项类型升级动作bigint→varchar cast 语义收紧破坏性检查依赖截断的 SQL改用try_cast或加大长度移除iceberg.catalog.uri破坏性迁移到hive.metastore.uri新增 distinct 大块溢出配置新增功能需要时开启experimental.distinct-aggregation-large-block-spill-enabledWeb UI 展开 prepared query新增功能直接可用map 使用浮点键警告新增告警审视相关 SQL 的键类型Hive ANALYZE 修复与优化修复/优化建议重新 ANALYZE 复杂列表CONSISTENT_HASHING 缓存修复修复无需动作总体而言Presto 0.271 以内存治理精细化 语义正确性收紧 连接器能力补全为主线Distinct 聚合大块溢出为高基数聚合场景提供了新的内存减压手段cast 语义修正与配置移除属于需要提前评估的破坏性变更Hive/Iceberg 连接器的修复与增强则让复杂列统计与 Iceberg 类型支持更加完善。建议读者结合自身集群配置与 SQL 使用情况对照上述检查清单完成升级验证。【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表