- 大数据
- 数据库
- 后端
【免费下载链接】presto
The official home of the Presto distributed SQL query engine for big data
导读
本文以 Presto 仓库中 presto-docs/src/main/sphinx/presto_cpp/properties-session.rst 为骨架,系统讲解基于 C++ 的原生执行引擎(Prestissimo / Presto C++,底层使用 Meta 的 Velox 向量化引擎)所支持的全部原生会话属性。这些属性通过 Java Coordinator 的 SQL 会话透传到 C++ Worker,在单条查询粒度上控制 driver 调度、时间语义、聚合/连接/排序的磁盘溢写、内存仲裁、表达式求值、调试与查询追踪、输出缓冲、writer 缩放以及 RPC 限流等行为。读完本文,你将掌握每个属性的类型、默认值、适用场景与设置方式,并理解其在源码中的注册与映射机制,能够针对大查询溢写、慢查询调试、高延迟后端等场景做出正确的调优决策。
一、背景:什么是 Presto C++ 原生会话属性
Presto 的 C++ 原生执行引擎(代码位于 presto-native-execution/presto_cpp)使用 Velox 作为 Worker 端查询执行引擎,与 Java 版 Worker 在底层行为上存在差异,因此引入了大量以native_前缀命名的会话属性。这些属性:
- 只作用于原生执行路径,Java Worker 会忽略或本就不适用;
- 由 Java Coordinator 侧以系统会话属性的形式暴露(见 NativeWorkerSessionPropertyProvider.java),用户通过 SQL 会话下发;
- 在 C++ 侧由
SessionProperties单例统一注册,并映射到 Velox 的QueryConfig(见 SessionProperties.cpp)。
从源码结构看,SessionPropertiesProvider::hasVeloxConfig对未显式注册的属性名也返回true(见 SessionPropertiesProvider.h),意味着 Coordinator 下发的未知原生属性会继续透传给 Velox 的查询配置,由 Velox 引擎侧直接消费,例如本文中的native_aggregation_spill_memory_threshold、native_join_spill_memory_threshold、native_order_by_spill_memory_threshold等内存阈值属性即走此路径。
使用方式
与 Presto 普通系统会话属性一致,可通过 SQL 客户端设置,例如:
-- 为当前会话启用 join 溢写 SET SESSION native_join_spill_enabled = true; -- 设置聚合溢写阈值(字节) SET SESSION native_aggregation_spill_memory_threshold = 268435456; -- 开启查询追踪 SET SESSION native_query_trace_enabled = true;也可以在 JDBC/CLI 的--session参数中传递,实现单条查询级别的独立控制。
二、驱动调度与时间语义
driver_cpu_time_slice_limit_ms
- 类型:
integer - 默认值:
1000
仅原生执行生效。定义了一个 driver 线程在必须让出 CPU 给其他线程之前被允许运行的最大 CPU 时间(毫秒),用于在多个线程之间实现公平的 CPU 使用。
- 正值强制该上限,确保线程不会独占 CPU 资源;
- 负值被视为无效,回退到系统默认值(此处为
1000ms); - 设置为
0允许线程无限期运行而不让出,在共享环境中不推荐,可能导致资源争用。
从源码看,该属性在 SessionProperties.cpp 中注册,默认值被显式覆盖为1000ms,以与 Presto Java 行为对齐(源码注释明确说明 "Set it to 1 second to be aligned with Presto Java")。它映射到 Velox 的QueryConfig::kDriverCpuTimeSliceLimitMs。
legacy_timestamp
- 类型:
boolean - 默认值:
true
仅原生执行生效。使用 legacy 的TIME与TIMESTAMP语义。当为true时,Coordinator 期望不带时区的TIMESTAMP转换使用用户会话时区。源码中该属性映射到 Velox 的kAdjustTimestampToTimezone,并注释说明其默认值覆盖为false的原因:Coordinator 侧legacy_timestamp默认值为true(见 SessionProperties.cpp)。
legacy_timestamp_with_timezone
- 类型:
boolean - 默认值:
true
当为true时,TIMESTAMP WITH TIME ZONE值以每个值自身内嵌的时区渲染;当为false时,以会话时区渲染 UTC 时刻,因此比较相等的值会渲染得完全一致。映射到 Velox 的kLegacyTimestampWithTimezone。
三、聚合与内存压缩
native_max_partial_aggregation_memory
- 类型:
bigint - 默认值:
16777216(16 MB)
仅原生执行生效。定义当数据缩减(data reduction)效果不佳时,部分聚合(partial aggregation)可使用的最大内存。
native_max_extended_partial_aggregation_memory
- 类型:
bigint - 默认值:
67108864(64 MB)
仅原生执行生效。当数据缩减效果良好时,部分聚合的最大内存。即使达到了native_max_partial_aggregation_memory的限制,只要部分聚合达成了良好的数据缩减,也会分配更多内存。
两个属性分别映射到 Velox 的kMaxPartialAggregationMemory与kMaxExtendedPartialAggregationMemory(见 SessionProperties.cpp)。
native_aggregation_spill_memory_threshold
- 类型:
integer - 默认值:
0
仅原生执行生效。指定最终聚合操作在开始向磁盘溢写之前可以使用的最大内存(字节)。如果设置为0,则表示无限制,允许聚合消耗无限内存资源,这可能影响系统性能。该属性未在SessionProperties.cpp中显式注册,而是透传给 Velox 查询配置由引擎侧消费。
聚合内存压缩(Aggregation Compaction)三件套
以下三个属性用于优化全局聚合阶段字符串状态的内存回收,目前源码注释表明仅适用于approx_most_frequent聚合函数的StringView类型(见 SessionProperties.h)。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_aggregation_compaction_bytes_threshold | bigint | 0 | 触发全局聚合字符串压缩的内存阈值(字节)。当总字符串存储超过该值且未使用内存比例较高时,触发压缩以回收死字符串。默认0表示禁用。 |
native_aggregation_compaction_unused_memory_ratio | double | 0.25 | 触发压缩的未使用(已逐出)字节占总字节的比例,取值范围[0, 1)。 |
native_aggregation_memory_compaction_reclaim_enabled | boolean | false | 若为true,在聚合内存回收期间、溢写之前启用轻量内存压缩;聚合算子会先尝试压缩聚合函数状态(例如释放死字符串)再诉诸溢写。 |
四、磁盘溢写(Spilling)体系
溢写是原生引擎应对大查询内存超限的关键机制。Worker 级总开关spill-enabled、max-spill-bytes等见 properties.rst,而下面的会话属性用于在单查询粒度精细控制各类算子的溢写行为。
各算子溢写开关
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_join_spill_enabled | boolean | true | 启用原生引擎的 join 溢写。 |
native_row_number_spill_enabled | boolean | true | 启用 row number 溢写。 |
native_mark_distinct_spill_enabled | boolean | false | 启用 mark distinct 溢写。 |
native_topn_row_number_spill_enabled | boolean | true | 启用 topN row number 溢写。 |
native_window_spill_enabled | boolean | true | 启用窗口函数溢写。 |
native_writer_spill_enabled | boolean | true | 启用 writer(写出)溢写。 |
上述开关在 SessionProperties.cpp 中注册,并分别映射到 Velox 对应的QueryConfig键。
各算子内存阈值
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_join_spill_memory_threshold | integer | 0 | hash join 开始溢写前可使用的最大内存(字节)。0表示无限制。 |
native_order_by_spill_memory_threshold | integer | 0 | ORDER BY开始溢写前可使用的最大内存(字节)。0表示无限制,可能导致排序占用大量内存。 |
溢写文件与 IO 控制
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_join_spiller_partition_bits | integer | 2 | 用于计算 hash join 与 RowNumber 溢写分区数的位数 N,分区数为2的 N 次幂。 |
native_max_spill_bytes | bigint | 107374182400(100 GB) | 允许的最大溢写字节数。 |
native_max_spill_file_size | integer | 0 | 单个溢写文件的最大字节数。0表示无限制,溢写文件可根据磁盘空间尽量增长。用于管理溢写期间的磁盘占用。 |
native_max_spill_level | integer | 4 | hash join build 允许的最大溢写层级。0为初始溢写层级,-1表示无限制。 |
native_spill_compression_codec | varchar | none | 溢写数据的压缩 CODEC。支持:ZLIB、SNAPPY、LZO、ZSTD、LZ4、GZIP;设为none禁用压缩。 |
native_spill_write_buffer_size | bigint | 1048576(1 MB) | 序列化溢写数据落盘前缓冲的最大字节数,以提升 IO 效率。0表示禁用缓冲。 |
native_spill_file_create_config | varchar | "" | 创建溢写文件时传给底层文件系统的自由格式配置(如文件位置、大小限制、文件系统特定优化)。 |
native_aggregation_spill_file_create_config | varchar | "" | 聚合算子溢写文件创建配置,覆盖native_spill_file_create_config;为空时沿用后者。 |
native_hash_join_spill_file_create_config | varchar | "" | hash join build 与 probe 算子溢写文件创建配置,覆盖native_spill_file_create_config;为空时沿用后者。 |
注意:
native_aggregation_spill_file_create_config与native_hash_join_spill_file_create_config允许针对聚合和 join 分别定制溢写文件创建参数,这在混合工作负载下非常实用。
溢写排序(Spill Sort)
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_spill_prefixsort_enabled | boolean | false | 溢写时启用 prefix sort 而非std::sort。prefix sort 更快,但需要内存构建归一化前缀键,存在耗尽服务器内存的风险。 |
native_prefixsort_normalized_key_max_bytes | integer | 128 | prefix-sort 中归一化键可用的最大字节数。设为0禁用 prefix-sort。 |
native_prefixsort_min_rows | integer | 130 | 使用 prefix-sort 的最小行数。默认值来自微基准测试(见 SessionProperties.cpp)。 |
TopNRowNumber 放弃(Abandon)机制
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_abandon_partial_topn_row_number_min_rows | integer | 100000 | 部分TopNRowNumber算子累计多少行后开始检查是否放弃。必须大于0。 |
native_abandon_partial_topn_row_number_min_pct | integer | 80 | 部分TopNRowNumber算子仍保留的累计输入行百分比达到或超过该值时,算子被放弃并退化为直通(pass-through)。仅在累计满native_abandon_partial_topn_row_number_min_rows行后检查。取值必须在0到100之间。 |
五、表达式求值控制
native_simplified_expression_evaluation_enabled
- 类型:
boolean - 默认值:
false
仅原生执行生效。启用表达式求值的简化路径。这是SessionProperties中注册的第一个属性(见 SessionProperties.h),映射到 Velox 的kExprEvalSimplified。
native_expression_max_array_size_in_reduce
- 类型:
integer - 默认值:
100000
仅原生执行生效。reduce(array, initialState S, inputFunction(S,T,S), outputFunction(S,R)) -> R函数遇到大于该值的数组时会抛出错误,用于防御超大规模数组带来的计算爆炸。
native_expression_max_compiled_regexes
- 类型:
integer - 默认值:
100
仅原生执行生效。控制每个正则表达式函数实例、每条执行线程可缓存的最大已编译正则模式数量。
六、调试类属性(Debug)
以下属性主要用于定位算子输出、表达式求值与内存分配问题,开启后有明显性能开销,仅建议在调试场景使用。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_debug_validate_output_from_operators | boolean | false | 为true时,任务执行期间会校验每个算子输出的向量一致性,可帮助定位畸形向量导致的失败或崩溃。开销昂贵,仅限调试。 |
native_debug_disable_expression_with_peeling | boolean | false | 禁用表达式求值中从输入剥离公共 dictionary 层的优化。仅调试用途。 |
native_debug_disable_common_sub_expressions | boolean | false | 禁用表达式求值中复用公共子表达式缓存结果的优化。仅调试用途。 |
native_debug_disable_expression_with_memoization | boolean | false | 禁用表达式求值中在后续输入批次之间复用缓存结果的优化(针对 dictionary 编码且具有相同字母表/底层 flat vector 的批次)。仅调试用途。 |
native_debug_disable_expression_with_lazy_inputs | boolean | false | 禁用表达式求值中延迟加载 lazy 输入的优化。仅调试用途。 |
native_debug_memory_pool_name_regex | varchar | "" | 用于匹配内存池名称的正则表达式,匹配的池会进行分配调用点(callsite)追踪,并在销毁时执行泄漏检查。空字符串禁用追踪。仅调试用途。 |
native_debug_memory_pool_warn_threshold_bytes | bigint | 0 | 内存池分配的告警阈值,超过时记录调用点。需要先用native_debug_memory_pool_name_regex启用分配追踪。接受B/KB/MB/GB单位,设为0B禁用。仅调试用途。 |
native_selective_nimble_reader_enabled | boolean | false | 临时开关,控制本次查询是否使用 selective Nimble reader。源码注释说明该属性会在 selective Nimble reader 完全推出后被移除(见 SessionProperties.h)。 |
源码中这些调试属性统一注册于 SessionProperties.cpp,一一映射到 Velox 的对应QueryConfig键。
七、查询追踪(Query Trace)
查询追踪用于在查询执行期间生成 trace 数据,可配合TraceReplayer重放定位问题。开启后需与native_query_trace_node_id、native_query_trace_max_bytes、native_query_trace_fragment_id、native_query_trace_shard_id配合以匹配要追踪的 task(见 SessionProperties.h)。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_query_trace_enabled | boolean | false | 启用查询追踪,trace 数据随查询执行生成。 |
native_query_trace_dir | varchar | "" | trace 文件的存储位置。 |
native_query_trace_node_id | varchar | "" | 要追踪输入数据的计划节点 id。 |
native_query_trace_max_bytes | integer | 0 | 最大 trace 字节数限制;为0时禁用追踪。 |
native_query_trace_fragment_id | varchar | .* | 要追踪的 fragment id;未指定时匹配所有 fragment。 |
native_query_trace_shard_id | varchar | .* | 要追踪的 shard id;未指定时匹配所有 shard。 |
native_op_trace_directory_create_config | varchar | "" | 创建算子 trace 目录时传给底层文件系统的自由格式配置。 |
八、输出缓冲与数据交换
native_max_output_buffer_size
- 类型:
bigint - 默认值:
33554432(32 MB)
task 缓冲输出的最大字节数,缓冲在所有 driver 之间共享。
native_max_page_partitioning_buffer_size
- 类型:
bigint - 默认值:
33554432(32 MB)
每个PartitionedOutput算子的最大缓冲字节数,用于避免产生过小的SerializedPage。对于PartitionedOutputNode::Kind::kPartitioned,算子在为每个目标产出SerializedPage前,每个目标最多缓冲 该值除以目标数 的字节(见 SessionProperties.h)。
native_partitioned_output_eager_flush
- 类型:
boolean - 默认值:
false
仅原生执行生效。为true时,PartitionedOutput算子会急切地刷出行,而不等待缓冲达到一定大小。
native_max_local_exchange_partition_count
- 类型:
bigint - 默认值:
4294967296
本地交换(local exchange)创建的最大分区数,影响包含LocalPartitionNode的管线的并发度。
native_request_data_sizes_max_wait_sec
- 类型:
integer - 默认值:
10
exchange long poll 请求的最大等待时间(秒)。注意它与 Worker 配置属性exchange.http-client.request-data-sizes-max-wait-sec(见 properties.rst)作用类似,但以会话属性形式提供。
九、Streaming 聚合与 MergeJoin 输出批次
native_streaming_aggregation_min_output_batch_rows
- 类型:
integer - 默认值:
0
流式聚合中,等到输出行数达到该值指定的批次大小后才产出批次。若为0,则以Operator::outputBatchRows作为最小输出批次行数。
native_merge_join_output_batch_start_size
- 类型:
integer - 默认值:
0
仅原生执行生效。MergeJoin算子的初始输出批次大小(行)。非零时批次大小从此值开始,并根据之前输出批次的平均行大小动态调整;为零(默认)时禁用动态调整,批次大小固定为preferred_output_batch_rows(见 SessionProperties.h)。
十、Writer 缩放(Scaled Writer)
以下属性用于控制表写入阶段的 writer 动态缩放与倾斜分区重平衡(scale writer exchange),适用于写入大结果集的场景。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_scaled_writer_rebalance_max_memory_usage_ratio | double | 0.7 | 查询已用内存与其最大容量之比的上限。当查询当前内存使用超过该比例时,scale writer exchange 停止扩展 writer 处理。取值范围(0, 1]。 |
native_scaled_writer_max_partitions_per_writer | integer | 128 | 单个表 writer 线程可分配的最大逻辑表分区数。多个物理表分区可基于分区 id 的哈希值映射到同一逻辑分区。 |
native_scaled_writer_min_partition_processed_bytes_rebalance_threshold | bigint | 134217728(128 MB) | 逻辑表分区被检测为过载时,触发 writer 缩放所需的最小已处理数据量。 |
native_scaled_writer_min_processed_bytes_rebalance_threshold | bigint | 268435456(256 MB) | 所有逻辑表分区已处理的数据量达到该值后,触发倾斜分区重平衡的最小阈值。 |
表扫描缩放
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_table_scan_scaled_processing_enabled | boolean | false | 为true时,启用每个 Worker 上表扫描并发的动态缩放。 |
native_table_scan_scale_up_memory_usage_ratio | double | 0.7 | 可用于表扫描扩展的可用内存比例。较高值允许为表扫描扩展分配更多内存,较低值则限制内存使用。取值范围[0, 1]。 |
十一、RPC 限流(Rate Limiter)与拥塞控制
这一组属性面向基于 RPC 的高延迟后端(如 LLM 推理后端)场景,通过自适应限流保护共享且限速的后端服务。
native_rpc_ratelimiter_adaptive_enabled
- 类型:
boolean - 默认值:
true
仅原生执行生效。启用基于后端速率限制/超时过载信号的逐层(per-tier)自适应 RPC 限流器(AIMD:加性增、乘性减)。启用后限流器会根据后端过载信号自动调整每层 max-pending 上限。默认开启(对共享、限速的推理后端具有保护作用);设为false则保持由native_rpc_ratelimiter_max_limit定义的静态上限。
native_rpc_ratelimiter_min_limit
- 类型:
bigint - 默认值:
50
仅原生执行生效。自适应 RPC 限流器每层 max-pending 上限的下限。即使在持续过载下,限流器也不会将每层上限收缩到低于此值。默认50;若设为1,在持续限流下可能停滞。仅在native_rpc_ratelimiter_adaptive_enabled为true时生效。
native_rpc_ratelimiter_decrease_factor
- 类型:
double - 默认值:
0.5
仅原生执行生效。每次过载类 drain 时对自适应 RPC 限流器每层 max-pending 上限应用的乘性减因子。例如默认0.5表示每次过载时上限减半。仅在启用自适应限流时生效。
native_rpc_ratelimiter_max_limit
- 类型:
bigint - 默认值:
200
仅原生执行生效。每层 RPC 限流器 max-pending 上限的天花板。正常条件下自适应限流器将每层上限增长到该值,过载时从此值收缩。默认200,为 LLM 推理后端验证过的值;设为0回退到内置默认值20。受准入控制的调度使该上限实际生效。仅在启用自适应限流时生效;将自适应限流设为false可保持以该值为静态上限。
native_rpc_congestion_max_window
- 类型:
bigint - 默认值:
0
仅原生执行生效。每 driver RPC 拥塞窗口的上限。为0(默认)时使用各模式的内置值:PER_ROW模式默认100,BATCH模式默认256。对于高延迟后端,可调大该值让受准入控制的调度以高并发运行。拥塞窗口控制每个 driver 可同时在途的 RPC 请求数。
十二、任务调度、内存仲裁与算子行为
native_query_memory_reclaimer_priority
- 类型:
integer - 默认值:
2147483647
查询在内存池 reclaimer 中的优先级,值越小优先级越高。用于全局仲裁的受害者选择(victim selection)。
native_max_num_splits_listened_to
- 类型:
integer - 默认值:
0
原生 Worker 上每个表扫描节点的SplitListener最多监听的 split 数。该属性在 SessionProperties.cpp 中注册时hidden标记为true。
native_max_split_preload_per_driver
- 类型:
integer - 默认值:
0
每个 driver 最多预加载的 split 数。设为0禁用预加载。与 Worker 配置属性driver.max-split-preload(默认2,见 properties.rst)作用类似,但以会话属性形式按查询控制。
Index Join 与 Unnest 输出控制
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
native_index_lookup_join_max_prefetch_batches | integer | 0 | 为提前执行 index lookup 而预取的输入批次最大数量。为零则一次只处理一个输入批次。 |
native_index_lookup_join_split_output | boolean | true | 为true时,index join 算子可能基于输出批次大小控制为每个输入批次拆分输出;否则尝试为每个输入批次产出单个输出。 |
native_unnest_split_output | boolean | true | 为true时,unnest 算子可能基于输出批次大小控制为每个输入批次拆分输出;否则为每个输入批次产出单个输出。 |
native_use_velox_geospatial_join
- 类型:
boolean - 默认值:
true
为true时,protocol::SpatialJoinNode被转换为velox::core::SpatialJoinNode;否则被转换为velox::core::NestedLoopJoinNode。该属性在 SessionProperties.cpp 中以硬编码默认值"true"注册,没有对应的 Velox 配置键。
十三、优化器会话属性:optimizer.optimize_top_n_rank
- 类型:
boolean - 默认值:
false
为true时,针对rank()与dense_rank()窗口函数的n行 filter + limit 查询,将使用专门的TopNRowNumber算子执行,而非WindowFunction算子。TopNRowNumber算子具有流式行为,无需缓冲全部输入行,因此比窗口算子更高效(见 properties-session.rst)。该优化仅在 Presto C++ 上适用(对应运行时只在 C++ 侧存在),Coordinator 侧对应的 Worker 配置属性为optimizer.optimize-top-n-rank(见 properties.rst)。
十四、源码级实现机制:属性如何注册与映射
1. 单一事实来源(Source of Truth)
SessionProperties类被设计为原生会话属性的"唯一事实来源",用于与 Java 版会话属性区分,并将原生会话属性映射到 Velox(见 SessionProperties.h 的类注释)。所有属性名以static constexpr const char*常量定义,例如:
static constexpr const char* kJoinSpillEnabled = "native_join_spill_enabled"; static constexpr const char* kMaxSpillBytes = "native_max_spill_bytes"; static constexpr const char* kDriverCpuTimeSliceLimitMs = "driver_cpu_time_slice_limit_ms";2. 注册过程:默认值取自 Velox QueryConfig
在SessionProperties构造函数中,通过创建一个空的QueryConfig c{{}}获取 Velox 侧各配置的默认值,再调用addSessionProperty注册(见 SessionProperties.cpp)。注册时同时记录:
- 属性名、描述、类型签名与默认值(元数据,通过
protocol::SessionPropertyMetadata暴露给 Coordinator); - 映射到的 Velox 配置键(
veloxConfig); - 当前值。
SessionProperty类(见 SessionPropertiesProvider.h)持有上述信息,并通过updateValue在会话创建时更新为 Coordinator 下发的值。
3. 映射到 Velox 配置
SessionPropertiesProvider::toVeloxConfig将原生属性名翻译为对应的 Velox 配置名;hasVeloxConfig判断属性是否有对应 Velox 配置(见 SessionPropertiesProvider.h)。绝大多数属性都映射到velox::core::QueryConfig的键,例如native_join_spill_enabled→kJoinSpillEnabled、native_spill_compression_codec→kSpillCompressionKind。
4. 测试验证
仓库中的 SessionPropertiesTest.cpp 通过validateMapping测试,用一张包含全部"会话属性 → Velox 配置"的期望映射表逐一断言toVeloxConfig的返回值,保证任何新增/改名都不会破坏映射关系。
5. Java 侧一致性
Coordinator 侧 NativeWorkerSessionPropertyProvider.java 以常量形式定义了同名的原生会话属性(如NATIVE_JOIN_SPILL_ENABLED = "native_join_spill_enabled"),作为 Java 与 C++ 两侧属性名对齐的桥梁。会话属性经 Coordinator 序列化后随查询计划下发到 C++ Worker,Worker 在创建 Velox 查询上下文(QueryContext)时应用这些值。
十五、配置注意事项与最佳实践
- 与 Worker 配置属性的关系:会话属性按查询粒度生效;如果需要集群级统一默认值,应优先在 Worker 的 config.properties 中设置对应的配置属性(详见 properties.rst)。
- 溢出场景:处理超大聚合/连接时,建议确认 Worker 侧
spill-enabled=true,再按需调小native_join_spill_memory_threshold、native_aggregation_spill_memory_threshold、native_order_by_spill_memory_threshold,并配合native_max_spill_bytes控制总溢写量、native_spill_compression_codec节省磁盘 IO。 - 调试场景:优先使用
native_debug_validate_output_from_operators定位畸形向量;使用native_debug_memory_pool_name_regex配合native_debug_memory_pool_warn_threshold_bytes定位内存分配调用点。注意这些检查开销大,生产环境应关闭。 - 高延迟 RPC 后端:保持
native_rpc_ratelimiter_adaptive_enabled=true以自动适应后端过载;如后端延迟高、希望提高并发,可调大native_rpc_ratelimiter_max_limit与native_rpc_congestion_max_window。 - 时间语义:
legacy_timestamp与legacy_timestamp_with_timezone影响TIMESTAMP的渲染与时区转换方式,跨时区数据对比不一致时优先检查这两项。 - 查询追踪:开启
native_query_trace_enabled后必须同时设置native_query_trace_dir与native_query_trace_node_id(必要时配合 fragment/shard id),trace 数据可用TraceReplayer重放;native_query_trace_max_bytes用于限制 trace 体积。
结语
Presto C++ 原生会话属性覆盖了从 driver 公平调度(driver_cpu_time_slice_limit_ms)、时间语义、聚合/连接/排序溢写、表达式求值、调试与追踪,到 writer 缩放与 RPC 限流的完整运行时控制面。理解这些属性的类型、默认值与底层映射(SessionProperties→ VeloxQueryConfig),是在生产环境中充分发挥 Velox 原生引擎性能、定位疑难问题的基础。建议在实际调优时结合 properties-session.rst 与 properties.rst 两篇文档,并参考 SessionPropertiesTest.cpp 理解属性映射的完整性约束。
- 大数据
- 数据库
- 后端
【免费下载链接】presto
The official home of the Presto distributed SQL query engine for big data
相关推荐
Presto Session Properties 完全指南:从 SET SESSION 到源码级调优实践
Presto Session Properties 完全指南:从 SET SESSION 到源码级调优实践 导读 本文以 properties session.
大数据数据库后端Presto 0.78 版本解读:Hive 连接器原生 ARRAY/MAP 类型与 Session Properties 会话属性机制
Presto 0.78 版本解读:Hive 连接器原生 ARRAY/MAP 类型与 Session Properties 会话属性机制 导读 Presto 0.
大数据数据库后端Presto C++(Prestissimo)配置属性完全指南:Coordinator 与 Worker 参数详解
Presto C++(Prestissimo)配置属性完全指南:Coordinator 与 Worker 参数详解 Presto C++(又称 Prestiss
大数据数据库后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考