Apache DataFusion 配置参数详解
系统讲解 Apache DataFusion 的配置体系与参数取值,涵盖 SessionConfig 执行参数、批大小与分区数、优化器开关、内存池、Parquet/CSV 读写选项及 datafusion-cli 参数速查。
Apache DataFusion 配置参数详解
Apache DataFusion 的可调参数集中在 SessionConfig 与运行时环境(RuntimeEnv)中,所有配置项统一采用 datafusion.<类别>.<名称> 的命名,并可通过 information_schema.df_settings 视图枚举、通过 SQL SET 语句或编程接口修改。本文基于 Apache DataFusion 55.2.0 实测环境,逐项说明常用参数的取值与含义。下文括号中的「默认值」均为实测服务器上的实际取值。
一、配置体系概览
1.1 三层配置
- SessionConfig(会话配置):影响单次会话的 SQL 解析、执行与优化行为,如
datafusion.execution.batch_size、datafusion.optimizer.*。可在创建SessionContext时传入,或运行期用SET修改。 - RuntimeEnv / RuntimeConfig(运行时环境):管理内存池、临时目录(磁盘溢写)、对象存储等资源,如
datafusion.runtime.memory_limit、datafusion.runtime.temp_directory。 - 对象存储与 I/O 参数:如
datafusion.execution.parquet.*,控制文件读写细节。
1.2 命名规范
所有配置项以 datafusion. 开头,第二段为类别(execution/optimizer/catalog/sql_parser/format/explain/runtime 等)。可用一条 SQL 列出全部配置:
$ datafusion-cli -q --format csv -c "SELECT name, value FROM information_schema.df_settings ORDER BY name;"
datafusion.catalog.has_header,true
datafusion.execution.batch_size,8192
datafusion.execution.target_partitions,12
datafusion.optimizer.enable_topk_aggregation,true
datafusion.execution.parquet.compression,zstd(3)
...
在实测的 55.2.0 环境中,该视图共约 150 个配置项。
二、执行类核心参数
2.1 批大小 batch_size
- 键:
datafusion.execution.batch_size - 默认值(实测):
8192 - 含义:算子间传递的 Arrow
RecordBatch行数。值越大吞吐越高但内存占用越大,值越小延迟越低但调度开销上升,常按内存与并行度调优。
2.2 分区数 target_partitions
- 键:
datafusion.execution.target_partitions - 默认值(实测):
12(等于机器可用 CPU 核数) - 含义:查询计划的最大并行分区数,直接决定 CPU 并行度。CPU 密集型大批量分析可调大,小查询可调小以降低调度开销。
2.3 其他执行参数
| 配置项 | 实测默认值 | 含义 |
|---|---|---|
datafusion.execution.coalesce_batches | true | 合并小批次以减少批次数量、提升吞吐 |
datafusion.execution.collect_statistics | true | 收集列统计信息用于优化 |
datafusion.execution.planning_concurrency | 12 | 物理计划生成阶段的并发度 |
datafusion.execution.enable_ansi_mode | false | 是否启用 ANSI SQL 语义(如整数溢出报错) |
datafusion.execution.sort_in_place_threshold_bytes | 1048576 | 排序数据小于该字节数时原地排序 |
datafusion.execution.hash_join_buffering_capacity | 0 | Hash Join 缓冲容量(0 表示自适应) |
datafusion.execution.enforce_batch_size_in_joins | false | 是否强制 Join 输入批次大小一致 |
三、优化器开关
优化器开关位于 datafusion.optimizer.*,常用项如下:
| 配置项 | 实测默认值 | 含义 |
|---|---|---|
datafusion.optimizer.enable_topk_aggregation | true | 将 GROUP BY + ORDER BY + LIMIT 改写为 TopK 聚合 |
datafusion.optimizer.enable_round_robin_repartition | true | 对扫描等操作使用轮询重分区 |
datafusion.optimizer.enable_sort_pushdown | true | 下推排序到扫描算子 |
datafusion.optimizer.enable_join_dynamic_filter_pushdown | true | Join 动态过滤下推 |
datafusion.optimizer.enable_piecewise_merge_join | false | 启用分段归并 Join(默认关闭) |
datafusion.optimizer.hash_join_single_partition_threshold | 1048576 | 小于该字节数时 Hash Join 退化为单分区 |
datafusion.optimizer.filter_null_join_keys | false | 是否过滤 Join 空键 |
关闭某个优化可用于对比计划差异,例如:
$ datafusion-cli -q -c "SET datafusion.optimizer.enable_topk_aggregation = false;" \
-c "EXPLAIN SELECT * FROM 'employees.csv' ORDER BY salary DESC LIMIT 2;"
四、内存池与运行时
- 内存上限:
datafusion.runtime.memory_limit。默认不限制(空值);CLI 可用-m/--memory-limit设置。实测:
$ datafusion-cli -q -m 1g -c "SHOW datafusion.runtime.memory_limit;"
+---------------------------------+-------+
| name | value |
+---------------------------------+-------+
| datafusion.runtime.memory_limit | 1G |
+---------------------------------+-------+
- 内存池类型:CLI
--mem-pool-type greedy|fairgreedy(默认):各消费者按需抢占,实现简单;fair:按消费者公平分配,避免单个算子独占。
- 磁盘溢写:
datafusion.runtime.temp_directory指定溢写临时目录;CLI-d/--disk-limit限制可用磁盘空间(默认 100g);datafusion.execution.spill_compression(实测uncompressed)控制溢写压缩;datafusion.execution.max_spill_file_size_bytes(实测134217728,即 128 MiB)为单个溢写文件上限。 - 说明:Python 绑定 48.0.0 未导出独立的
RuntimeConfig类,内存池等运行时配置主要通过 CLI 参数或 SQLSET设置。
五、Parquet 读写选项
位于 datafusion.execution.parquet.*,常用项:
| 配置项 | 实测默认值 | 含义 |
|---|---|---|
datafusion.execution.parquet.compression | zstd(3) | 写入压缩算法与级别 |
datafusion.execution.parquet.enable_page_index | true | 启用页索引以加速谓词下推 |
datafusion.execution.parquet.pushdown_filters | false | 将过滤下推到 Parquet 解码层 |
datafusion.execution.parquet.reorder_filters | false | 重排过滤器以提升选择性 |
datafusion.execution.parquet.pruning | true | 基于统计信息裁剪行组 |
datafusion.execution.parquet.dictionary_enabled | true | 启用字典编码 |
datafusion.execution.parquet.statistics_enabled | page | 统计信息粒度(page/rowgroup) |
datafusion.execution.parquet.max_row_group_size | 1048576 | 单个 Row Group 最大行数 |
datafusion.execution.parquet.data_pagesize_limit | 1048576 | 单个数据页字节上限 |
datafusion.execution.parquet.write_batch_size | 1024 | 写入批次大小 |
datafusion.execution.parquet.writer_version | 1.0 | Parquet 写入版本 |
在 Python 中可开启裁剪:
from datafusion import SessionConfig
cfg = SessionConfig().with_information_schema(True).with_parquet_pruning(True)
六、CSV 读取选项
CSV 读取通过表函数或会话配置控制,常见项:
| 配置项 / 参数 | 实测默认值 | 含义 |
|---|---|---|
datafusion.catalog.has_header | true | 默认 CSV 是否含表头 |
datafusion.catalog.newlines_in_values | false | 字段值是否允许跨行 |
has_header | — | register_csv(..., has_header=True) 指定 |
delimiter | , | 字段分隔符 |
schema_infer_max_records | — | 推断 schema 时采样的最大记录数 |
CLI 建外部表时需用 OPTIONS 指定表头(新语法):
CREATE EXTERNAL TABLE employees STORED AS CSV
LOCATION '/root/employees.csv'
OPTIONS ('format.has_header' 'true');
七、datafusion-cli 命令行参数
以下为 datafusion-cli --help 实测输出:
| 参数 | 默认 | 含义 |
|---|---|---|
-p, --data-path <DATA_PATH> | 当前目录 | 数据文件基准目录(相对路径解析依据) |
-b, --batch-size <BATCH_SIZE> | 引擎默认 | 每次查询的批大小,覆盖 datafusion.execution.batch_size |
-c, --command [<COMMAND>...] | — | 执行给定命令串后退出 |
-f, --file [<FILE>...] | — | 执行文件中的命令后退出 |
-r, --rc [<RC>...] | ~/.datafusionrc | 启动时加载的脚本 |
-m, --memory-limit <MEMORY_LIMIT> | 无限制 | 内存池上限,如 10g |
-d, --disk-limit <DISK_LIMIT> | 100g | 溢写可用磁盘空间 |
--mem-pool-type <TYPE> | greedy | 内存池类型 greedy/fair |
--format <FORMAT> | automatic | 输出格式 csv/tsv/table/json/nd-json/automatic |
-q, --quiet | 关闭 | 仅输出结果 |
--maxrows <MAXROWS> | 40 | 表格格式显示的最大行数 |
--color | 关闭 | 控制台语法高亮 |
--top-memory-consumers <N> | 3 | 内存耗尽时显示的内存消费者数量 |
--object-store-profiling <MODE> | disabled | 对象存储剖析 disabled/summary/trace |
-b 会直接改变会话配置,实测:
$ datafusion-cli -q -b 4096 -c "SHOW datafusion.execution.batch_size;"
| datafusion.execution.batch_size | 4096 |
八、配置的设置方式
8.1 SQL SET 语句
$ datafusion-cli -q -c "SET datafusion.execution.target_partitions = 2;" \
-c "SHOW datafusion.execution.target_partitions;"
| datafusion.execution.target_partitions | 2 |
8.2 Python SessionConfig
from datafusion import SessionConfig, SessionContext
cfg = (SessionConfig()
.with_information_schema(True)
.with_batch_size(2048)
.with_target_partitions(4)
.set("datafusion.execution.parquet.pushdown_filters", "true"))
ctx = SessionContext(cfg)
SessionConfig 提供 with_batch_size、with_target_partitions、with_information_schema、with_parquet_pruning、with_repartition_* 等便捷方法,其余参数用通用 set("<dotted.key>", "<value>")。
九、常用参数默认值速查
| 参数 | 实测默认值 |
|---|---|
| datafusion.execution.batch_size | 8192 |
| datafusion.execution.target_partitions | 12 |
| datafusion.execution.planning_concurrency | 12 |
| datafusion.execution.coalesce_batches | true |
| datafusion.execution.enable_ansi_mode | false |
| datafusion.execution.parquet.compression | zstd(3) |
| datafusion.execution.parquet.enable_page_index | true |
| datafusion.execution.parquet.pushdown_filters | false |
| datafusion.optimizer.enable_topk_aggregation | true |
| datafusion.optimizer.enable_round_robin_repartition | true |
| datafusion.optimizer.enable_piecewise_merge_join | false |
| datafusion.catalog.has_header | true |
| datafusion.sql_parser.dialect | generic |
| datafusion.runtime.memory_limit | 空(无限制) |