ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Presto 0.225 版本技术解析:查询任务管控、GCS 认证、JDBC 大小写匹配与 SPI 演进

Presto 0.225 版本技术解析:查询任务管控、GCS 认证、JDBC 大小写匹配与 SPI 演进 Presto 0.225 版本技术解析查询任务管控、GCS 认证、JDBC 大小写匹配与 SPI 演进【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/prestoPresto 0.225 是 Presto分布式 SQL 查询引擎发布的一个重要版本本次更新覆盖通用执行引擎、JDBC 连接器、Web UI、Elasticsearch 与 Hive 连接器、Raptor 存储、SPI 接口以及 Verifier 等多个层面。本文以官方 release-0.225.rst 为骨架结合当前仓库的源码与测试用例逐条拆解每个变更背后的实现原理与配置方法帮助你理解如何在集群中启用这些新能力、规避旧版缺陷并掌握 Presto 内部任务调度与连接器 SPI 的演进脉络。一、版本背景与总体概览Release 0.225 是一个通用能力增强 连接器修复并重的版本核心看点可以归纳为四类执行引擎健壮性修复输出数据量统计、空间连接spatial join内存溢出、算子峰值内存泄漏等问题并引入运行任务数上限的全局/单查询管控配置。连接器能力JDBC 连接器支持大小写不敏感的名称匹配Elasticsearch 连接器支持嵌套字段Hive 连接器改善 S3 读性能并新增两种 GCS 认证方式。存储层Raptor拒绝不支持的建表类型、移除旧版 ORC writer并新增桶均衡存储过程。SPI 演进ConnectorPageSourceProvider#createPageSource新增TableHandle参数ConnectorMetadata.getTableStatistics新增columnHandles参数为下推与 CBO 剪枝铺路。下文将按原文档的章节顺序逐条展开讲解并附上仓库中的源码路径作为证据。二、General Changes执行引擎的修复与任务管控2.1 三个内存/统计相关的修复原文档列出了三项通用修复本质都是统计口径或内存安全问题修复 fragment 输出数据量统计偏低:issue:11770此前某些查询片段fragment上报的输出数据大小存在少报导致 Web UI 与资源统计失真。此修复涉及执行层对输出字节数的核算逻辑。修复空间连接导致 worker 内存耗尽崩溃:pr:13251空间连接如基于地理坐标的 JOIN在构建空间索引时若数据倾斜可能触发 worker OOM。0.225 起对此类场景做了保护并在下一条变更中硬性要求空间分区必须非空。修复算子峰值内存计算泄漏:issue:13210算子operator的峰值内存统计在部分路径下未能正确释放/更新长期运行会出现内存统计虚高此修复纠正了operator peak memory的计算方式。此外0.225 还新增了一条防御性校验当空间分区spatial partition包含 0 行时抛出异常避免在空分区上继续构建索引导致后续阶段出现不可预期的行为。2.2 新增运行任务数管控配置experimental.max-total-running-task-count 与 experimental.max-query-running-task-count这是 0.225 最重要的执行引擎新特性。它允许管理员对全集群与单个查询两个维度限制正在运行的 task 数量用于防止并发查询过多时任务洪泛拖垮调度器或 worker。原文档给出的两个配置项为# 限制所有查询的总运行任务数 experimental.max-total-running-task-count1000 # 限制单个查询的运行任务数 experimental.max-query-running-task-count200原文档特别强调只有当两个条件同时被违反时查询才会被终止Query will be killed only if both conditions are violated。也就是说单条查询超限但全局未超限、或全局超限但单条未超限都不会触发 kill避免误杀。从当前仓库源码看这两个属性在后续版本中经历了重构与更名但语义一脉相承可以在 QueryManagerConfig.java 中看到它们的现代形态max-total-running-task-count-to-kill-query当所有查询的运行任务数超过该阈值时查询可能被终止对应原experimental.max-total-running-task-count。max-query-running-task-count单个查询允许的最大运行任务数其ConfigDescription明确写着仅当 max-total-running-task-count-to-kill-query 被违反时才生效Maximal allowed running task for single query only if max-total-running-task-count-to-kill-query is violated——这正是原文档两者同时违反才 kill语义的源码级印证。max-total-running-task-count-to-not-execute-new-query当全局任务数超过该阈值时新查询进入队列排队而非直接执行带LegacyConfig(experimental.max-total-running-task-count-to-not-execute-new-query)注解可见其前身正是 0.225 的 experimental 属性。这些配置在运行时由 QueryTracker.java 读取并缓存为maxTotalRunningTaskCountToKillQuery与maxQueryRunningTaskCount用于在任务提交/调度路径上做决策。单元测试可参考 TestQueryManagerConfig.java。配置建议生产环境建议结合集群规模与 worker 槽位估算experimental.max-total-running-task-count约等于「worker 数 × 每 worker 最大并发 task 数」单查询上限则根据业务最大查询的扇出度设置避免大查询自身把全局配额耗尽。2.3 QueryCompletedEvent 增加输入表统计信息0.225 为QueryCompletedEvent中的QueryInputMetadata增加了TableStatistics字段:pr:12808用于携带 JOIN 查询中输入表的统计估计值。这让事件监听器、审计系统与基于事件的调度器能够获取每个输入表的大小/行数等统计为容量规划与成本分析提供数据基础。三、JDBC Changes大小写不敏感的名称匹配原文档指出JDBC 连接器新增了大小写不敏感的表/模式名匹配能力通过目录配置项启用case-insensitive-name-matchingtrue此特性解决了目标数据库建表命名大小写混用如MyTable、USERS而 Presto 端以小写标识符查询导致找不到表的常见痛点。从源码看该配置在 BaseJdbcConfig.java 中定义Config(case-insensitive-name-matching) public BaseJdbcConfig setCaseInsensitiveNameMatching(boolean caseInsensitiveNameMatching)同一配置类还提供了配套的case-insensitive-name-matching.cache-ttl第 152 行用于控制大小写匹配结果的缓存有效期避免每次查询都回源数据库解析名称并且第 189 行在case-insensitive-name-matchingtrue与case-sensitive-name-matchingtrue同时设置时会抛出ConfigurationException防止配置互相矛盾。行为测试见 TestBaseJdbcConfig.java。由于 MySQL、PostgreSQL、SQL Server、ClickHouse 等连接器都基于presto-base-jdbc构建因此该配置对所有继承自 JDBC 基类的连接器如presto-mysql、presto-postgresql、presto-sqlserver、presto-clickhouse同样适用——只需在其各自的 catalog properties 中开启即可。四、Web UI Changes查询页按 Stage 展示 Tasks0.225 的 Web UI 在查询详情页query page上增加了按 stage 展示 tasks的能力。此前 task 列表的呈现方式不利于快速定位某个 stage 的执行状况新版 UI 允许运维人员直接按 stage 维度查看各 task 的运行状态、输入输出与进度配合 2.1 节修复后的输出数据量统计可以更准确地判断数据倾斜与执行瓶颈。相关前端代码位于 presto-ui/query_viewer.jsx、presto-ui/stage.jsx 与 presto-ui/timeline.jsx。五、Elasticsearch Connector Changes嵌套字段支持原文档说明 Elasticsearch 连接器修复并支持嵌套字段nested fields:issue:12642。从源码与测试看该能力在 ElasticsearchClient.java 中对nested类型进行了显式处理将 ES 的 nested/object 层级映射为 Presto 的 ROW 类型列。集成测试 TestElasticsearchIntegrationSmokeTest.java 提供了大量验证样例对nested_variants索引执行SELECT a.b.c FROM nested_variants第 345 行验证深层嵌套字段投影对nested_type_nested索引第 596-654 行验证nested_field下 boolean、float、double、integer、long、keyword、text、binary、timestamp、ipv4、ipv6 等各类子字段的读取。使用方式在 catalog properties 中启用 Elasticsearch 连接器后即可直接以schema.table.nested_field.sub_field的点分形式访问嵌套字段或对 ROW 类型字段执行SELECT nested_field FROM table。六、Hive ChangesS3 读取性能与 GCS 认证6.1 S3 文件读取性能提升0.225 优化了 Hive 连接器在S3上的文件读取性能:pr:13222。此改动聚焦于减少对象存储高延迟场景下的冗余网络往返提升大表扫描吞吐。部署在 AWS S3 上的 Presto 集群可直接受益无需额外配置。6.2 新增 GCS 认证方式一JSON 密钥文件原文档给出了第一个新配置项hive.gcs.json-key-file-path/path/to/gcs_keyfile.json该配置允许使用 Google Cloud 服务账号的JSON 密钥文件进行 GCS 访问认证替代此前仅支持 PEM 私钥的方式。配置在 HiveGcsConfig.java 中实现Config(hive.gcs.json-key-file-path) public HiveGcsConfig setJsonKeyFilePath(String jsonKeyFilePath)测试 TestHiveGcsConfig.java 中将其解析为/tmp/key.json进行验证。注意该属性通常应配置在 Hive catalog properties 文件中路径指向集群各节点可访问的本地文件。6.3 新增 GCS 认证方式二客户端提供的 OAuth Token第二个新配置项允许使用客户端提供的 OAuth 访问令牌访问 GCShive.gcs.use-access-tokenfalse该开关在 HiveGcsConfig.java 中对应字段useGcsAccessToken默认值为false即默认关闭走传统密钥认证。当设置为true时连接器会使用查询/会话上下文中携带的 OAuth token 访问 GCS适用于应用侧已经具备 OAuth 凭据、不希望将长期密钥文件分发到每个节点的场景。测试用例同样在 TestHiveGcsConfig.java 中覆盖了hive.gcs.use-access-tokentrue的解析。两种认证方式的取舍配置项取值适用场景hive.gcs.json-key-file-path密钥文件路径服务账号密钥集中托管、节点可读本地文件hive.gcs.use-access-tokentrue/false默认 false客户端已具备 OAuth token避免分发长期密钥七、Raptor Changes类型限制、ORC 清理与桶均衡过程7.1 拒绝不支持的建表类型RaptorPresto 内置的分布式存储连接器在 0.225 起对不支持的建表类型如 ROW 类型返回错误:pr:13209避免在底层存储上创建无法正确处理复杂类型的表将问题提前暴露在 DDL 阶段。7.2 移除旧版 ORC WriterRaptor 移除了 legacy ORC writer配置项storage.orc.optimized-writer-stage默认启用选项DISABLED被移除。这意味着从 0.225 起Raptor 写入 ORC 文件统一走优化后的写入阶段不再提供回退到旧实现的开关集群升级后应确认没有配置残留引用DISABLED选项。7.3 新增存储过程 trigger_bucket_balancerRaptor 新增存储过程trigger_bucket_balancer用于手动触发桶均衡任务。当集群新增节点或数据分布不均时管理员可以直接调用CALL system.trigger_bucket_balancer();该过程将调度一次桶均衡作业把热点桶数据迁移到负载较低的节点改善读取本地性与整体 IO 分布。八、SPI Changes连接器接口的两处签名演进0.225 对 SPI 做了两处向后兼容以新参数扩展的接口变更直接影响所有连接器实现者。8.1 createPageSource 增加 TableHandle 参数ConnectorPageSourceProvider#createPageSource方法新增TableHandle参数使连接器在执行阶段也能访问ConnectorTableLayoutHandle之前连接器只能依据调用时传入的 layout 信息创建数据源之后连接器可结合表句柄与 layout handle在 PageSource 创建阶段进行更精确的下推决策如过滤条件下推、分区裁剪、谓词重写。这对实现执行期才可知的优化逻辑例如依赖表级元数据的列裁剪至关重要。8.2 getTableStatistics 增加 columnHandles 参数ConnectorMetadata.getTableStatistics方法新增columnHandles参数允许连接器按需裁剪统计信息只返回目标列及子字段的统计值从而修复了子字段剪枝subfield pruning与 CBO基于成本的优化器之间的兼容性问题:issue:13082避免为整表所有列计算/返回统计降低统计收集开销提升 CBO 决策效率。连接器实现者需要在升级后适配这两个方法的新签名并对传入的TableHandle/columnHandles做空值与剪枝语义的处理。九、Verifier Changes套件级会话属性与失败诊断增强VerifierPresto 自带的查询对拍验证工具在 0.225 中新增了三项能力套件级会话属性覆盖支持为某个套件suite中的所有查询统一覆盖 session properties无需逐条查询单独指定便于在整套回归中统一注入session_propertyvalue或关闭某些优化器特性。QueryFailure 增加 cluster type 与可重试信息失败事件现在携带运行集群类型cluster type以及该失败是否可重试的标记帮助区分控制集群/测试集群的差异与瞬时性故障。输出事件携带最终查询失败信息Verifier 的输出事件output event中补全了最终查询失败详情便于下游报告系统直接展示失败原因。以上变更在 presto-verifier 模块中均有对应实现运维回归流水线时可重点关注失败事件的这两个新增字段。十、升级与迁移建议综合 0.225 的变更从旧版本升级时建议按以下清单核对执行引擎确认是否需要启用任务数上限配置若此前自行实现了类似的 kill/排队逻辑可评估替换为内置的experimental.max-total-running-task-count与experimental.max-query-running-task-count二者需同时违反才触发终止。Hive 连接器如需 GCS二选一配置hive.gcs.json-key-file-path或hive.gcs.use-access-token升级后检查 S3 相关路径是否获得性能提升并观察输出统计是否与真实 IO 一致。Raptor移除任何storage.orc.optimized-writer-stageDISABLED的配置残留确认建表语句未使用 ROW 等被拒绝的类型按需通过CALL system.trigger_bucket_balancer()手动均衡。JDBC 系连接器如目标库命名大小写混用在 catalog 中开启case-insensitive-name-matchingtrue。SPI 实现者适配createPageSource与getTableStatistics的新签名并回归验证子字段剪枝 CBO 的兼容性。Web UI查询页按 stage 查看 tasks 的新视图上线后可据此排查数据倾斜。十一、延伸阅读完整版本说明原文release-0.225.rst任务数管控配置的现代形态与默认值QueryManagerConfig.java、QueryTracker.javaJDBC 大小写匹配配置BaseJdbcConfig.javaGCS 认证配置实现HiveGcsConfig.javaElasticsearch 嵌套字段测试样例TestElasticsearchIntegrationSmokeTest.javaWeb UI 查询页与 stage 视图query_viewer.jsx、stage.jsx【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表