ARTICLE DETAIL

资讯详情

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

Presto 0.259 版本解析:Weibull 分布函数、内存错误增强与资源组查询限制

Presto 0.259 版本解析:Weibull 分布函数、内存错误增强与资源组查询限制 大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载导读Presto 0.259 是 PrestoDBGitHub 加速计划 / pre / presto发布的一个重要版本围绕 SQL 函数、错误诊断、JDBC 连接能力与资源组治理四个方面进行了增强新增了 Weibull 分布的 CDF 与逆 CDF 数学函数默认开启内存超限错误的详细诊断信息为 JDBC 驱动新增连接属性读取接口并支持 JDBC 过滤条件下推资源组新增了单查询级per-query的 CPU 时间、内存与执行时间限制。本文以官方发布说明 release-0.259.rst 为主线结合仓库源码与测试用例逐项解析这些新能力的语法、配置方法、实现原理与使用场景。⚠️ 版本警示本版本在 JDBC Connector 上存在一个已知回归regression升级或部署前请充分评估与测试。一、General Changes查询引擎的通用改进1.1 修复 EXPLAIN 与 LIKE 谓词组合时的 ClassCastException本版本修复了一个偶发的ClassCastException当查询中包含LIKE谓词并且执行EXPLAIN时某些场景下会抛出类型转换异常。修复后EXPLAIN配合LIKE谓词的查询可以正常生成执行计划这对日常使用EXPLAIN分析查询性能的开发与运维人员是一个直接的稳定性改进。1.2 新增 Weibull 分布 CDF 与逆 CDF 函数本版本在 SQL 数学函数库中新增了两个与 Weibull 分布相关的函数用于可靠性工程、寿命数据分析、故障时间建模等场景weibull_cdf(a, b, value)→ double计算参数为a、b的 Weibull 分布的累积分布函数值P(N value)。inverse_weibull_cdf(a, b, p)→ double计算给定累积概率p对应的 Weibull 分布分位数。两个函数均要求a、b为正的 DOUBLE 值inverse_weibull_cdf的概率参数p必须落在[0, 1]区间内。函数形式化定义与参数约束参见数学函数文档 math.rst。源码实现原理这两个函数定义于 MathFunctions.java内部委托给 Apache Commons Math 的WeibullDistribution实现Description(Weibull cdf given the a, b parameters and value) ScalarFunction SqlType(StandardTypes.DOUBLE) public static double weibullCdf( SqlType(StandardTypes.DOUBLE) double a, SqlType(StandardTypes.DOUBLE) double b, SqlType(StandardTypes.DOUBLE) double value) { checkCondition(a 0, INVALID_FUNCTION_ARGUMENT, weibullCdf Function: a must be greater than 0); checkCondition(b 0, INVALID_FUNCTION_ARGUMENT, weibullCdf Function: b must be greater than 0); WeibullDistribution distribution new WeibullDistribution(null, a, b, WeibullDistribution.DEFAULT_INVERSE_ABSOLUTE_ACCURACY); return distribution.cumulativeProbability(value); }从源码可以看出参数校验在 SQL 函数入口处显式完成a 0、b 0非法参数会以INVALID_FUNCTION_ARGUMENT错误抛出而不是静默返回异常数值分布计算使用WeibullDistribution.DEFAULT_INVERSE_ABSOLUTE_ACCURACY作为逆 CDF 求解精度控制。用法示例与参数约束-- 计算 Weibull(1.0, 0.6) 分布在 3.0 处的 CDF 值 SELECT weibull_cdf(1.0, 0.6, 3.0); -- ≈ 0.99 -- 计算 Weibull(1.0, 0.6) 分布的 0.91 分位数 SELECT inverse_weibull_cdf(1.0, 0.6, 0.91); -- ≈ 1.44 -- 非法参数会直接报错 SELECT weibull_cdf(0, 3, 0.5); -- ERROR: a must be greater than 0 SELECT inverse_weibull_cdf(3, 5, 1.1); -- ERROR: p must be in the interval [0, 1]上述示例与错误信息均来自测试用例 TestMathFunctions.java 中的testWeibullCdf与testInverseWeibullCdf可用于验证安装版本的行为是否符合预期。这些函数与既有的normal_cdf、poisson_cdf、t_cdf、inverse_normal_cdf等概率函数构成了一套完整的分布分析工具集方便在 SQL 中直接完成统计建模而不必导出数据。1.3 默认启用 EXCEEDED_LOCAL_MEMORY_LIMIT 详细错误信息当查询超过单节点本地内存限制EXCEEDED_LOCAL_MEMORY_LIMIT时Presto 0.259 默认会在错误信息中附带额外的算子内存分配详情帮助定位内存超限的具体环节。若希望恢复精简的错误信息可在config.properties中显式关闭memory.verbose-exceeded-memory-limit-errors-enabledfalse配置项在源码中的定义与默认值该配置项定义于 NodeMemoryConfig.javapublic boolean isVerboseExceededMemoryLimitErrorsEnabled() { return verboseExceededMemoryLimitErrorsEnabled; } Config(memory.verbose-exceeded-memory-limit-errors-enabled) ConfigDescription(When enabled the error message for exceeded memory limit errors will contain additional operator memory allocation details) public NodeMemoryConfig setVerboseExceededMemoryLimitErrorsEnabled(boolean verboseExceededMemoryLimitErrorsEnabled) { this.verboseExceededMemoryLimitErrorsEnabled verboseExceededMemoryLimitErrorsEnabled; return this; }注意verboseExceededMemoryLimitErrorsEnabled的字段初始值即为trueNodeMemoryConfig.java即“默认开启”配置测试 TestNodeMemoryConfig.java 也验证了将该项设为false的行为。详细错误信息包含什么错误信息的构造逻辑位于 QueryContext.java当开关开启时错误消息会在基础信息之上追加Top Consumers按内存占用排序的前 3 个内存消费者及其占用字节数succinctBytes格式化Details各 Task 的内存预留摘要TaskMemoryReservationSummary按预留内存从大到小排序仅包含预留大于 0 的 Task最多 3 个。if (verboseExceededMemoryLimitErrorsEnabled) { ListTaskMemoryReservationSummary memoryReservationSummaries getTaskMemoryReservationSummaries(); message , Details: memoryReservationSummaryJsonCodec.toJson(memoryReservationSummaries); }这意味着开启后当查询触发本地内存超限时错误信息会直接告诉你“哪些算子/任务吃掉了最多的内存”对排查 OOM 类问题有直接的指导价值。生产环境若担心错误信息过长影响日志可读性可通过上述配置项关闭。二、JDBC Driver Changes连接属性读取2.1 新增getConnectionProperties方法Presto 0.259 为 JDBC 驱动中的PrestoConnection新增了getConnectionProperties()方法对应 PR #16329用于在连接建立之后检索连接属性。该方法在 PrestoConnection.java 中实现public Properties getConnectionProperties() { Properties properties new Properties(); for (Map.EntryObject, Object entry : connectionProperties.entrySet()) { properties.setProperty((String) entry.getKey(), (String) entry.getValue()); } return properties; }从实现看它返回的是connectionProperties的一个拷贝而不是内部引用因此调用方修改返回的Properties不会污染驱动内部状态这是良好的 API 设计。使用场景当应用通过 JDBC URL 传入大量连接参数如user、password、extraCredentials、sessionProperties等时连接建立后可以通过该方法回读实际生效的属性用于调试、审计或动态决策。例如try (PrestoConnection connection (PrestoConnection) DriverManager.getConnection(jdbcUrl)) { Properties props connection.getConnectionProperties(); String extraCredentials props.getProperty(extraCredentials); // ... }对应的测试 TestJdbcConnection.java 验证了通过extraCredentialstest.token.foo:bar;test.token.abc:xyz建立连接后getConnectionProperties()返回的Properties非空且能正确取回extraCredentials属性Test public void testConnectionProperties() throws SQLException { String extra extraCredentialstest.token.foo:bar;test.token.abc:xyz; try (PrestoConnection connection createConnection(extra).unwrap(PrestoConnection.class)) { Properties connectionProperties connection.getConnectionProperties(); assertTrue(connectionProperties.size() 0); assertNotNull(connectionProperties.getProperty(extraCredentials)); } }注意该方法定义在PrestoConnection上而非 JDBC 标准接口java.sql.Connection因此调用时需要先unwrap(PrestoConnection.class)或直接使用PrestoConnection类型引用。三、JDBC Connector Changes过滤条件部分下推本版本为 JDBC Connector 增加了**过滤条件的部分下推partial pushdown of JDBC filters**能力。此前 JDBC Connector 对过滤条件下推的支持较为有限复杂过滤条件可能整体无法下推部分下推意味着查询中的部分过滤条件如某些简单谓词可以被下推到远端数据库执行而无法下推的剩余条件则由 Presto 本地完成过滤。这一能力在 JDBC 数据源MySQL、PostgreSQL、ClickHouse、Oracle、SQL Server、Redshift、SingleStore 等基于presto-base-jdbc构建的连接器上可以降低从远端数据库拉取的数据量从而减少网络传输与本地计算开销。从源码结构看该能力位于 presto-base-jdbc 模块各 JDBC 系连接器如 presto-mysql、presto-postgresql均依赖此基座。实际下推效果取决于底层数据库对 SQL 表达式的支持能力。四、Resource Groups Changes资源组级查询限制4.1 新能力概览Presto 0.259 允许在资源组Resource Group级别为其中的每条查询设置三类上限执行时间限制executionTimeLimit单条查询最长允许执行的时间例如1h总内存限制totalMemoryLimit单条查询最多允许消耗的分布式内存例如1GBCPU 时间限制cpuTimeLimit单条查询最多允许使用的 CPU 时间例如1h。当查询超过其中任一限制时该查询会被终止killed。该功能的具体配置语法参见资源组文档 resource-groups.rst。需要特别注意的是这些 per-query 限制不会被父组继承每个资源组需要独立配置。4.2 JSON 配置示例在资源组的 JSON 配置文件中通过新增的perQueryLimits字段配置完整示例可参考测试配置 resource_groups_config.json{ rootGroups: [ { name: global, softMemoryLimit: 1MB, hardConcurrencyLimit: 100, maxQueued: 1000, schedulingPolicy: weighted, jmxExport: true, perQueryLimits: { executionTimeLimit: 1h, totalMemoryLimit: 1MB, cpuTimeLimit: 1h }, subGroups: [ { name: sub, softMemoryLimit: 2MB, hardConcurrencyLimit: 3, maxQueued: 4, schedulingWeight: 5 } ] } ], selectors: [ { group: global } ], cpuQuotaPeriod: 1h }executionTimeLimit、totalMemoryLimit、cpuTimeLimit三个字段均为可选不配置的维度表示不设限。4.3 SPI 层新增ResourceGroupQueryLimits为了实现上述能力Presto 0.259 在 SPI 中新增了不可变类ResourceGroupQueryLimits并为其对应的ResourceGroups接口补充了 getter/setter。该类定义于 ResourceGroupQueryLimits.javapublic final class ResourceGroupQueryLimits { private final OptionalDuration executionTimeLimit; private final OptionalDataSize totalMemoryLimit; private final OptionalDuration cpuTimeLimit; public static final ResourceGroupQueryLimits NO_LIMITS new ResourceGroupQueryLimits(Optional.empty(), Optional.empty(), Optional.empty()); ... }设计要点三个字段均为Optional未配置的维度为Optional.empty()提供静态常量NO_LIMITS表示“无任何限制”InternalResourceGroup默认使用该值InternalResourceGroup.java类带有JsonCreator/JsonProperty注解支持 JSON 序列化与反序列化这正是配置文件与 SPI 对象之间的桥梁该类为final且字段不可变保证并发场景下的安全共享。4.4 运行时如何生效在运行时InternalResourceGroup通过setPerQueryLimits(...)接收配置并在查询启动时将限制传递给查询执行层InternalResourceGroup.javaquery.setResourceGroupQueryLimits(perQueryLimits);查询执行层SqlQueryExecution、QueryTracker、ClusterMemoryManager等见 presto-main-base 与 presto-main/src/main/java/com/facebook/presto/memory/ClusterMemoryManager.java随后根据这些限制对查询的执行时间、CPU 时间与总内存进行监控超限即终止查询。这意味着资源组管理员可以针对不同业务组如 ETL 批处理、临时查询设定差异化的单查询资源上限防止单个失控查询拖垮整个组。五、版本升级与部署注意事项JDBC Connector 回归本版本在 JDBC Connector 上存在已知回归使用 JDBC 数据源尤其是跨多个 JDBC 连接器的混合负载的生产集群在升级前应重点回归测试过滤下推与查询下推场景新配置项memory.verbose-exceeded-memory-limit-errors-enabled默认值为true对应 NodeMemoryConfig.java如不需要详细内存错误信息可在升级后显式关闭以保持错误输出精简资源组配置格式若使用资源组功能需确认配置文件格式与perQueryLimits字段兼容该字段为可选旧配置文件不包含该字段时行为不变新函数可用性weibull_cdf与inverse_weibull_cdf属于核心数学函数库升级后所有查询引擎节点均可直接使用无需额外安装插件。参考资源版本发布说明release-0.259.rst数学函数文档math.rst资源组管理文档resource-groups.rst函数实现MathFunctions.java函数测试TestMathFunctions.java内存配置NodeMemoryConfig.java、QueryContext.javaJDBC 驱动实现PrestoConnection.java、TestJdbcConnection.java资源组 SPIResourceGroupQueryLimits.java、InternalResourceGroup.java赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐Presto 0.179 版本发布全解析新函数、文件型全局安全与资源组查询时限Presto 0.179 版本发布全解析新函数、文件型全局安全与资源组查询时限 导读 本文以 PrestoTrino 前身官方发布的 Release 0.大数据数据库后端Presto 0.240 版本发布详解窗口函数溢写、SQL 函数内联与查询扫描上限控制Presto 0.240 版本发布详解窗口函数溢写、SQL 函数内联与查询扫描上限控制 本篇技术指南以 Presto 官方发行说明 release 0.240大数据数据库后端Presto 0.230 版本发布详解函数编译修复、新数组函数与 Hive/Raptor 存储增强Presto 0.230 版本发布详解函数编译修复、新数组函数与 Hive/Raptor 存储增强 导读 Presto 0.230 是 Presto 分布式大数据数据库后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表