Flink运行架构及并行度设置


Flink运行架构及并行度设置

实时大数据处理的本质,是利用有限的资源实现高并发、低延迟的任务执行。Flink作为流批一体的分布式计算引擎,其运行架构和并行度机制是理解Flink性能和资源利用率的核心。本文将通过原理讲解、源码细节、实用口诀和案例演示,帮助你全面掌握Flink的运行机制与并行度设置。


一、Flink运行时架构

Flink的运行时架构由三大核心组件组成:JobManagerTaskManagerSlot

1. JobManager(作业管理器)

  • 职责:负责作业的调度、资源分配、故障恢复、Checkpoint管理等。
  • 生命周期:每个Flink集群至少有一个JobManager(高可用场景下有主备)。
  • 源码入口org.apache.flink.runtime.jobmanager.JobManagerRunner

2. TaskManager(任务管理器)

  • 职责:负责实际的数据处理和计算任务执行。每个TaskManager进程可同时运行多个任务。
  • Slot:TaskManager内部的资源切分单元。每个Slot可运行一个子任务(SubTask)。
  • 源码入口org.apache.flink.runtime.taskexecutor.TaskExecutor

3. Slot(槽位)

  • 定义:Slot是TaskManager对外暴露的"资源租赁单元",决定了并发运行的最大任务数。
  • 分配原则:一个SubTask占用一个Slot,多个Slot可以分配在不同TaskManager或同一个TaskManager上。
架构示意图
复制代码
+-----------------+       +---------------------+
|    JobManager   |<----->|    TaskManager N    |--- Slot N.1
+-----------------+       |---------------------|--- Slot N.2
        |                 +---------------------+
        |
        |                 +---------------------+
        +---------------> |    TaskManager M    |--- Slot M.1
                          |---------------------|--- Slot M.2
                          +---------------------+

口诀速记

Job管调度,Task管执行,Slot管资源,SubTask落其上。


二、Flink作业提交流程

  1. 客户端提交作业
    用户通过CLI/API提交作业,生成JobGraph(作业逻辑DAG)。
  2. JobManager接收作业
    JobManager将JobGraph优化成ExecutionGraph(物理执行计划),决定并行度、资源分配等。
  3. 资源申请与Slot分配
    JobManager向ResourceManager申请Slot资源,分配给各个SubTask。
  4. TaskManager启动SubTask
    TaskManager收到任务后,启动对应的SubTask(线程),并进行数据处理。
  5. 状态管理与容错
    Checkpoint机制保证作业可恢复,JobManager监控任务健康。

源码解释

  • 提交作业入口:org.apache.flink.client.program.ClusterClient.submitJob
  • 作业调度分配:org.apache.flink.runtime.scheduler.SchedulerBase
  • Slot分配核心:org.apache.flink.runtime.jobmaster.slotpool.SlotPoolImpl

口诀速记

客户端提交,JobManager调度,ResourceManager分配,TaskManager执行。


三、并行度设置

Flink的并行度决定了作业的吞吐能力和资源利用率。合理设置并行度是性能调优的关键。

1. 全局并行度(Global Parallelism)

  • 定义:作业中所有算子的默认并行度。
  • 设置方式
    • 配置文件(flink-conf.yaml):parallelism.default
    • 代码设置:env.setParallelism(4);
    • 命令行参数:-p 4
  • 作用范围:所有未单独设置并行度的算子。

2. 算子并行度(Operator Parallelism)

  • 定义:单个算子的并行度,可覆盖全局并行度。

  • 设置方式

    java 复制代码
    dataStream.map(...).setParallelism(2);
  • 适用场景:特定算子(如sink、source)性能或资源瓶颈时单独调优。

3. Slot资源分配与并行度关系

  • 规则

    • 每个SubTask占用一个Slot。
    • Flink支持"Slot Sharing",同一个Slot内可运行不同算子的子任务(前提是属于同一个作业)。
  • Slot分配公式

    复制代码
    作业最大并行度 ≤ 集群总Slot数
    集群总Slot数 = TaskManager数量 × 每个TaskManager Slot数
  • 最佳实践

    • TaskManager的Slot数建议等于CPU核数。
    • 并行度不宜超过总Slot数,否则任务会排队等待资源。
    • Slot分配不均时,合理调整TaskManager数量或Slot数。

源码解释

  • 并行度决定在JobGraphExecutionGraph转换时:org.apache.flink.runtime.jobgraph.JobVertex#setParallelism
  • Slot分配在SlotPoolImpl#allocateSlot实现。

口诀速记

全局定默认,算子可覆盖,Slot定上限,核数做参考。


四、案例演示

1. 环境准备

  • 假设有3台机器,每台部署1个TaskManager,每个TaskManager分配4个Slot。
  • 集群总Slot数:3 × 4 = 12

2. 代码案例

java 复制代码
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

// 设置全局并行度为4
env.setParallelism(4);

DataStream<String> source = env
    .addSource(new FlinkKafkaConsumer<>(...)); // Source未指定并行度,默认4

DataStream<String> mapped = source
    .map(value -> value.toUpperCase()) // Map未指定并行度,默认4
    .setParallelism(8);  // Map算子单独设置并行度为8

mapped
    .addSink(new MySinkFunction()) // Sink未设置并行度,继承全局并行度4
    .name("MySink");

env.execute("Parallelism Demo");

3. 并行度与Slot分配分析

  • Source:并行度4(占用4个Slot)
  • Map:并行度8(占用8个Slot)
  • Sink:并行度4(占用4个Slot)

此作业最大并行度为8,因此至少需要8个Slot可用。由于集群有12个Slot,资源充足。

4. 如何查看实际并行度与Slot分配?

  • 提交作业后,Flink Web UI(默认8081端口)可以查看各算子的并行度和Slot分配情况。
  • 日志中也可看到Slot分配和任务调度日志。

5. 并行度设置口诀

并行度看Slot,Slot看核数,默认可全局,特殊算子调。


五、Slot Sharing机制及Chaining机制

1. Slot Sharing机制

定义

Flink支持多个算子的SubTask共享同一个Slot资源(只要属于同一个作业且可Chaining),以提升资源利用率,降低资源碎片。

原理细节

  • Slot不是进程或线程,而是任务分组的"容器"。
  • 同一作业内的多个SubTask可以被"装入"同一个Slot,前提是这些算子之间可以Chaining。
  • 这样即使作业中有多个并行的算子,也不必为每个SubTask单独分配Slot,提升了资源利用率。

源码入口
SlotSharingGroupExecutionJobVertex#slotSharingGroup

口诀速记

一槽多子任务,资源用得满。

2. Operator Chaining机制

定义

Flink会将可以合并的算子链(如map→filter→flatMap)在同一个线程中执行,减少线程切换和数据序列化开销,提高执行效率。

原理细节

  • 默认开启,除非调用disableChaining()
  • Chaining后的算子SubTask会被分配到同一个Slot和同一线程中。
  • 只有算子之间没有shuffle、rebalance等操作时才能Chaining。

源码入口
StreamGraph#configureOperatorChain

口诀速记

能链则链,省Slot省线程。


六、动态调整并行度

Flink支持作业级和算子级的动态并行度调整,尤其是在Savepoint和Rescale场景下。

1. Savepoint恢复时调整

  • 通过Savepoint恢复作业时,可指定新的并行度,Flink会自动做状态重分布。

  • 命令行示例:

    bash 复制代码
    ./bin/flink run -s <savepoint-path> -p 8 myjob.jar
  • 支持运行时对作业进行Rescale(动态增减并行度),无需停止整个作业。

3. 注意事项

  • 算子的最大并行度(maxParallelism)一旦设定,不能小于历史的maxParallelism。
  • 状态后端(如RocksDBStateBackend)更适合大状态量的动态并行度调整。

口诀速记

Savepoint调并行,状态要兼容。


七、常见并行度配置问题及排查

1. 并行度设置过大

  • 现象:作业一直处于等待资源分配(SCHEDULED)。
  • 排查:检查集群总Slot数是否小于作业最大并行度。

2. 并行度设置过小

  • 现象:CPU利用率低,处理能力不足。
  • 排查:适当提升并行度,或增加TaskManager/Slot数量。

3. Slot未均衡分配

  • 现象:部分TaskManager很忙,部分空闲。
  • 排查:合理设置TaskManager数量和Slot数,避免资源倾斜。

4. Chaining导致无法单独监控算子

  • 现象:多个算子合成一条链,难以单独监控每个算子的指标。
  • 排查 :必要时通过disableChaining()隔离算子。

5. 算子状态兼容性问题

  • 现象:调整并行度后作业恢复失败。
  • 排查:确认maxParallelism参数一致,且状态后端支持重分布。

口诀速记

Slot不够等资源,Slot太多浪费钱。链太多难分辨,调并行看状态。


八、总结与实践建议

  1. 理解架构:JobManager调度,TaskManager执行,Slot是资源单元。
  2. 熟悉提交流程:作业提交、调度、分配、执行、容错全链路。
  3. 科学设置并行度:既不过低浪费资源,也不过高造成排队。
  4. Slot与并行度匹配:并行度 ≤ 总Slot数,合理分布提升性能。
  5. 源码可溯源:关键分配逻辑可通过源码追踪理解。
  6. 口诀速记
    • 架构:Job管调度,Task管执行,Slot管资源,SubTask落其上。
    • 流程:客户端提交,JobManager调度,ResourceManager分配,TaskManager执行。
    • 并行度:全局定默认,算子可覆盖,Slot定上限,核数做参考。

九、全局口诀速记总结

Job管调度,Task管执行,Slot分资源,SubTask落其上;

并行度看Slot,Slot看核数,全局可默认,特殊可覆盖;

一槽多子任务,能链则链,Savepoint调并行,状态要兼容。


十、推荐阅读

如需深入探讨Flink资源管理、Slot Sharing、动态扩缩容等高级话题,欢迎留言交流!


相关推荐
文火冰糖的硅基工坊3 分钟前
[创业之路-374]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观之当前的国际环境、国家产业政策中的机会与风险
人工智能·华为·架构·系统架构·跨学科
涤生大数据1 小时前
Kafka Streams 和 Apache Flink 的无状态流处理与有状态流处理
flink·kafka·apache·实时
光仔December1 小时前
【Elasticsearch入门到落地】13、DSL查询详解:分类、语法与实战场景
大数据·elasticsearch·搜索引擎·全文检索·dsl语法
Christo32 小时前
SIAM-2007《k-means++: The Advantages of Careful Seeding》
大数据·人工智能·算法·机器学习·支持向量机·kmeans
猎板PCB黄浩2 小时前
从制造到智造:猎板PCB的技术实践与产业价值重构
大数据
广州正荣3 小时前
人工智能在医疗影像诊断上的最新成果:更精准地识别疾病
大数据·人工智能·科技
不懂网络的坤坤3 小时前
大数据治理:理论、实践与未来展望(一)
大数据
数据小吏3 小时前
第十四章:数据治理之数据源:数据源的数据接入、业务属性梳理及监控
大数据·数据仓库·etl工程师
caihuayuan55 小时前
Vue3 Composition API: 企业级应用最佳实践方案
java·大数据·spring boot·后端·课程设计