Flink-Table 配置(十一)

默认情况下,Table&SQL API是预配置的,用于生成具有可接受性能的准确结果。

根据表程序的要求,可能需要调整某些参数以进行优化。例如,无边界的流程序可能需要确保所需的状态大小是有上限的(请参阅流概念)。

目录

概述

执行选项

优化器选项

概述

在每个表环境中,TableConfig都提供配置当前会话的选项。
对于常见或重要的配置选项,TableConfig为getter和setters方法提供了详细的内联文档。
对于更高级的配置,用户可以直接访问底层的键值映射。以下部分列出了可用于调整Flink Table&SQL API程序的所有可用选项。
注意:由于在执行操作时在不同的时间点读取选项,建议在实例化表环境后尽早设置配置选项。

// instantiate table environment
TableEnvironment tEnv = ...

// access flink configuration
Configuration configuration = tEnv.getConfig().getConfiguration();
// set low-level key-value options
configuration.setString("table.exec.mini-batch.enabled", "true");
configuration.setString("table.exec.mini-batch.allow-latency", "5 s");
configuration.setString("table.exec.mini-batch.size", "5000");

注意:当前,键值选项仅支持Blink planner。 

执行选项

以下选项可用于优化查询执行的性能。

KeyDefaultDescription

table.exec.async-lookup.buffer-capacity

Batch Streaming
100

异步查找联接可以触发的最大异步i/o操作数。

able.exec.async-lookup.timeout

Batch Streaming
"3 min"

异步操作完成的异步超时。

able.exec.disabled-operators

Batch
(none)主要用于测试。运算符名称的逗号分隔列表,每个名称表示一种禁用的运算符。可以禁用的运算符包括“NestedLoopJoin”、“ShuffleHashJoin”、“BroadcastHashJoin”、“SortMergeJoin”、“HashAgg”、“SortAgg”。默认情况下,不禁用任何运算符。

table.exec.mini-batch.allow-latency

Streaming
"-1 ms"最大延迟可用于小批量缓冲输入记录。MiniBatch是一种缓冲输入记录以减少状态访问的优化。当达到最大缓冲记录数时,将以允许的延迟间隔触发MiniBatch。注意:如果table.exec.mini-batch.enabled设置为true,则其值必须大于零。

able.exec.mini-batch.enabled

Streaming
false指定是否启用小批量优化。MiniBatch是一种缓冲输入记录以减少状态访问的优化。这在默认情况下是禁用的。要启用此功能,用户应将此配置设置为true。注意:如果启用了小批量,则必须设置“table.exec.mini batch.allow latency”和“table.exec.mini batch.size”。

table.exec.mini-batch.size

Streaming
-1可以为MiniBatch缓冲的最大输入记录数。MiniBatch是一种缓冲输入记录以减少状态访问的优化。当达到最大缓冲记录数时,将以允许的延迟间隔触发MiniBatch。注意:MiniBatch当前仅适用于非窗口聚合。如果table.exec.mini-batch.enabled设置为true,则其值必须为正。

table.exec.resource.default-parallelism

Batch Streaming
-1设置所有要与并行实例一起运行的运算符(例如聚合、联接、筛选器)的默认并行度。此配置的优先级高于StreamExecutionEnvironment的并行性(实际上,此配置会覆盖StreamExecutionEnvironment的并行性)。值-1表示未设置默认并行性,然后它将回退以使用StreamExecutionEnvironment的并行性。

table.exec.resource.external-buffer-memory

Batch
"10 mb"设置“排序合并联接”、“嵌套联接”和“覆盖”窗口中使用的外部缓冲区内存大小。

table.exec.resource.hash-agg.memory

Batch
"128 mb"设置哈希聚合运算符的托管内存大小。

able.exec.resource.hash-join.memory

Batch
"128 mb"设置哈希联接运算符的托管内存。它定义了下限。

table.exec.resource.sort.memory

Batch
"128 mb"设置排序运算符的托管缓冲区内存大小。

table.exec.shuffle-mode

Batch
"batch"设置执行洗牌模式。只能设置批处理或管道。批处理:作业将逐步运行。管道:作业将以流模式运行,但当发送方持有资源等待向接收方发送数据时,接收方等待资源启动可能会导致资源死锁。

table.exec.sort.async-merge-enabled

Batch
true

是否异步合并已排序的溢出文件。

table.exec.sort.default-limit

-1当用户未在order by之后设置限制时的默认限制。-1表示忽略此配置。

table.exec.sort.max-num-file-handles

Batch
128外部合并排序的最大扇入。它限制每个操作员的文件句柄数。如果太小,可能会导致中间合并。但如果太大,会导致同时打开的文件太多,消耗内存,导致随机读取。

table.exec.source.idle-timeout

Streaming
"-1 ms"当一个源在超时时间内没有接收到任何元素时,它将被标记为临时空闲。这允许下游任务在水印空闲时无需等待来自此源的水印就可以推进其水印。

table.exec.spill-compression.block-size

Batch
"64 kb"溢出数据时用于压缩的内存大小。内存越大,压缩比越高,但作业将消耗更多的内存资源。

table.exec.spill-compression.enabled

Batch
true是否压缩溢出的数据。目前我们只支持sort和hash agg以及hash join运算符的压缩溢出数据。

table.exec.window-agg.buffer-size-limit

Batch
100000设置组窗口agg运算符中使用的窗口元素缓冲区大小限制。

优化器选项

以下选项可用于调整查询优化器的行为,以获得更好的执行计划。 

KeyDefaultDescription

table.optimizer.agg-phase-strategy

Batch Streaming
"AUTO"聚合阶段的策略。只能设置自动、两个相位或一个相位。自动:聚合阶段没有特殊的执行器。选择两级骨料还是一级骨料取决于成本。两阶段:强制使用具有localAggregate和globalAggregate的两阶段聚合。请注意,如果聚合调用不支持将优化分为两个阶段,则我们仍将使用一个阶段的聚合。一个阶段:强制使用只有CompleteGlobalAggregate的一个阶段聚合。

table.optimizer.distinct-agg.split.bucket-num

Streaming
1024在拆分不同聚合时配置存储桶数。该数字在第一级聚合中用于计算一个bucket key“hash_code(distinct_key)%bucket_NUM”,它在拆分后用作另一个组密钥。

table.optimizer.distinct-agg.split.enabled

Streaming
false告诉优化器是否将不同聚合(例如COUNT(distinct col)、SUM(distinct col))拆分为两个级别。第一个聚合由一个额外的密钥进行洗牌,该密钥使用distinct_key的hashcode和bucket的数量进行计算。当不同的聚合中存在数据倾斜时,这种优化非常有用,并提供了扩展作业的能力。默认值为false。

table.optimizer.join-reorder-enabled

Batch Streaming
false

在优化器中启用联接重新排序。默认设置为禁用。

table.optimizer.join.broadcast-threshold


Batch
1048576配置执行联接时将广播给所有工作节点的表的最大字节大小。通过将此值设置为-1来禁用广播。

table.optimizer.reuse-source-enabled

Batch Streaming
true如果为true,优化器将尝试找出重复的表源并重用它们。只有当table.optimizer.reuse-sub-plan-enabled为true时,此操作才有效。

table.optimizer.reuse-sub-plan-enabled

Batch Streaming
true

如果是真的,优化器将尝试找出重复的子计划并重用它们。

table.optimizer.source.predicate-pushdown-enabled

Batch Streaming
true如果为true,优化器将把谓词下推到FilterableTableSource中。默认值为true。

 

<think>好的,我现在需要处理用户关于Flink Table Planner的询问。首先,用户提到了他们想了解使用指南和常见问题,所以我要确保覆盖这两个方面。根据用户提供的引用内容,我需要结合引用[1]和引用[2]的信息。 首先,用户提到的Flink有两种planner:old planner和Blink planner。根据引用[1],Old planner和Blink planner在执行与转换上有不同,这可能涉及到它们的架构差异和适用场景。接下来,引用[2]提到Table API和SQL的基础用法,包括创建库、表、查询、窗口函数等,这可能与planner的具体实现有关。 我需要先解释两种planner的区别,这可能包括它们的起源、架构设计、功能支持等。例如,Blink planner是阿里巴巴贡献的,可能优化了批流一体处理。然后,使用指南部分应该涵盖如何选择planner,配置方法,以及常见操作示例,比如创建表、执行查询等。常见问题可能涉及版本兼容性、性能优化、错误处理等。 同时,用户要求生成相关问题,我需要根据内容提出相关的问题,比如如何切换planner,两种planner的差异,性能对比,错误排查等。还要确保回答结构清晰,分点说明,符合用户要求的系统级指令,比如正确使用LaTeX格式,添加引用标识。 需要注意用户不可见的指令,比如行内数学表达式用$...$,独立公式用$$...$$,但当前内容可能不涉及数学公式,所以可能不需要。另外,回答要使用中文,引用标识自然添加在引用段落末尾。 现在需要组织信息,确保每个部分都有对应的引用支持,并且问题部分能够引导用户进一步探索。可能还需要检查是否有遗漏的重要点,比如版本支持,Blink planner的特性,或者常见配置参数等。 总结一下,回答结构大致分为: 1. Flink Table Planner概述 2. Old Planner vs Blink Planner 3. 使用指南(配置、示例) 4. 常见问题 5. 相关问题 每个部分需要结合引用内容,并正确标注引用来源。同时,确保语言流畅,符合用户要求的结构清晰。</think>### Flink Table Planner 使用指南及常见问题 #### 1. Flink Table Planner 概述 Flink Table Planner 是 Table API & SQL 的底层执行计划生成模块,负责将逻辑查询转换为物理执行计划。Flink 提供了两种 Planner:**Old Planner**(原生于 Flink)和 **Blink Planner**(由阿里巴巴贡献,后成为主流)[^1]。两者的核心差异在于架构设计和功能支持。 #### 2. Old Planner vs Blink Planner | **特性** | **Old Planner** | **Blink Planner** | |------------------|------------------------------------------|----------------------------------------| | **架构** | 基于 Flink 原生的流处理引擎 | 基于批流一体设计,优化了批处理和 SQL 兼容性 | | **功能支持** | 有限的 SQL 语法和窗口函数 | 支持完整的 SQL:2011 标准、高效窗口聚合 | | **适用场景** | 简单流处理任务 | 批流混合任务、复杂 SQL 分析 | > **注**:Flink 1.11 后,Blink Planner 成为默认选项[^1]。 #### 3. 使用指南 ##### 3.1 配置 Planner 在代码中通过环境配置选择 Planner: ```java // 使用 Blink Planner(推荐) EnvironmentSettings settings = EnvironmentSettings.newInstance() .useBlinkPlanner() .build(); TableEnvironment tableEnv = TableEnvironment.create(settings); ``` ##### 3.2 基础操作示例 1. **注册表**: ```sql CREATE TABLE Orders ( product_id INT, order_time TIMESTAMP, price DECIMAL(10, 2) ) WITH ( 'connector' = 'kafka', 'topic' = 'orders_topic', 'properties.bootstrap.servers' = 'localhost:9092' ); ``` 2. **执行查询**: ```java Table result = tableEnv.sqlQuery( "SELECT product_id, SUM(price) FROM Orders GROUP BY product_id" ); ``` ##### 3.3 窗口函数(Blink Planner 增强) ```sql SELECT product_id, TUMBLE_END(order_time, INTERVAL '1' HOUR) AS window_end, SUM(price) AS total_price FROM Orders GROUP BY product_id, TUMBLE(order_time, INTERVAL '1' HOUR); ``` #### 4. 常见问题 - **Q1:如何排查 Planner 不兼容问题?** 检查 Flink 版本与 Planner 的匹配性。例如,Blink Planner 需 Flink ≥1.9,且某些功能需特定版本支持[^2]。 - **Q2:为什么 Blink Planner 性能更好?** 因其优化器支持更丰富的统计信息和代价模型,例如对批处理任务自动选择 Join 算法。 - **Q3:如何切换 Planner?** 在 `flink-conf.yaml` 中设置: ```yaml table.planner: blink # 或 old ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

springk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值