Apache DataFusion 配置参数详解

系统讲解 Apache DataFusion 的配置体系与参数取值,涵盖 SessionConfig 执行参数、批大小与分区数、优化器开关、内存池、Parquet/CSV 读写选项及 datafusion-cli 参数速查。

Apache DataFusionApache DataFusion2026/10/11

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_batchestrue合并小批次以减少批次数量、提升吞吐
datafusion.execution.collect_statisticstrue收集列统计信息用于优化
datafusion.execution.planning_concurrency12物理计划生成阶段的并发度
datafusion.execution.enable_ansi_modefalse是否启用 ANSI SQL 语义(如整数溢出报错)
datafusion.execution.sort_in_place_threshold_bytes1048576排序数据小于该字节数时原地排序
datafusion.execution.hash_join_buffering_capacity0Hash Join 缓冲容量(0 表示自适应)
datafusion.execution.enforce_batch_size_in_joinsfalse是否强制 Join 输入批次大小一致

三、优化器开关

优化器开关位于 datafusion.optimizer.*,常用项如下:

配置项实测默认值含义
datafusion.optimizer.enable_topk_aggregationtrue将 GROUP BY + ORDER BY + LIMIT 改写为 TopK 聚合
datafusion.optimizer.enable_round_robin_repartitiontrue对扫描等操作使用轮询重分区
datafusion.optimizer.enable_sort_pushdowntrue下推排序到扫描算子
datafusion.optimizer.enable_join_dynamic_filter_pushdowntrueJoin 动态过滤下推
datafusion.optimizer.enable_piecewise_merge_joinfalse启用分段归并 Join(默认关闭)
datafusion.optimizer.hash_join_single_partition_threshold1048576小于该字节数时 Hash Join 退化为单分区
datafusion.optimizer.filter_null_join_keysfalse是否过滤 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|fair
    • greedy(默认):各消费者按需抢占,实现简单;
    • 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 参数或 SQL SET 设置。

五、Parquet 读写选项

位于 datafusion.execution.parquet.*,常用项:

配置项实测默认值含义
datafusion.execution.parquet.compressionzstd(3)写入压缩算法与级别
datafusion.execution.parquet.enable_page_indextrue启用页索引以加速谓词下推
datafusion.execution.parquet.pushdown_filtersfalse将过滤下推到 Parquet 解码层
datafusion.execution.parquet.reorder_filtersfalse重排过滤器以提升选择性
datafusion.execution.parquet.pruningtrue基于统计信息裁剪行组
datafusion.execution.parquet.dictionary_enabledtrue启用字典编码
datafusion.execution.parquet.statistics_enabledpage统计信息粒度(page/rowgroup)
datafusion.execution.parquet.max_row_group_size1048576单个 Row Group 最大行数
datafusion.execution.parquet.data_pagesize_limit1048576单个数据页字节上限
datafusion.execution.parquet.write_batch_size1024写入批次大小
datafusion.execution.parquet.writer_version1.0Parquet 写入版本

在 Python 中可开启裁剪:

from datafusion import SessionConfig
cfg = SessionConfig().with_information_schema(True).with_parquet_pruning(True)

六、CSV 读取选项

CSV 读取通过表函数或会话配置控制,常见项:

配置项 / 参数实测默认值含义
datafusion.catalog.has_headertrue默认 CSV 是否含表头
datafusion.catalog.newlines_in_valuesfalse字段值是否允许跨行
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_size8192
datafusion.execution.target_partitions12
datafusion.execution.planning_concurrency12
datafusion.execution.coalesce_batchestrue
datafusion.execution.enable_ansi_modefalse
datafusion.execution.parquet.compressionzstd(3)
datafusion.execution.parquet.enable_page_indextrue
datafusion.execution.parquet.pushdown_filtersfalse
datafusion.optimizer.enable_topk_aggregationtrue
datafusion.optimizer.enable_round_robin_repartitiontrue
datafusion.optimizer.enable_piecewise_merge_joinfalse
datafusion.catalog.has_headertrue
datafusion.sql_parser.dialectgeneric
datafusion.runtime.memory_limit空(无限制)