ARTICLE DETAIL

资讯详情

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

Apache DataFusion 6.0.0 版本解析:并发模型重构、函数易失性体系与指标框架全面落地

Apache DataFusion 6.0.0 版本解析:并发模型重构、函数易失性体系与指标框架全面落地 大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载导读Apache DataFusion 6.0.0发布于 2021-11-13是该项目在查询引擎架构上的一次重要里程碑这一版本完成了异步化改造与可观测性建设两大主线TableProvider 扫描与物理计划创建全面异步化、文件分区抽象重构、并发配置更名为 target_partitions同时引入了函数易失性volatility标注、统一指标Metrics框架与 EXPLAIN ANALYZE 支持并带来常量折叠、公共子表达式消除、集合运算INTERSECT/EXCEPT等一大批查询能力增强。本文将结合当前仓库源码逐项解析这些变更的设计动机、落地方式与后续演化帮助读者理解 DataFusion 查询引擎在并发模型、成本优化与性能观测方面的核心机制。一、破坏性变更面向架构升级的 API 重塑6.0.0 的 Breaking changes 反映了当时 DataFusion 正在经历的两轮关键架构调整一是执行模型的异步化与并行化二是物理计划层对文件扫描与统计信息的统一抽象。1.1 并发配置重命名with_concurrency→target_partitions#706 将执行配置中的with_concurrency重命名为target_partitions#1200 进一步移除了已弃用的with_concurrency。这一命名的背后是语义的澄清该参数控制的并非并发线程数而是物理执行时把工作负载切分成的分区partitions数量——每个分区由独立的执行流处理最终决定算子的并行度。这一设计延续至今。在 datafusion/common/src/config.rs 中可以看到它的现代形态pub target_partitions: usize, transform ExecutionOptions::normalized_parallelism, default get_available_parallelism()其取值还有一条特殊约定传入0时会自动解析为get_available_parallelism()返回的可用 CPU 数见 ExecutionOptions::normalized_parallelism。6.0.0 时代引入的以分区数驱动并行度的思路后来演化出了repartition_file_min_size、repartition_joins等一系列围绕target_partitions的分区策略配置同样定义于 config.rs。1.2 异步化TableProvider::scan()与PhysicalPlanner::create_physical_plan()改为 async#1013 将TableProvider::scan()和PhysicalPlanner::create_physical_plan()改为异步接口。这是执行层拥抱async生态的关键一步TableProvider 可以异步地执行元数据读取、文件列表枚举等 IO 操作不再阻塞规划线程物理计划创建同理可以异步等待底层资源。从当前仓库的 TableProvider trait 与 物理计划模块 可以看到这一异步化契约至今仍是 DataFusion 扩展数据源的标准接口方式所有内置数据源Parquet、CSV、JSON、Avro 等均通过异步 scan 实现。1.3 文件扫描抽象FilePartition/PartitionedFile与按文件格式重组 TableProvider围绕文件扫描灵活性6.0.0 引入了几项相互关联的重构#932 引入FilePartition与PartitionedFile把一个分区对应一组文件的抽象正式落地为后续按分区粒度并发扫描、分区裁剪partition pruning打下基础#1120 简化了文件结构抽象Simplify file struct abstractions#1138 支持单个分区内包含多个 CSV/Avro/JSON 文件#1141 为ListingTable引入文件分区支持File partitioning for ListingTable并作为 breaking change 出现#1010 将 TableProvider 按文件格式重新组织#910 顺势新增了 Avro Table Provider。这些抽象在今天的 datasource 目录中仍然可以找到清晰的对应物各格式数据源如 datasource-parquet、datasource-csv、datasource-avro统一基于文件分区与 listing 机制构建。1.4 成本优化下沉CBO 与 Statistics 移入物理计划#965 与 datafusion/physical-plan/src/operator_statistics 承载各物理执行节点实现ExecutionPlan::statistics()供优化器消费。1.5 函数易失性Signature增加 Volatility 标注#1071 为Signature增加函数易失性volatility属性这是 6.0.0 中最具前瞻性的设计之一。它把 SQL 引擎中的函数划分为 Immutable / Stable / Volatile 三类为优化器在什么时机、以什么方式折叠函数调用提供了依据。这一体系完整保留在 datafusion/expr/src/expr.rs例如优化器判断表达式是否纯时直接检查matches!(self, Expr::ScalarFunction(func) if func.func.signature().volatility Volatility::Volatile)同时Signature构造时强制携带易失性标注例如 自定义函数测试 中Signature::uniform(1, vec![DataType::Float32], Volatility::Stable)的写法。易失性语义的核心价值是Immutable/Stable 函数如now()可以被安全地提前求值或常量折叠而 Volatile 函数如random()必须保留每次调用的语义。1.6 指标框架与 EXPLAIN ANALYZE让执行可观测6.0.0 集中交付了可观测性能力#908 改进 SQLMetric API 并移植既有指标#999 将Metrics::labels()设为公开#866 为所有内置算子添加 baseline 指标#909 引入BaselineMetrics、TimestampMetrics并将output_time更名为elapsed_compute指标逐步覆盖到 FilterExec、Sort、HashAggregate#938、SortPreservingMerge#948、WindowAgg 与 Union#1018、Limit/Projection/CoalesceBatches#1004等算子#858 正式支持EXPLAIN ANALYZE并在 #929 修复其应跑完全部优化器规则的问题。如今这套框架在仓库中已高度成熟指标定义集中在 datafusion/physical-plan/src/metrics.rs转发自datafusion-physical-expr-common而EXPLAIN ANALYZE的行为由 datafusion/common/src/config.rs 中的analyze_levelsummary/dev与analyze_categoriesrows/bytes/timing/uncategorized两个配置项精细控制——这正是在 6.0.0 打下的基础之上的演进。1.7 其他 API 调整#986 将NthValue::{first_value,last_value,nth_value}重命名以满足 Rust 1.55 的 clippy 要求#1023 允许表连接中出现重复字段名并修正重复名输出#934、#1052 升级 sqlparser 到 0.10 / 0.11SQL 解析能力随之扩展。二、查询能力增强集合运算、窗口函数与表达式体系2.1 集合运算补齐UNION / INTERSECT / EXCEPT6.0.0 完整补齐了集合运算家族#1068 支持UNION [DISTINCT]SQL#1135 实现INTERSECT与INTERSECT DISTINCT#1259 实现EXCEPT与EXCEPT DISTINCT配套的 DataFrame API 支持分别在 #1261except与 #1258intersect落地#1088 修复了 UNION ALL 在 schema 合并时的越界 panic。此外 #1165 增加了 values 列表表达式#1172 支持在 values 列表中使用一元/二元表达式为 INSERT/CTAS 场景铺路。2.2 窗口函数扩展#1167 让 DataFrame API 支持窗口函数#1077、#1076 新增percent_rank与cume_dist窗口函数与既有的row_number、rank、nth_value等构成较完整的窗口函数家族。2.3 表达式与类型系统#1156 / #1161 为CASE语句增加布尔支持同时 #91 关闭了布尔列分组问题#1117 实现IS [NOT] DISTINCT FROM#935 / #947 支持TRIM BOTH/LEADING/TRAILING语法#1006 支持对 List 的索引字段访问#1204 增强GetIndexedFieldExpr支持以 utf8 key 访问 struct 字段#119 使 SQL 可以引用 struct 内部字段#1091 为ScalarValue增加Struct变体#1142 支持任意列表元素类型#971 为Expr实现Display并改进算子显示#1015 为Expr派生PartialOrd#763 为Expr实现ops::Not#1030 新增lit_timestamp_nanosecond。三、加密与近似统计digest 家族与 HyperLogLog6.0.0 在函数库上引入了两个新方向加密哈希函数家族以 digest(utf8, method)#1090统一重构了所有哈希函数并加入blake3#1086、blake2b/blake2s#1081算法近似统计#1095 中的成熟实现。四、优化器与执行器改进4.1 常量折叠与公共子表达式消除6.0.0 的优化器有了实质进展#1070 / #1153 引入通用常量表达式求值Generic constant expression evaluation#1176 把now()等 Stable 函数的折叠从Simplifier移到ConstEvaluator——这与 1.5 节的易失性体系直接呼应只有 Immutable/Stable 表达式才可折叠#1208 在常量折叠中加入代数化简algebraic simplifications#792 实现基础的公共子表达式消除CSE。这些能力在今日源码中的直接继承者位于 datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs其中ConstEvaluator::try_new(config_options)第 597 行读取会话配置决定求值行为且明确只求值不含列引用的表达式第 484 行注释并过滤含标量变量的表达式第 590 行注释。CSE 则在 datafusion/optimizer/src 中继续以优化器规则形式存在。4.2 执行器健壮性与性能任务清理RepartitionExec、SortPreservingMergeExec、WindowAggExec#1112、AnalyzeExec、CoalescePartitionsExec、HashAggregateExec#1121、SortStream#1105在 drop 时正确清理派生任务避免资源泄漏分组哈希重构#808 重做 GroupByHash提升性能并支持对 NULL 分组比较优化#844 增加ScalarValue::eq_array优化比较函数调试构建防栈溢出#1047 降低BinaryExpr::evaluate的栈占用。4.3 连接与类型修复#1054 修复 Float32/Float64 列连接问题#1055 修复 Timestamp 列连接问题对应 #187#1024 在 schema 合并时忽略元数据。五、CLI、DataFrame 与生态配套6.0.0 同时让 datafusion-cli 更可用#1224 增加\q退出命令与\?帮助#1225 处理 EOF 与中断信号#1229 增加列出表命令#1231 增加SHOW COLUMNS描述表结构#1251 为 CLI 增加带校验的编辑器支持#1278 为 CREATE TABLE 语句增加文件名补全#860 将规划耗时纳入 CLI 打印输出。DataFrame API 侧新增show/show_limit#923 / #937INTERSECT/EXCEPT#1258 / #1261以及LogicalPlanBuilder::schema()#1075。SQL 层还新增了DROP TABLE#1266、通过 MemTable 支持CREATE TABLE AS#1243、无 schema 直接查询 CSV#1050、PostgreSQL 风格正则匹配#870、对 DictionaryArray 的 LIKE 支持#876修复 #815、基于已知 schema 免文件 IO 注册表#872以及自定义优化器规则配置ExecutionConfig.with_optimizer_rules#1022。依赖与生态方面Arrow 升级到 6.0 / 6.1.0#984 / #1255datafusion-cli 支持通过 Homebrew 安装#1198Ballista 获得跨连接支持#891并接入 CLI#889。六、版本遗留问题与启示从 6.0.0 的 Closed issues 列表可以看出当时仍在推进的方向例如#133 读取分区 Parquet 文件、#204 分区裁剪、#126 Catalog 抽象、#98 常量折叠——其中大部分在后续版本落地而 6.0.0 本身已经为这些能力铺设了文件分区、统计信息下沉等基础架构。这一版本真正值得借鉴的是其先立契约、再填能力的升级节奏异步化与分区抽象先行易失性与指标体系随后支撑起常量折叠和 EXPLAIN ANALYZE最终形成规划可优化、执行可观测、数据源可扩展的引擎骨架。对希望深入 DataFusion 源码datafusion/optimizer/src、datafusion/physical-plan/src、datafusion/common/src/config.rs的读者而言6.0.0 是理解这些核心模块演进脉络的最佳起点。赞分享大数据数据分析后端【免费下载链接】datafusionApache DataFusion SQL Query Engine项目地址https://gitcode.com/gh_mirrors/datafu/datafusion点击查看免费下载相关推荐Pydantic AI Agent 全面解析构建类型安全、可流式、可取消的智能体运行系统Pydantic AI Agent 全面解析构建类型安全、可流式、可取消的智能体运行系统 本文以 Pydantic AI 官方文档 docs/agent.md大数据数据分析后端在 ms-swift 中使用 SAPO 软门控策略优化 GRPO 训练原理、参数与实战在 ms swift 中使用 SAPO 软门控策略优化 GRPO 训练原理、参数与实战 SAPOSoft Adaptive Policy Optimizat大数据数据分析后端如何快速上手Rsysstat10分钟掌握系统性能监控新利器如何快速上手Rsysstat10分钟掌握系统性能监控新利器 前往项目官网免费下载 https://ar.openeuler.org/ar/ https://大数据数据分析后端上一篇告别配置查找焦虑Apollo配置搜索完整实战手册下一篇GPU显存健康检测指南3步发现显卡隐患的智能方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表