ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Presto Release 0.178 版本解读:内存治理、SQL 能力扩展与 Connector 稳定性改进

Presto Release 0.178 版本解读:内存治理、SQL 能力扩展与 Connector 稳定性改进 大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载本文以 Presto 官方发布说明 release-0.178.rst 为骨架逐条剖析该版本在通用引擎、Hive 连接器、Memory 连接器与 SPI 层面的变更并结合当前仓库中的函数实现源码与官方文档进行纵深验证。读完本文你将理解 0.178 各变更背后的技术动机掌握to_ieee754_32/to_ieee754_64二进制编解码函数与GROUPING操作的实战用法并学会用仓库内的测试用例与函数文档印证每个行为。版本概览Release 0.178 是 Presto 演进过程中的一个里程碑式小版本其核心脉络可以概括为三条主线稳定性优先集中修复了一批内存记账memory accounting缺陷显著降低查询运行过程中 Full GC 与 OOM 的发生概率同时修复 coordinator 上查询失败后的资源泄漏问题SQL 语义补全新增向JSON类型的多种数值转换、GROUPING运算支持以及IN谓词中的相关子查询支持二进制与函数能力增强新增to_ieee754_32/to_ieee754_64两个 IEEE 754 浮点编解码函数为跨系统交换浮点字节表示提供官方工具。下面按发布说明的分类逐项展开。General Changes通用引擎变更修复内存记账缺陷降低 Full GC / OOM 概率发布说明指出0.178 修复了多种内存记账memory accounting缺陷从而减少了查询执行中 Full GC 与 OOM 的发生。在 Presto 的分布式架构中每个查询的内存使用量都由算子operator级别上报并汇聚供资源组resource group与调度器做内存管控。记账误差会导致两类问题记账偏低时超出内存上限的查询不会及时被终止最终触发 OOM记账偏高时查询被过早失败或触发不必要的 GC。0.178 的修复方向正是消除这类账实不符让内存管控更贴近真实使用量。修复 stats 关键字解析回归该版本修复了一个解析回归此前使用关键字stats的查询会解析失败。这类问题通常源于词法/语法规则的调整引入了对保留字reserved keyword的误判。修复后stats作为非保留关键字可以继续在列名、别名等场景正常使用。关于关键字规则与解析器的更多细节可参考 presto-parser 中的词法与语法定义。修复 coordinator 上失败查询的清理问题此前存在一个缺陷当查询失败后coordinator 上与该查询相关的资源没有及时清理。查询生命周期中的每个查询都由 coordinator 的查询管理器query manager维护包括 session、执行状态与结果缓冲等。0.178 修复了失败路径上的清理逻辑避免失败查询在 coordinator 上悬挂并持续占用资源这对长时间运行的集群尤为重要。新增向 JSON 的转换REAL / TINYINT / SMALLINT0.178 增加了从REAL、TINYINT、SMALLINT向JSON类型的转换能力。此前这三种数值类型缺少到JSON的 cast 路径导致相关字段在序列化到 JSON 时受限。新增后以下写法均可工作SELECT CAST(CAST(3.14 AS REAL) AS JSON); -- 3.14 SELECT CAST(CAST(42 AS TINYINT) AS JSON); -- 42 SELECT CAST(CAST(12345 AS SMALLINT) AS JSON); -- 12345JSON 类型在 Presto 中属于一等公民支持与字符串、数值、数组、对象之间的显式转换。数值类型向 JSON 的转换路径由类型系统中的 cast 注册机制管理相关实现可参考 JsonOperators.java 及各个数值类型的 Operator 类如 BigintOperators.java。新增 GROUPING 运算支持复杂分组操作0.178 为 复杂分组操作 增加了GROUPING运算。GROUPING SETS、CUBE、ROLLUP自 0.142 起已受支持但用户无法区分某行聚合结果究竟是该列本来的 NULL 值还是该列不属于当前分组——GROUPING运算正是为此而生。GROUPING 语法与语义其签名如下grouping(col1, ..., colN) - bigintgrouping()返回一个转为十进制的位集bit set用于指示哪些列出现在某个分组中。它必须与GROUPING SETS、ROLLUP、CUBE或GROUP BY配合使用且参数必须与对应分组子句中引用的列完全一致。位集的构造规则参数列从右到左分配位最右侧的列对应最低位least significant bit。对于给定分组若某列包含在该分组中则该位置 0否则置 1。官方文档select.rst给出了完整示例SELECT origin_state, origin_zip, destination_state, sum(package_weight), grouping(origin_state, origin_zip, destination_state) FROM shipping GROUP BY GROUPING SETS ( (origin_state), (origin_state, origin_zip), (destination_state));部分结果如下origin_state | origin_zip | destination_state | _col3 | _col4 ----------------------------------------------------------- California | NULL | NULL | 1397 | 3 California | 94131 | NULL | 60 | 1 NULL | NULL | New Jersey | 58 | 6第一行只按origin_state分组origin_zip与destination_state不在分组中位集为011最高位代表origin_state即十进制 3第二行按origin_state, origin_zip分组仅destination_state不在分组位集为001即十进制 1第三行仅destination_state在分组中位集为110即十进制 6。这样业务上就能准确判断NULL来自数据本身还是来自分组折叠是撰写报表与分析查询时区分明细与汇总行的关键工具。配套的复杂分组语法回顾GROUPING运算依赖的复杂分组语法包括GROUPING SETS显式指定多组分组列不在某子列表中的列置NULL等价于多个GROUP BY的UNION ALL但只扫描一次底层数据CUBE为给定列生成全部可能的组合即幂集CUBE(a, b)等价于GROUPING SETS ((a,b), (a), (b), ())最多支持 30 列因为 2^30 约 10 亿个分组集已是实际极限ROLLUP按给定列顺序生成层级小计ROLLUP(a, b)等价于GROUPING SETS ((a,b), (a), ())多个分组表达式在同一查询中共存时按笛卡尔积语义解释且GROUP BY ALL保留重复分组集GROUP BY DISTINCT只生成唯一分组集默认量词为ALL。上述语法与语义的完整推导与示例数据均可在 select.rst 的 Complex Grouping Operations 与 GROUPING Operation 小节找到。新增 IN 谓词中的相关子查询支持0.178 为IN谓词增加了对相关子查询correlated subquery的支持。此前形如SELECT name FROM orders o WHERE o.customer_id IN ( SELECT c.customer_id FROM customers c WHERE c.region o.region );这类引用外层列o.region的IN子查询会被拒绝。修复后查询规划器可以将相关子查询去关联化decorrelation改写为可分布式执行的连接或半连接计划从而显著拓宽了IN谓词的表达能力。新增 to_ieee754_32 与 to_ieee754_64 函数这是 0.178 中最具工具属性的更新将REAL32 位单精度与DOUBLE64 位双精度浮点数编码为 IEEE 754 标准的大端字节序列并配套提供反向解码函数。函数签名根据官方函数文档 binary.rst函数签名说明to_ieee754_32to_ieee754_32(real) - varbinary将real按 IEEE 754 单精度格式编码为 32 位大端二进制from_ieee754_32from_ieee754_32(binary) - real将 32 位大端二进制按 IEEE 754 单精度格式解码为realto_ieee754_64to_ieee754_64(double) - varbinary将double按 IEEE 754 双精度格式编码为 64 位大端二进制from_ieee754_64from_ieee754_64(binary) - double将 64 位大端二进制按 IEEE 754 双精度格式解码为double源码实现印证这四个函数定义在 VarbinaryFunctions.java 中。以to_ieee754_32为例Description(encode value as a big endian varbinary according to IEEE 754 single-precision floating-point format) ScalarFunction(to_ieee754_32) SqlType(StandardTypes.VARBINARY) public static Slice toIEEE754Binary32(SqlType(StandardTypes.REAL) long value) { Slice slice Slices.allocate(Float.BYTES); slice.setInt(0, Integer.reverseBytes((int) value)); return slice; }关键实现要点底层以long承载REALPresto 在 JVM 层用 int 位模式表示 float分配 4 字节Float.BYTES缓冲区通过Integer.reverseBytes将内存中的小端位模式转换为大端字节序输出保证与 IEEE 754 标准及网络字节序一致to_ieee754_64对应使用Double.doubleToLongBitsLong.reverseBytes输出 8 字节大端序列解码方向由from_ieee754_32/from_ieee754_64完成两者都会校验输入长度分别为 4 字节与 8 字节不合法时抛出INVALID_FUNCTION_ARGUMENT错误例如from_ieee754_64会提示 Input floating-point value must be exactly 8 bytes long。实战示例与测试用例典型用法如下SELECT to_ieee754_32(CAST(1.0 AS REAL)); -- 0x3F800000 SELECT to_ieee754_64(CAST(3.14 AS DOUBLE)); -- 0x40091EB851EB851F SELECT from_ieee754_64(to_ieee754_64(3.14)); -- 3.14仓库中的单元测试 TestVarbinaryFunctions.java 对包括 NaN、正负无穷大、浮点极值3.4028235E38、1.4E-45在内的边界情况做了详尽验证例如to_ieee754_32(CAST(0.0 AS REAL))输出00000000to_ieee754_32(CAST(NAN() AS REAL))输出7FC00000to_ieee754_32(CAST(INFINITY() AS REAL))输出7F800000from_ieee754_32(to_ieee754_32(CAST(-1.4E-45 AS REAL)))能无损还原-1.4E-45。这说明该函数族对非规格化数subnormal、NaN 与无穷大均有标准兼容的编码行为可直接用于需要跨系统交换浮点字节表示的场景如与 C/C、Rust 等非 JVM 系统对接二进制协议或做浮点数据的精确存储与哈希。Hive ChangesHive 连接器改进修复 Avro 读取时 schema 缓存导致的高 CPU0.178 修复了读取 Avro 文件时因 schema 缓存schema caching引发的 CPU 占用过高问题。Avro 数据文件的每条记录都可能携带或关联 schema若缓存查找与更新路径存在低效操作会在高吞吐扫描时放大为显著的 CPU 开销。本次修复优化了缓存行为使 Avro 表的高频读取不再受此拖累。相关实现位于 presto-hive 模块其中包含 Avro 格式的读路径支持。保留 ORC 解压错误原因此前在解码 ORC 文件时解压decompression阶段的异常原因会被吞掉导致错误信息难以定位。0.178 修复了异常链的传播使 ORC 解码失败时能够保留底层解压错误的根因cause方便运维与开发人员快速判断是文件损坏、压缩格式不匹配还是其他底层问题。ORC 解码相关逻辑位于 presto-orc 模块。Memory Connector Changes内存连接器修复发布说明修复了 Memory 连接器的一个缺陷此前无法创建空表empty table。Memory 连接器将数据保存在 worker 节点的内存中常用于测试与临时数据处理。该缺陷意味着建表语句在没有任何数据写入时会失败。0.178 修复后可以正常创建空的内存表随后再向其中写入数据。相关实现位于 presto-memory 模块。SPI ChangesSPI 接口增强SPIService Provider Interface层是 Presto 插件化生态的基石0.178 对其做了两处面向插件开发者的增强资源组配置管理器可获得环境信息SPI 中资源组相关的配置管理器resource group configuration manager此前无法感知集群环境上下文。0.178 将环境environment信息开放给这些管理器使自定义的资源组配置管理器可以根据环境名如开发环境、生产环境动态加载不同的资源组配置实现按环境隔离的资源配置策略。相关接口定义位于 presto-spi 模块。查询完成事件新增性能统计0.178 为查询完成事件query completion event增加了额外的性能统计字段。查询完成事件是 Presto 事件监听器event listener机制的核心事件之一插件可通过它观测每个查询的完整生命周期指标。新增统计字段后事件监听器插件可以拿到更细粒度的性能数据用于构建查询监控、成本分析与性能基线。相关接口与事件结构定义位于 presto-spi 模块。总结Release 0.178 虽是小版本但变更覆盖面相当均衡维度关键变更稳定性修复内存记账缺陷降低 Full GC/OOM、coordinator 失败查询清理、Avro schema 缓存高 CPU、ORC 解压错误链保留SQL 能力REAL/TINYINT/SMALLINT → JSON转换、GROUPING运算、IN谓词相关子查询函数库新增to_ieee754_32/to_ieee754_64及反向解码函数连接器Memory 连接器支持创建空表SPI资源组配置管理器可感知环境、查询完成事件新增性能统计对于升级到 0.178 的用户建议重点验证涉及复杂分组GROUPING SETS/CUBE/ROLLUP的报表查询可配合grouping()区分汇总行与明细 NULL涉及浮点字节交换的管道可直接使用to_ieee754_32/64保证跨语言一致性基于事件监听器的监控插件可消费新增的性能统计字段以丰富观测指标。所有行为均可在当前仓库的 release-0.178.rst、binary.rst、select.rst 以及 VarbinaryFunctions.java 与对应测试中查证。赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐Presto Release 0.208 版本深度解析Hive 写入告警、内存治理与查询性能改进全指南Presto Release 0.208 版本深度解析Hive 写入告警、内存治理与查询性能改进全指南 本指南基于 Presto 官方发布说明 releas大数据数据库后端Presto Release 0.194 深度解读SQL 函数增强、CLI/JDBC 改进与 Hive 查询稳定性修复Presto Release 0.194 深度解读SQL 函数增强、CLI/JDBC 改进与 Hive 查询稳定性修复 导读 本文以 Presto 官方发布说大数据数据库后端Presto Release 0.86 技术解析新函数、JOIN 能力增强与查询稳定性改进Presto Release 0.86 技术解析新函数、JOIN 能力增强与查询稳定性改进 本篇文章以当前仓库中 release 0.86.rst https大数据数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表