ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Presto Release 0.62 详解:JMX 计数修复、Hive 二进制 Map 解码与 APPROX_DISTINCT 性能优化

Presto Release 0.62 详解:JMX 计数修复、Hive 二进制 Map 解码与 APPROX_DISTINCT 性能优化 大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载导读本文围绕 Presto 发行版Release 0.62的官方更新说明见 release-0.62.rst逐条剖析该版本包含的 5 项核心变更活跃查询active queriesJMX 计数器数值错误修复、Hive 二进制 Map 键解码修复、APPROX_DISTINCT性能优化、大分区数场景下的规划性能回退修复以及协调节点 UI 对长 SQL 展示的改进。针对每一条变更本文结合当前仓库的源码、配置与测试给出实现层面的佐证帮助你理解这些修复背后所涉及的机制如查询状态监控、Hive SerDe 反序列化、近似去重聚合与分区剪枝并掌握如何通过配置项与源码定位验证这些行为。读完本文你既能了解 0.62 版本修复了什么也能在当前仓库中快速找到对应实现作为后续版本演进对照的起点。一、版本背景与更新说明总览Release 0.62 是 Presto 早期发行版之一其完整官方更新说明仅包含 5 条变更均以修复与优化为主变更点类型影响模块修复 active queries JMX 计数器报告错误数值Bug 修复查询执行 / JMX 监控修复 Hive 二进制 Map 键未正确解码Bug 修复Hive 连接器 / SerDeAPPROX_DISTINCT性能优化性能优化聚合 / 优化器修复跨大量分区规划查询时的性能回退Bug 修复Hive 连接器 / 分区规划协调节点 UI 长 SQL 展示的次要改进UI 改进Coordinator Web UI以下各节逐一展开并结合当前仓库源码说明这些能力在后续版本中的落点。二、修复 active queries JMX 计数器报告错误数值2.1 问题描述更新说明第一项为 “Fix an issue with active queries JMX counter reporting incorrect numbers”即修复了active queriesJMX 计数器报告数值不准确的问题。该计数器用于监控集群中处于活跃状态的查询数量是 Presto 运维与容量规划的重要指标计数偏差会直接误导负载判断与告警配置。2.2 源码中的对应实现在当前仓库中活跃查询的跟踪逻辑集中在 QueryStateTransitionMonitor.java该类使用ConcurrentHashMapQueryId, QueryTransitionTracker activeQueries维护活跃查询集合见 QueryStateTransitionMonitor.java查询进入时通过activeQueries.computeIfAbsent(queryId, ...)登记查询终态如完成/失败时通过activeQueries.remove(queryId)移除见 QueryStateTransitionMonitor.java对外暴露getActiveQueriesCount()返回activeQueries.size()见 QueryStateTransitionMonitor.java并在 JMX/状态输出中以activeQueries键上报见 QueryStateTransitionMonitor.java。从源码结构可以推断该计数器曾容易出现偏差的典型场景包括查询状态转换事件重复处理computeIfAbsent与remove之间缺乏对状态转移的幂等保护、终态后仍残留在集合中或异常路径未正确触发移除。0.62 版本正是针对这一类计数与状态转移不同步的问题做了修正。当前代码中该类还额外维护了anomalousDispatchingCount、anomalousPlanningCount、anomalousRunningCount、anomalousFinishingCount等异常状态计数器见 QueryStateTransitionMonitor.java说明这套状态监控机制在后续版本中持续演进活跃查询计数只是其中一个基础指标。2.3 运维视角的验证方式通过 JMX MBean 读取activeQueries属性与 Coordinator UI 的 Running Queries 数量交叉比对关注查询状态机中QUEUED → PLANNING → RUNNING → FINISHED/FAILED的转移是否成对出现若 RUNNING 数量长期不为 0 且无对应运行中查询则属于计数残留问题正是 0.62 修复的目标。三、修复 Hive 二进制 Map 键解码3.1 问题描述第二条变更为 “Hive binary map keys were not being decoded correctly”即使用二进制binary类型作为键的 Hive Map 列在查询时键值解码错误。这类数据常见于将序列化后的对象或哈希作为 Map 键的 Hive 表键以binary类型存储。3.2 解码链路与修复落点在 Presto 中Hive 表的 Map 列最终由 SerDeUtils.java 完成对象到 Presto Block 的转换getBlockObject(Type type, Object object, ObjectInspector objectInspector, ...)是统一入口根据ObjectInspector的类型分派到serializeMap等方法见 SerDeUtils.javaserializeMap通过MapObjectInspector取出Map?, ?与键/值ObjectInspector逐条写入BlockBuilder见 SerDeUtils.java键的取值通过keyInspector完成类型转换。0.62 修复的内容正位于这一键解码路径当 Map 键的 Hive 类型为binary时反序列化结果需要以VARBINARY类型写入 Block若键解码逻辑按字符串或字节数组的默认编码处理就会出现乱码或类型错配。修复后binary键会被正确映射为 Presto 的varbinary类型。相关类型常量在 GenericHiveRecordCursor.java 中可见import static com.facebook.presto.common.type.VarbinaryType.VARBINARY该文件是 Hive SerDe 行级读取的核心实现。3.3 实战说明对含mapbinary, ...列的表执行SELECT时若 0.62 之前出现键值乱码升级后应能直接以varbinary语义正确读取如需校验解码结果可将键列通过to_hex(...)或from_hex(...)与写入端序列化格式对照涉及自定义 SerDe 的表应确认ObjectInspector返回的键类型与元数据中声明的binary一致避免绕过标准解码链路。四、APPROX_DISTINCT 性能优化4.1 问题描述第三条变更为 “Performance improvements forAPPROX_DISTINCT”。APPROX_DISTINCT是 Presto 基于 HyperLogLog 思想的近似去重聚合函数用于以可控误差换取远低于精确COUNT(DISTINCT)的内存与计算开销。0.62 对该函数做了性能改进。4.2 当前仓库中的优化器佐证当前仓库中与APPROX_DISTINCT相关的优化规则较多其中与“性能改进”主题最直接相关的是 CombineApproxDistinctFunctions.java该规则用于合并同一聚合中的多个approx_distinct调用见 CombineApproxDistinctFunctions.java规则匹配包含多个approx_distinct的AggregationNodehasMultipleApproxDistinct见 CombineApproxDistinctFunctions.java仅当各approx_distinct的 mask、order by、filter、distinct 标志以及参数类型、误差参数一致时才可合并aggregationCanMerge见 CombineApproxDistinctFunctions.java合并后通过set_agg将多个表达式打包为数组集合再经array_transpose、element_at、remove_nulls、array_distinct、cardinality、coalesce展开还原各列结果从而把多次去重聚合压缩为一次扫描级的聚合见 CombineApproxDistinctFunctions.java该规则受会话属性combine_approx_distinct控制isCombineApproxDistinctEnabled见 CombineApproxDistinctFunctions.java。同一目录下的 RewriteApproxDistinctIfToMask.java、ReplaceConditionalApproxDistinct.java 及对应测试 TestCombineApproxDistinctFunctions.java、TestApproxDistinctOptimizer.java 表明approx_distinct的优化是该系列版本持续深耕的方向——0.62 的“性能改进”属于这一演进脉络中的早期一环。4.3 使用与验证典型用法SELECT approx_distinct(user_id) FROM clicks;可传入第二参数指定最大标准误差例如approx_distinct(user_id, 0.01)可通过EXPLAIN观察聚合是否被合并如多个approx_distinct是否合并为一次set_agg聚合若需禁用合并优化可在会话中关闭combine_approx_distinct相关开关具体开关名以目标版本SystemSessionProperties为准。五、修复大分区数场景下的规划性能回退5.1 问题描述第四条变更为 “Fix performance regression when planning queries over a large number of partitions”。当查询涉及的 Hive 表分区数量极大时规划阶段planning耗时出现回退0.62 修复了该问题。分区越多规划器需要枚举、过滤、排序的分区列表就越长任何低效的列表处理如重复全量遍历、不必要的对象复制或分区级统计获取都会放大为显著的规划延迟。5.2 相关配置与源码落点Hive 连接器对分区数量的约束与批处理配置集中在 HiveClientConfig.javahive.max-partitions-per-scan限制单次扫描允许的最大分区数默认值为100_000见 HiveClientConfig.java并通过Config(hive.max-partitions-per-scan)暴露为配置项见 HiveClientConfig.java分区统计采样大小默认100、基于分区统计的优化默认关闭partitionStatisticsBasedOptimizationEnabled、元数据端分区过滤默认开启partitionFilteringFromMetastoreEnabled true见 HiveClientConfig.java这些参数共同影响大分区场景下规划阶段与统计获取的开销分区读取按hive.metastore.partition-batch-size.min/max分批进行避免一次性加载全部分区元数据。0.62 的修复目标正是上述链路中的低效环节——从源码结构看后续版本通过引入分区剪枝partition pruning、元数据端分区过滤与按批拉取分区信息等手段确保规划耗时随分区数增长保持可控。5.3 实战调优建议对超大规模分区表优先依赖分区谓词WHERE partition_col ...触发分区剪枝缩小规划阶段处理的分区集合如单表分区数超过默认限制需评估是否提高hive.max-partitions-per-scan默认 100000并同步关注规划耗时与元数据服务器压力检查hive.metastore.partition-batch-size.min/max设置合理批大小可减少与 Hive Metastore 的往返次数显著改善大分区查询的规划与调度表现。六、Coordinator UI 长 SQL 展示改进6.1 问题描述最后一条变更为 “Minor improvement to coordinator UI when displaying long SQL queries”属于用户体验层面的小改进当 SQL 语句很长时Presto Coordinator 的 Web UI查询详情页展示存在排版问题0.62 对其做了优化。6.2 当前 UI 实现的印证当前仓库的 Web UI 位于 presto-ui 模块查询展示相关组件包括 query.jsx、query_viewer.jsx 等。长 SQL 的展示问题通常体现在整段 SQL 以单行或超宽文本呈现导致横向滚动失控、换行丢失导致可读性差。UI 层面的修复一般是引入word-break/white-space样式约束或基于组件化展示逻辑的调整。此类变更不影响 SQL 语义与查询执行仅影响展示效果。6.3 验证方式在 Coordinator Web UI 的 Query 页面查看长查询如上千字符的复杂 JOIN/子查询确认文本自动换行、无溢出该改动属于视觉层面的“次要改进”无需额外配置升级后即可生效。七、总结0.62 版本的技术脉络将 Release 0.62 的五项变更放在一起可以清晰看到这一时期的 Presto 演进重点可观测性活跃查询 JMX 计数修复保障监控数据可信正确性Hive 二进制 Map 键解码修复覆盖binary键这类边界类型性能APPROX_DISTINCT优化与大分区规划回退修复兼顾聚合执行与规划阶段两条性能主线易用性Coordinator UI 长 SQL 展示改进。这些修复在后续版本中均能找到延续活跃查询跟踪演进为 QueryStateTransitionMonitor.java 的完整状态监控体系二进制 Map 解码沉淀在 SerDeUtils.java 的键值序列化逻辑中approx_distinct优化发展出 CombineApproxDistinctFunctions.java 等多条规划规则大分区场景则由 HiveClientConfig.java 中一系列分区相关配置支撑。阅读版本说明时对照上述源码即可快速定位每个修复背后的实现与可调参数是理解 Presto 版本演进与源码结构的有效路径。参考文件索引官方更新说明presto-docs/src/main/sphinx/release/release-0.62.rst活跃查询状态监控presto-main-base/src/main/java/com/facebook/presto/execution/QueryStateTransitionMonitor.javaHive 反序列化presto-hive/src/main/java/com/facebook/presto/hive/util/SerDeUtils.java、presto-hive/src/main/java/com/facebook/presto/hive/GenericHiveRecordCursor.javaAPPROX_DISTINCT 优化presto-main-base/src/main/java/com/facebook/presto/sql/planner/iterative/rule/CombineApproxDistinctFunctions.java 及同目录测试类Hive 分区相关配置presto-hive/src/main/java/com/facebook/presto/hive/HiveClientConfig.javaCoordinator UIpresto-ui/query.jsx、presto-ui/query_viewer.jsx赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐Presto Release 0.98 解析Array/Map/Row 二进制编码、ConnectorIndex SPI 重命名与 ORC/UNNEST 修复Presto Release 0.98 解析Array/Map/Row 二进制编码、ConnectorIndex SPI 重命名与 ORC/UNNEST 修复大数据数据库后端Presto Release 0.155 技术解析查询正确性修复、内存优化与 Hive Avro 支持Presto Release 0.155 技术解析查询正确性修复、内存优化与 Hive Avro 支持 本指南基于当前仓库中的官方版本发布说明 release大数据数据库后端Presto Release 0.194 深度解读SQL 函数增强、CLI/JDBC 改进与 Hive 查询稳定性修复Presto Release 0.194 深度解读SQL 函数增强、CLI/JDBC 改进与 Hive 查询稳定性修复 导读 本文以 Presto 官方发布说大数据数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表