ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Flink部署模式全解析:从本地单机到YARN集群的实战指南

2026/8/6 12:59:09 拓冰建站 浏览量
Flink部署模式全解析:从本地单机到YARN集群的实战指南

1. 从零到一:Flink部署模式的选择与场景匹配

最近在社区里看到不少朋友在问Flink的部署问题,从单机测试到生产集群,各种模式让人眼花缭乱。我自己在数据平台团队摸爬滚打这些年,从早期的Storm迁移到Flink,再到后来负责公司实时计算平台的搭建和维护,几乎把Flink的各种部署方式都踩了个遍。今天我就结合自己的实战经验,把Flink的本地单机、Standalone集群和YARN模式集群这三种最核心的部署方式,从头到尾、掰开揉碎了讲清楚。

很多刚接触Flink的朋友容易陷入一个误区:上来就照着文档配YARN集群,结果环境问题一堆,跑个WordCount都费劲。其实,部署方式的选择直接关系到你后续的开发、调试和运维效率。本地单机模式是你学习和验证代码逻辑的“沙盒”;Standalone集群是中小团队快速搭建、独立管控的“专属服务器”;而YARN模式则是融入成熟大数据生态、追求资源弹性与高可用的“生产标准”。这三种模式并非递进关系,而是面向不同场景的平行选择。理解它们各自的边界和适用场景,比盲目敲命令重要得多。

接下来的内容,我会假设你有一台或多台Linux服务器(CentOS 7+或Ubuntu 18.04+),并且具备基础的Shell操作和网络知识。我们会从最基础的本地单机模式开始,一步步深入到集群部署,过程中我会穿插大量我实际踩过的坑和总结出来的最佳实践。目标是让你看完之后,不仅能顺利搭建起环境,更能明白每一步背后的“为什么”,从而具备根据自身业务需求灵活选择和调整部署架构的能力。

2. 基石准备:环境规划、资源评估与安装包抉择

在真正动手下载安装包之前,有几个前置步骤至关重要,它们往往决定了后续部署的顺利程度和集群的稳定性。很多人一上来就wget,结果在配置阶段遇到各种版本冲突、端口占用、权限问题,折腾半天又得推倒重来。

2.1 系统环境与资源规划

首先,你需要明确你的目标部署模式对硬件和系统的要求。

对于本地单机模式,它本质上就是一个加强版的Java进程。你只需要关注单台机器的资源:建议至少4核CPU、8GB内存、20GB可用磁盘空间。操作系统方面,Linux、macOS、Windows(通过WSL或Cygwin)都可以,但生产环境强烈推荐Linux。需要预装JDK 8或JDK 11(Flink 1.15+对JDK 11支持更完善),我建议使用OpenJDK,并通过java -version确认版本。

对于Standalone集群YARN模式,则需要规划多台机器。通常我们需要区分两类节点角色:

  • JobManager (Master) 节点:负责任务调度和资源管理。它是集群的“大脑”,对单点故障敏感(虽然可以配置高可用)。建议分配较好的CPU和至少4GB内存。
  • TaskManager (Worker) 节点:负责执行具体的任务。它是集群的“肌肉”,需要根据你预期运行的任务数据量和复杂度来配置。通常CPU核心数和内存是主要考量指标。

一个典型的测试用Standalone集群可以是1个JobManager + 2个TaskManager。网络方面,确保所有节点之间主机名可以相互解析(建议配置/etc/hosts),并且SSH免密登录已打通(对于启动脚本有用)。防火墙需要开放Flink的RPC端口(默认6123)、Blob Server端口(默认6124)、Web UI端口(默认8081)以及TaskManager的数据传输端口范围(默认6125-6129)。

注意:很多云服务器默认的防火墙规则(如Security Group)会阻止这些端口,导致节点间无法通信,表现为TaskManager注册不上。这是初期搭建最常遇到的问题之一。

2.2 Flink版本与安装包选择

访问 Apache Flink 官网下载页 ,你会看到一堆版本和包。这里有几个关键选择:

  1. Scala版本:Flink部分API(特别是DataStream)是用Scala写的,因此发行版分为了针对Scala 2.11和2.12编译的版本。如果你的项目中使用Scala,那么必须选择与你项目Scala版本一致的Flink包。如果只用Java,那么任意一个都可以,通常选择Scala 2.12版本,因为其生态更新。
  2. 二进制包类型:推荐下载flink-*.tgz这个压缩包。它包含了运行所需的所有库、启动脚本、Web前端和示例。-bin后缀的就是这个。
  3. 版本号:对于生产环境,建议选择最近的稳定版(非SNAPSHOT版本)。例如,1.17.x1.18.x系列。注意查看版本说明,了解其依赖的Java版本。

下载后,通过tar -xzf flink-*.tgz解压到你规划的目录,例如/opt/flink~/apps/flink。这个目录我们称为$FLINK_HOME

2.3 核心配置文件初探

解压后,进入$FLINK_HOME/conf目录。这里有几个核心文件,我们先混个脸熟:

  • flink-conf.yaml: Flink的主配置文件,绝大多数参数都在这里。
  • masters: Standalone集群模式下,用于指定JobManager节点的主机和RPC端口。
  • workers(旧版本叫slaves): Standalone集群模式下,用于指定TaskManager节点的主机名。
  • log4j.properties: 日志配置。

在开始任何模式部署前,我建议先做一件事:设置JAVA_HOME。虽然Flink脚本会尝试查找Java,但显式设置最保险。编辑flink-conf.yaml,找到或添加一行:

env.java.home: /usr/lib/jvm/java-11-openjdk-amd64 # 请替换为你的JDK实际路径

你可以通过dirname $(dirname $(readlink -f $(which java)))命令来快速定位你的JDK安装根目录。

3. 极速验证:本地单机模式部署实操

本地单机模式是学习和开发调试的利器。它不需要任何外部依赖,几分钟内就能让你看到Flink跑起来的样子。

3.1 启动与验证

进入$FLINK_HOME目录,执行以下命令启动一个本地Flink实例:

./bin/start-cluster.sh

这个脚本会同时启动一个JobManager和一个TaskManager(都在同一个JVM进程里,但逻辑独立)。如果看到类似“Starting cluster.”的日志,并且没有报错,就基本成功了。

接下来,打开浏览器,访问http://localhost:8081。你应该能看到Flink的Web Dashboard。在“Task Managers”标签页下,应该能看到一个已注册的TaskManager,其Slots数量取决于你机器的CPU核心数(默认一个Slot对应一个CPU核心线程)。

3.2 运行你的第一个Job

Web UI提供了提交任务的入口,但我们更常用命令行。$FLINK_HOME/bin目录下有个flink脚本,它是提交任务的主要工具。让我们运行一个内置的示例来验证集群工作正常:

./bin/flink run ./examples/streaming/WordCount.jar

这个命令会提交一个流式的WordCount任务。你可以在Web UI的“Running Jobs”中看到这个任务,观察其状态和指标。

实操心得:本地模式默认使用localhost作为地址。如果你在本地开发,但想从IDE(如IntelliJ IDEA)中提交任务到这个本地集群,需要确保flink-conf.yaml中的jobmanager.rpc.address配置为localhost127.0.0.1。此外,本地模式的所有数据(检查点、保存点)默认都写在$FLINK_HOME目录下,重启后会丢失,仅供测试。

3.3 关键配置调优(即使是单机)

即使是单机模式,调整几个参数也能极大提升体验:

  • 调整并行度与内存:在flink-conf.yaml中,可以修改taskmanager.numberOfTaskSlots来设定每个TaskManager的slot数(默认等于CPU核数)。对于内存,可以调整taskmanager.memory.process.size(或更细粒度的taskmanager.memory.*系列参数)。单机测试时,建议给TaskManager分配足够内存,避免频繁GC。
    taskmanager.numberOfTaskSlots: 4 taskmanager.memory.process.size: 4096m # 4GB
  • 开启Web UI历史:默认情况下,任务结束后就从Web UI消失了。可以开启历史服务器,方便回顾。
    jobmanager.archive.fs.dir: file:///tmp/flink-completed-jobs/ historyserver.web.address: 0.0.0.0 historyserver.web.port: 8082 historyserver.archive.fs.dir: file:///tmp/flink-completed-jobs/
    然后启动历史服务器:./bin/historyserver.sh start,即可通过8082端口查看已完成的任务。

停止本地集群使用:./bin/stop-cluster.sh

4. 独立自主:Standalone集群模式搭建详解

当你需要一个小型、独立、不依赖于Hadoop/YARN的Flink集群时,Standalone模式是最佳选择。它部署简单,运维直观,适合实时计算任务相对固定、资源需求明确的中小规模场景。

4.1 集群拓扑与配置文件修改

假设我们规划三台机器:

  • master01(192.168.1.101): 作为JobManager节点。
  • worker01(192.168.1.102): 作为TaskManager节点。
  • worker02(192.168.1.103): 作为TaskManager节点。

首先,在所有节点上,重复第2节的环境准备步骤:安装JDK,下载并解压相同版本的Flink到相同路径,例如/opt/flink

然后,在JobManager节点 (master01)上,进行配置:

  1. 配置masters文件

    # vim /opt/flink/conf/masters master01:8081

    这行表示JobManager运行在master01主机上,Web UI端口为8081。RPC端口(默认6123)会在flink-conf.yaml中配置。

  2. 配置workers文件

    # vim /opt/flink/conf/workers worker01 worker02

    每行一个TaskManager节点的主机名。

  3. 配置flink-conf.yaml文件

    # JobManager的RPC地址,必须配置为JobManager节点能被Worker访问到的地址 jobmanager.rpc.address: master01 jobmanager.rpc.port: 6123 # JobManager的堆内存,根据资源调整 jobmanager.memory.process.size: 2048m # 每个TaskManager的slot数量,建议设置为该机器CPU物理核心数 taskmanager.numberOfTaskSlots: 4 # TaskManager的总进程内存 taskmanager.memory.process.size: 4096m # 可选:设置检查点存储路径,需要是共享目录或分布式文件系统(如HDFS) # state.checkpoints.dir: hdfs://namenode:8020/flink-checkpoints # state.savepoints.dir: hdfs://namenode:8020/flink-savepoints # 可选:配置高可用(需要ZooKeeper) # high-availability: zookeeper # high-availability.zookeeper.quorum: zk1:2181,zk2:2181,zk3:2181 # high-availability.storageDir: hdfs://namenode:8020/flink/ha/
  4. 将配置同步到所有Worker节点: 最简单的方式是将整个conf目录打包,分发到各个Worker节点并覆盖。

    cd /opt/flink tar czf conf.tar.gz conf/ scp conf.tar.gz worker01:/opt/flink/ scp conf.tar.gz worker02:/opt/flink/ # 然后在每个worker节点上解压覆盖 # ssh worker01 "cd /opt/flink && tar xzf conf.tar.gz"

4.2 启动集群与问题排查

JobManager节点 (master01)上,执行启动命令:

cd /opt/flink ./bin/start-cluster.sh

这个脚本会通过SSH连接到workers文件中列出的所有主机,并在每台机器上启动一个TaskManager进程,同时在本地启动JobManager。

启动后,务必进行以下检查:

  1. 检查进程:在每台机器上执行jps,应该看到StandaloneSessionClusterEntrypoint(JobManager)和TaskManagerRunner进程。
  2. 检查日志:查看$FLINK_HOME/log目录下的日志文件,特别是以.out结尾的stdout文件和.log结尾的详细日志。重点关注有无连接失败、端口绑定失败、类找不到等错误。
  3. 检查Web UI:访问http://master01:8081。在“Overview”页面,你应该能看到“Task Managers”的数量为2。如果为0,说明TaskManager没有成功注册。

常见问题排查:

  • TaskManager无法连接JobManager:这是最常见的问题。首先确保master01的主机名在worker01worker02上能被正确解析(ping master01)。其次检查防火墙是否开放了6123端口。可以在Worker节点上手动执行nc -zv master01 6123测试连通性。
  • SSH免密登录失败start-cluster.sh脚本依赖SSH到Worker节点启动进程。确保JobManager节点到所有Worker节点的SSH免密登录已配置好。
  • 端口冲突:如果8081或6123端口被占用,需要修改flink-conf.yaml中的rest.portjobmanager.rpc.port,并同步到所有节点。

4.3 提交任务到Standalone集群

提交任务有两种方式:

  1. 通过Web UI:在Web UI的“Submit New Job”页面,上传你的JAR包,指定入口类名和参数。
  2. 通过命令行:在任意能访问到JobManager RPC地址的机器上(通常是JobManager节点本身),使用flink命令。
    cd /opt/flink # 从本地提交 ./bin/flink run -m master01:8081 /path/to/your-job.jar # 或者使用默认配置(如果就在JobManager节点上运行) ./bin/flink run /path/to/your-job.jar
    参数-m指定了JobManager的地址和Web端口。

4.4 Standalone集群的运维要点

  • 停止集群:在JobManager节点运行./bin/stop-cluster.sh。注意,这会强制停止所有运行中的任务
  • 单独启停节点:可以使用./bin/taskmanager.sh start/stop在单个节点上操作TaskManager。这对于滚动重启或故障恢复很有用。
  • 日志管理:生产环境需要配置日志轮转和集中收集(如ELK)。可以修改log4j.properties或使用logback.xml
  • 监控告警:Flink Web UI提供了丰富的指标。可以集成Prometheus(通过metrics.reporter.prom.class配置)和Grafana进行更专业的监控。

Standalone模式给了你完全的控制权,但也意味着你需要自己负责所有组件的生命周期管理、监控和高可用(如果需要的话)。对于更复杂的资源管理和多租户场景,就需要考虑YARN或Kubernetes模式了。

5. 拥抱生态:基于YARN的Flink集群部署

YARN模式是Flink在生产环境中最主流的部署方式之一,尤其对于已经拥有Hadoop集群的团队。它让Flink作为一个YARN Application运行,由YARN来负责资源调度、分配和容错管理。这意味着Flink可以和其他大数据组件(如MapReduce、Spark)共享集群资源,动态申请和释放Container,实现更高的资源利用率。

5.1 YARN模式的核心原理与前提条件

在YARN模式下,当你提交一个Flink作业时,会发生以下事情:

  1. Flink客户端与YARN ResourceManager通信,申请一个ApplicationMaster (AM) Container。
  2. YARN在一个NodeManager上启动这个AM Container,而Flink的JobManager进程就运行在这个AM中。
  3. JobManager再向YARN申请运行TaskManager所需的Container资源。
  4. YARN在合适的NodeManager上启动TaskManager Container。

因此,部署前提非常明确:

  • 一个正常运行的Hadoop YARN集群(Hadoop 2.4+或3.x)。
  • 所有节点已安装相同版本的Flink,或者Flink的JAR包能被YARN分布式缓存访问(推荐将Flink安装包上传到HDFS)。
  • 客户端机器配置好HADOOP_CONF_DIRYARN_CONF_DIR环境变量,指向YARN的配置文件目录(包含core-site.xml,hdfs-site.xml,yarn-site.xml)。

5.2 两种部署模式:Session Cluster与Per-Job Cluster

YARN模式支持两种子模式,适应不同场景:

  • YARN Session Cluster (会话模式)

    • 流程:先启动一个长期运行的Flink集群(包含JobManager和一定数量的TaskManager),然后向这个集群提交多个作业。这些作业共享集群资源。
    • 优点:作业启动快(资源已预分配),适合短作业、交互式查询或需要共享状态的场景。
    • 缺点:资源静态分配,不用的作业也占着资源;一个作业失败可能导致整个Session失败(取决于配置);资源隔离性相对较差。
    • 启动命令./bin/yarn-session.sh -d-d表示分离模式,后台运行)。
  • YARN Per-Job Cluster (单作业模式)

    • 流程:每个作业独立启动一个专属的Flink集群。作业完成后,整个集群(包括JobManager和TaskManager)资源被释放。
    • 优点:资源按需申请,隔离性好,作业故障互不影响,符合“应用即服务”的理念。
    • 缺点:每个作业启动都有额外开销(申请AM、拉取依赖等)。
    • 提交命令./bin/flink run -t yarn-per-job -yjm 1024m -ytm 2048m ./examples/streaming/WordCount.jar

生产环境目前更推荐Per-Job Cluster模式,因为它提供了更好的资源隔离和故障隔离,也更符合云原生的发展趋势。Flink 1.15之后,yarn-session模式已标记为不推荐,未来可能移除。

5.3 详细部署步骤与配置

我们以Per-Job Cluster模式为例,进行部署。

步骤1:环境变量配置在客户端机器(提交作业的机器)上,设置Hadoop配置路径。最好写入~/.bashrc/etc/profile

export HADOOP_CONF_DIR=/etc/hadoop/conf # 替换为你的Hadoop配置目录实际路径 export HADOOP_CLASSPATH=`hadoop classpath` # 确保Flink能访问Hadoop类

执行source ~/.bashrc使环境变量生效。验证:执行echo $HADOOP_CONF_DIR,确保路径正确。

步骤2:上传Flink至HDFS(推荐)为了YARN能在所有NodeManager上访问到Flink的依赖,最好将Flink安装包上传到HDFS。这能避免每个节点都需要本地安装,也便于版本管理。

# 在HDFS上创建目录 hadoop fs -mkdir -p /flink-dist/ # 将本地解压好的flink目录打包上传,或直接上传下载的tgz包 cd /opt tar czf flink-1.17.1.tgz flink-1.17.1/ hadoop fs -put flink-1.17.1.tgz /flink-dist/ # 或者,如果你已经在每个节点安装了相同路径的Flink,可以跳过此步,但需要在flink-conf.yaml中指定yarn.ship-archives

步骤3:提交Per-Job作业现在可以提交一个作业到YARN了。关键参数解释:

  • -t yarn-per-job: 指定部署目标为YARN Per-Job模式。
  • -yjm 1024m: 为JobManager (ApplicationMaster) 申请1024MB内存。
  • -ytm 2048m: 为每个TaskManager Container申请2048MB内存。
  • -ys 2: 为每个TaskManager分配2个slot。
  • -yD key=value: 设置Flink或JVM的系统属性。
  • -yqu root.default: 指定YARN队列。
cd /opt/flink-1.17.1 ./bin/flink run -t yarn-per-job \ -yjm 1024m \ -ytm 2048m \ -ys 2 \ -yqu root.default \ ./examples/streaming/WordCount.jar

提交后,客户端会打印出YARN Application ID和Flink Web UI的URL(通常是一个随机的NodeManager地址和端口)。你可以用这个URL跟踪作业运行,也可以通过YARN ResourceManager的Web UI(默认8088端口)查看所有应用。

5.4 YARN模式下的高级配置与调优

  1. 依赖管理

    • 对于作业依赖的JAR包(非Flink核心包),可以通过-C-yt参数指定,YARN会将其作为分布式缓存分发。
    • 对于大量公共依赖,可以考虑将其打入Flink发行版的lib目录,或者上传到HDFS并通过yarn.ship-archives配置。
  2. 高可用配置: YARN本身会重启失败的ApplicationMaster。但要实现Flink JobManager的高可用(保存作业状态),需要配置ZooKeeper和HDFS。

    # 在flink-conf.yaml中配置 high-availability: zookeeper high-availability.storageDir: hdfs://namenode:8020/flink/ha/ high-availability.zookeeper.quorum: zk1:2181,zk2:2181,zk3:2181

    提交作业时,这些配置会自动生效。

  3. 日志查看: YARN模式下,作业的日志分散在各个Container中。最方便的是通过YARN的命令查看:

    yarn logs -applicationId <你的Application ID>

    也可以配置yarn.log-aggregation-enable为true,将日志聚合到HDFS后查看。

  4. 资源调优

    • -ytm设置的是YARN Container的总内存。Flink内部会将其划分为网络缓冲区、托管内存、JVM堆内存等部分。可以通过taskmanager.memory.*系列参数进行精细控制,避免OOM。
    • 注意YARN的yarn.scheduler.maximum-allocation-mbyarn.nodemanager.resource.memory-mb配置,确保申请的资源在限额内。

踩坑实录:在YARN模式下,经常遇到“Container exited with a non-zero exit code 137”的错误。这通常是因为Container内存超限被YARN的nodemanager进程kill掉了。你需要检查:1)-ytm参数设置是否过小;2) Flink的taskmanager.memory.process.size是否小于等于-ytm的值;3) 是否开启了堆外内存(如RocksDB状态后端)但没在-ytm中预留足够空间。一个稳妥的做法是,将-ytm设置得比Flink配置的总进程内存大10%-20%,作为安全缓冲。

6. 部署后的关键考量:监控、高可用与日常运维

无论选择哪种部署模式,让集群稳定运行只是第一步。接下来需要考虑的是如何监控它、如何保证它高可用、以及日常运维中要注意什么。

6.1 监控体系搭建

“没有监控,就是在裸奔。” 对于Flink集群,监控需要多层次展开:

  • 集群健康度

    • Web UI:最直接的入口,查看Job和Task的状态、背压、Checkpoint情况。
    • ResourceManager (YARN模式):查看队列资源使用、应用列表。
    • 节点级:通过jpstopnetstat等命令,或Node Exporter + Prometheus监控CPU、内存、磁盘、网络、端口状态。
  • 作业与任务指标

    • Flink Metrics System:Flink内置了丰富的指标(numRecordsInPerSecond,latency,checkpointDuration等)。可以将这些指标导出到外部系统。
    • 配置Prometheus Reporter:这是最流行的方案。在flink-conf.yaml中添加:
      metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter metrics.reporter.prom.port: 9250-9260 # 指定一个端口范围,每个TaskManager/JobManager一个
      然后在Prometheus配置中抓取这些端口的/metrics数据,最后用Grafana展示。社区有成熟的Flink Dashboard模板。
    • 日志监控:使用ELK或Loki收集jobmanager.logtaskmanager.log,设置关键错误告警(如Checkpoint expired,Exception等)。
  • 业务指标:在用户代码中自定义Metric,监控业务逻辑层面的关键数据(如处理订单数、异常订单数等)。

6.2 高可用配置详解

对于生产环境,单点故障是不可接受的。Flink的高可用主要解决JobManager故障恢复问题。

  • Standalone模式高可用: 需要依赖ZooKeeper来选举主JobManager,并依赖分布式存储(如HDFS)来持久化元数据和检查点。

    1. 搭建ZooKeeper集群(至少3节点)。
    2. 配置flink-conf.yaml
      high-availability: zookeeper high-availability.storageDir: hdfs://namenode:8020/flink/ha/ high-availability.zookeeper.quorum: zk1:2181,zk2:2181,zk3:2181 high-availability.zookeeper.path.root: /flink
    3. masters文件中列出所有候选的JobManager主机和Web端口。
      # conf/masters master01:8081 master02:8081
    4. 启动集群时,每个JobManager节点上单独启动bin/jobmanager.sh start,ZooKeeper会协调出Leader。
  • YARN模式高可用: YARN Per-Job模式的高可用相对简单。YARN会负责重启失败的ApplicationMaster(即JobManager)。但是,要恢复作业状态,同样需要配置ZooKeeper和HDFS(如上所述)。当AM被YARN重启后,新的JobManager会从ZooKeeper和HDFS中恢复之前的元数据和最新的检查点,并重新连接上存活的TaskManager,继续执行作业。

重要提示:高可用不等于数据不丢失。它保证的是作业计算逻辑的恢复。要保证数据处理的精确一次(Exactly-Once)语义,必须配置可靠的Checkpoint存储(如HDFS、S3)和可重放的数据源(如Kafka)。state.checkpoints.dir必须指向一个分布式文件系统。

6.3 日常运维操作清单

  1. 作业生命周期管理

    • 提交./bin/flink run ...
    • 取消./bin/flink cancel <JobID>或通过Web UI。
    • 保存点:手动触发保存点用于有状态作业的版本升级或迁移。./bin/flink savepoint <JobID> [targetDirectory]。停止作业时使用-s参数触发保存点并停止。
    • 从保存点恢复./bin/flink run -s <savepointPath> ...
  2. 集群升级与扩缩容

    • Standalone:可以逐个重启TaskManager实现滚动升级。JobManager需要借助高可用模式,先启动新版本备机,再故障切换到新版本。
    • YARN Per-Job:直接提交新版本作业,并指定从旧作业的保存点恢复,是最安全的方式。
    • 扩缩容:在YARN或K8s上,可以通过修改并行度并触发保存点/重启来实现。Standalone模式需要手动增减workers文件中的节点并重启TaskManager。
  3. 配置管理:将flink-conf.yaml等配置文件纳入版本控制(如Git)。使用配置管理工具(如Ansible)或容器镜像来保证集群间配置一致性。

  4. 故障排查三板斧

    • 看日志:第一时间查看JobManager和出错TaskManager的日志。关注ERROR和WARN级别信息。
    • 看指标:检查背压指标、Checkpoint成功率与时长、网络缓冲区使用率、GC情况。
    • 看线程栈:如果作业卡住,可以jstack <pid>查看线程状态,或者通过Web UI的“Thread Dump”功能。

部署Flink集群就像搭积木,单机模式是那块最基础的砖,让你理解组件;Standalone模式让你搭出一个稳固的小房子;而YARN模式则是将你的房子接入了一个现代化的市政系统(大数据生态),获得了弹性和资源共享的能力。没有最好的模式,只有最适合你当前团队规模、技术栈和业务需求的模式。建议从本地单机开始实验,然后用Standalone搭建测试集群,最后在充分测试后再上生产YARN环境。每一步的坑踩实了,路才能走得稳。