ARTICLE DETAIL

资讯详情

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

Presto Release 0.242 技术解读:片段结果缓存、分区版本化与核心能力增强

Presto Release 0.242 技术解读:片段结果缓存、分区版本化与核心能力增强 大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载Presto 0.242 版本围绕查询性能与可靠性引入了一批重要能力新增任务级 Spill 策略选择、片段结果缓存fragment result caching、Hive 分区版本化partition versioning、更细粒度的 Hive Metastore 调用缓存以及查询输出字节数上限控制。本文以官方 release-0.242.rst 发布说明为主体结合当前仓库源码与配置实现逐项讲解每个新特性的启用方式、配置项、底层原理与适用场景帮助你评估是否升级并正确配置该版本。升级提醒0.242 之前的 0.238 版本在LambdaDefinitionExpression规范化上存在已知缺陷详见 issue #15424此外若启用 function namespace manager 但未配置 Thrift会导致启动失败该问题已在 PR #15501 中修复。升级前请确认自身部署未受影响。Highlights 概览0.242 版本的四大核心亮点如下新增配置属性experimental.spiller.task-spilling-strategy用于选择不同的 Spill溢写策略新增片段结果缓存fragment result caching支持可复用叶子片段leaf fragment的中间结果新增分区版本化partition versioning支持提升 Hive 连接器对分区变更的感知能力新增更细粒度的 HiveMetastore 调用缓存通过hive.metastore-cache-scope控制缓存范围。下面按模块逐一深入。General Changes查询引擎通用改进1. 任务级 Spill 策略experimental.spiller.task-spilling-strategy当某个查询内存压力过大触发 Spill 时系统需要决定先回收哪些任务task的可撤销内存。0.242 将这一决策策略抽象为可配置项。源码层面该属性定义在 FeaturesConfig.java默认值为ORDER_BY_CREATE_TIME支持三种取值见 TaskSpillingStrategy 枚举定义取值含义ORDER_BY_CREATE_TIME默认触发 Spill 时按任务创建时间从旧到新依次回收revokeORDER_BY_REVOCABLE_BYTES按任务当前已分配的可撤销内存revocable memory从多到少依次回收PER_TASK_MEMORY_THRESHOLD当某个任务达到单任务内存阈值时立即 Spill阈值由experimental.spiller.max-revocable-task-memory指定配置示例写入etc/config.propertiesexperimental.spiller.task-spilling-strategyORDER_BY_REVOCABLE_BYTES # 仅当使用 PER_TASK_MEMORY_THRESHOLD 时生效 experimental.spiller.max-revocable-task-memory200MB从源码注释可以确认experimental.spiller.max-revocable-task-memory仅在task-spilling-strategy为PER_TASK_MEMORY_THRESHOLD时被使用见 FeaturesConfig.java。选型建议ORDER_BY_REVOCABLE_BYTES优先回收占用最多的任务适合内存占用极不均衡的场景PER_TASK_MEMORY_THRESHOLD适合希望每个任务都能被单独限制的场景。默认值ORDER_BY_CREATE_TIME行为最简单、最可预期。2. 查询输出上限query.max-output-bytes与query_max_output_bytes0.242 新增了对“单条查询可返回数据量”的控制用于防止客户端拉取超大数据集拖垮协调节点或网络。配置属性query.max-output-bytes集群级写入etc/config.properties会话属性query_max_output_bytes会话级可在客户端用SET SESSION query_max_output_bytes ...覆盖。源码层面该上限与既有的行数上限query.max-output-positions默认Long.MAX_VALUE并列为两个独立维度见 QueryManagerConfig.java会话属性query_max_output_size则通过 SystemSessionProperties.java 暴露给客户端。# etc/config.properties query.max-output-bytes100GB3. 片段结果缓存Fragment Result Caching这是 0.242 最重要的通用能力之一。它允许把**叶子片段leaf fragment的输出结果页pages**写入缓存当后续查询命中相同计划片段时直接读取缓存避免重复扫描 Hive 等底层数据源。典型收益场景是大量 SQL 共享同一子查询如 BI 报表中反复出现的公共 CTE 或事实表聚合。启用开关有两个见 FeaturesConfig.javafragment-result-cache.enabled新配置名experimental.fragment-result-caching-enabled旧配置名通过LegacyConfig兼容二选一即可。# etc/config.properties fragment-result-cache.enabledtrue缓存行为由文件型缓存管理器控制相关配置集中在 FileFragmentResultCacheConfig.java配置项说明fragment-result-cache.enabled是否启用片段结果缓存fragment-result-cache.base-directory缓存文件存放目录URI 形式fragment-result-cache.max-cache-size缓存最大容量DataSizefragment-result-cache.max-cached-entries最大缓存条目数fragment-result-cache.cache-ttl缓存条目存活时间Durationfragment-result-cache.max-in-flight-size允许同时写入的缓存数据量上限fragment-result-cache.max-single-pages-size单个 page 的最大尺寸fragment-result-cache.block-encoding-compression-codec块编码压缩算法fragment-result-cache.input-data-stats-enabled是否记录输入数据统计信息底层机制运行时Driver 会判断当前算子链是否适合使用片段结果缓存见 Driver.java——只有特定位置i activeOperators.size() - 2即倒数第二个算子通常是叶子片段结尾的算子产出的 page 才会被写入缓存查询上下文通过 FragmentResultCacheContext.java 在 Task 间传递并由FragmentResultCacheManager见 SqlTaskManager.java 的依赖注入统一管理读写。前提约束并非所有片段都可缓存——FragmentResultCacheContext会递归检查计划树的子节点只有全部由“允许缓存”的节点构成的片段才可命中缓存见 FragmentResultCacheContext.java。4. 编译器与稳定性修复修复启用公共子表达式优化common sub-expression optimization且多个 SQL 函数包含 lambda 时LambdaBytecodeGenerator的编译错误修复 shuffle 阶段内存超限时查询可能永久卡死的问题修复包含 NULL 值的列上IS DISTINCT FROM NULL返回错误结果的问题。Hive Changes连接器能力大幅增强1. 文件重命名hive.file_renaming_enabled0.242 为 Hive 连接器新增文件重命名支持配置属性为hive.file_renaming_enabled见 HiveClientConfig.java。# etc/catalog/hive.properties hive.file_renaming_enabledtrue从源码可以看到开启后写入的文件会使用数值型文件名见 HiveWriterFactory.java 的注释 “Numerical file name when file_renaming_enabled is true”并在prefer_manifests_to_list_files与file_renaming_enabled同时开启时把文件清单与大小写入分区元数据见 HiveMetadata.java从而减少大分区下对文件系统的 list 开销。2. 分区版本化hive.partition-versioning-enabled分区版本化让连接器能为分区打上版本号从而更快地识别分区数据是否发生变化减少不必要的缓存失效与重新扫描。启用方式# etc/catalog/hive.properties hive.partition-versioning-enabledtrue该属性定义在 MetastoreClientConfig.java属于 Hive Metastore 客户端层配置。3. 细粒度 Metastore 缓存hive.metastore-cache-scope此前 HiveMetastore 缓存以整体方式管理0.242 允许按更细的粒度控制哪些调用被缓存# etc/catalog/hive.properties hive.metastore-cache-scopeALL取值定义于 MetastoreClientConfig.java默认值为MetastoreCacheScope.ALL缓存所有可缓存的调用。结合同文件中hive.metastore-cache-maximum-size默认 10000、hive.metastore-cache-ttl、按缓存类型设置的刷新间隔metastoreCacheRefreshIntervalByType等参数见 MetastoreClientConfig.java可以对表、分区、统计信息等不同类型元数据分别设置刷新策略。4. DWRF 加密与 Parquet 兼容性修复修复大尺寸未压缩列值写入时DWRF 加密失败的问题修复加密组内列顺序与文件内不一致时非 Presto 读取器无法读取 Presto 写入的加密 DWRF 文件的问题修复GenericHiveRecordCursor在 SerDe 未提供高效Writable实现时的 String 字段性能回退优化 split 加载仅使用所需数量的线程提升加载效率新增对parquet-avro 库以TIMESTAMP_MICROS作为OriginalType表示时间戳的 Parquet 文件的查询支持。Pinot ChangesTOPN 下推开关新增配置属性pinot.pushdown-topn-broker-queries允许将带ORDER BY与LIMIT的查询下推给 Pinot broker。其动机在源码注释中说明得非常清楚当返回记录数较大时Presto 无法保证保留来自 Pinot 的响应顺序见 PinotConfig.java因此默认关闭下推以保证结果正确性。# etc/catalog/pinot.properties pinot.pushdown-topn-broker-queriestrue如果不开启该开关查询生成器会直接抛出 “TopN query is not allowed to push down” 异常并给出配置提示见 PinotQueryGenerator.java。Cassandra Changes新增基础类型支持Cassandra 连接器新增SMALLINT、TINYINT、DATE三种类型的读写支持。源码中 CassandraPageSink.java 明确导入了SmallintType.SMALLINT、TinyintType.TINYINT与DateType.DATE并在写入路径中为这些类型生成对应的 CQL 类型getCqlTypeName()返回例如int以规避date关键字冲突见 CassandraMetadata.java。Verifier Changes验证框架功能扩展Presto Verifier 是用于对比 control/test 两个集群查询结果一致性的工具0.242 为其新增了多项能力确定性分析修复修复因数据被修改而误报“失败”的确定性分析问题JSON 计划对比改进优化 explain 验证中的 JSON 计划比较PR #15198新增application-name配置覆盖通过 JDBCClientInfo传递的 source 信息源码中默认值为verifier-test见 PrestoActionConfig.java见 JdbcPrestoAction.java支持通过 Presto 查询获取待验证查询列表对应PrestoQuerySourceQuerySupplier见 PrestoQuerySourceQuerySupplier.java其配置query、catalog、schema定义于 PrestoQuerySourceQueryConfig.java即源查询不再只能来自文件或 MySQL 表也可以直接来自一条 SQL 查询的结果新增 explain 验证模式通过配置属性explaintrue启用见 VerifierConfig.java此时不再比较查询结果数据而是比较 control/test 集群上的执行计划 JSON对应 PR #15101。# verifier.properties explaintrue application-namemy-verifier-app source-query.supplierpresto-querySPI Changes为片段结果缓存提供接口支撑0.242 在 SPIService Provider Interface层新增了两个接口方法为片段结果缓存提供“计划/数据是否相同”的判定能力ConnectorTableLayoutHandle.getIdentifier(OptionalConnectorSplit split, PlanCanonicalizationStrategy canonicalizationStrategy)返回表布局的标识符用于构造**规范化计划canonical plan**以判断两次查询的片段是否一致。接口注释明确指出“Identifier 用于判断该表布局是否提供相同的数据集split 用于根据运行时信息更新标识符”见 ConnectorTableLayoutHandle.java。ConnectorSplit.getSplitIdentifier()返回 split 的标识符用于判断两次查询的 split 集合是否相同见 ConnectorSplit.java。两个方法均为default实现默认返回对象自身因此对既有连接器完全兼容——未实现新方法的连接器其行为与之前一致只有实现后才可能命中片段结果缓存。这对连接器插件开发者是一个明确的扩展点若希望自己的连接器受益于片段缓存应在ConnectorTableLayoutHandle与ConnectorSplit的实现中提供稳定、与数据内容强相关的标识符。Geospatial Changes升级 Esri geometry-api-java 至 2.2.4包含两个在生产环境中观察到的缺陷修复对应 upstream issue #266 与 #247提升地理空间函数的稳定性。升级与配置建议小结结合上述变更给出以下实操清单内存与 Spill 治理若集群任务内存占用不均将experimental.spiller.task-spilling-strategy设为ORDER_BY_REVOCABLE_BYTES如需严格单任务限制则配合PER_TASK_MEMORY_THRESHOLD与experimental.spiller.max-revocable-task-memory使用结果缓存优化对存在大量重复公共子查询的 BI 场景开启fragment-result-cache.enabled并配置好fragment-result-cache.base-directory与容量、TTL 参数同时确保使用的连接器已实现上述两个 SPI 标识符接口以获得最大收益Hive 元数据优化按需开启hive.partition-versioning-enabled并用hive.metastore-cache-scope细化缓存范围配合hive.metastore-cache-maximum-size与按类型的刷新间隔控制缓存压力结果规模防护为面向外部客户端的集群设置query.max-output-bytes兜底防止超大结果集拉取Verifier 升级需要计划级验证时开启explaintrue并将源查询从 MySQL/文件迁移到PrestoQuerySourceQuerySupplier以获得更灵活的查询列表定义安全确认若使用 function namespace manager务必确认 Thrift 已正确配置避免 0.242 启动失败。本文涉及的配置项与实现均可在当前仓库源码中进一步验证FeaturesConfig.java、HiveClientConfig.java、MetastoreClientConfig.java、VerifierConfig.java。赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐Presto 0.260 版本发布解读溢出控制精细化、Fragment 结果缓存增强与优化器新特性全解析Presto 0.260 版本发布解读溢出控制精细化、Fragment 结果缓存增强与优化器新特性全解析 本指南基于仓库中的官方发布说明 release 0.大数据数据库后端Presto 0.192 版本技术解析核心修复、配置变更与连接器增强Presto 0.192 版本技术解析核心修复、配置变更与连接器增强 Presto 0.192 是一个以稳定性与正确性修复为主的版本涵盖查询调度、地理空间函大数据数据库后端Presto 0.236 版本发布详解CASE 修复、Alluxio 本地缓存与 Verifier 结果自动比对能力Presto 0.236 版本发布详解CASE 修复、Alluxio 本地缓存与 Verifier 结果自动比对能力 本篇技术指南围绕 release 0.2大数据数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表