4. Flink 环境搭建:本地模式、Standalone 集群、YARN 模式部署与配置

说实话,Flink 的环境搭建是很多初学者第一道坎。我见过不少人在本地跑通了 WordCount,一上集群就各种报错。其实说白了,Flink 的部署模式就三种:本地模式、Standalone 集群、YARN 模式。每种模式都有它的适用场景,咱们一个一个来拆解。

核心观点: 别一上来就搞 YARN。我个人的习惯是:本地开发用 Local 模式,小团队测试用 Standalone,生产环境必须上 YARN。顺序搞对了,能省不少排查时间。

Flink 三种部署模式对比 本地模式 (Local) 单 JVM 进程运行 JobManager + TaskManager 合并在一个进程 适合:开发调试 Standalone 集群 独立集群部署 JM 与 TM 分离部署 需手动管理资源 适合:小规模测试 YARN 模式 资源由 YARN 管理 自动扩缩容 与 Hadoop 生态集成 适合:生产环境 关键差异对比 • 资源管理:Local 无 → Standalone 手动 → YARN 自动 • 高可用:Local 无 → Standalone 需配置 → YARN 原生支持 • 资源隔离:Local 无 → Standalone 弱 → YARN 强(CGroup) • 运维成本:Local 低 → Standalone 中 → YARN 高(但值得)

4.1 本地模式:从零开始跑起来

本地模式是最简单的。你不需要任何集群,一个 JVM 进程就能搞定。我记得刚学 Flink 那会儿,就是靠本地模式把 API 摸熟的。

第一步:下载和解压

去官网下载 Flink 二进制包,我习惯用 1.17 版本,稳定且特性全。

# 下载 Flink 1.17.0
wget https://dlcdn.apache.org/flink/flink-1.17.0/flink-1.17.0-bin-scala_2.12.tgz

# 解压
tar -xzf flink-1.17.0-bin-scala_2.12.tgz
cd flink-1.17.0

第二步:启动本地集群

直接运行启动脚本就行。它会启动一个 JobManager 和一个 TaskManager,都在同一个 JVM 里。

# 启动本地集群
./bin/start-cluster.sh

# 检查是否启动成功
jps
# 应该能看到:StandaloneSessionClusterEntrypoint

启动后,打开浏览器访问 http://localhost:8081,就能看到 Flink Web UI 了。嗯,这里要注意,如果端口被占用,可以在 conf/flink-conf.yaml 里改 rest.port。

小技巧: 本地模式默认并行度等于 CPU 核心数。我调试时喜欢设成 1,方便看日志。在 flink-conf.yaml 里加一行 parallelism.default: 1 就行。

4.2 Standalone 集群:手动搭建的乐趣与坑

Standalone 模式适合小团队内部测试。说白了,就是多台机器手动搭一个 Flink 集群。我曾经在 3 台机器上搭过,踩了不少坑,这里把关键步骤和避坑点都给你列出来。

集群规划(以 3 节点为例)

节点 角色 IP 示例
node01 JobManager + TaskManager 192.168.1.101
node02 TaskManager 192.168.1.102
node03 TaskManager 192.168.1.103

配置步骤

  1. 配置 conf/flink-conf.yaml:主要改 JobManager 的地址和端口。
# JobManager 地址(所有节点都要配)
jobmanager.rpc.address: node01
jobmanager.rpc.port: 6123

# TaskManager 的 slot 数(每个 TM 能跑几个任务)
taskmanager.numberOfTaskSlots: 4

# 并行度
parallelism.default: 2
  1. 配置 conf/workers:列出所有 TaskManager 节点。
# conf/workers 文件内容
node01
node02
node03
  1. 配置 conf/masters:指定 JobManager 节点。
# conf/masters 文件内容
node01:8081
  1. 分发配置:把整个 Flink 目录 scp 到所有节点。
# 在 node01 上执行
scp -r flink-1.17.0 node02:/opt/
scp -r flink-1.17.0 node03:/opt/
  1. 启动集群:只在 JobManager 节点执行一次。
# 在 node01 上执行
./bin/start-cluster.sh

避坑指南: 我曾经因为 SSH 免密没配好,启动时一直报连接超时。还有一次是防火墙没关,TaskManager 注册不上。建议先执行 ssh node02 测试连通性,再启动集群。

4.3 YARN 模式:生产环境的首选

YARN 模式是生产环境最常用的。为什么?因为资源由 YARN 统一管理,不用手动分配。说白了,你提交一个任务,YARN 给你分配 Container,任务跑完自动释放资源。

YARN 模式有两种提交方式:Session 模式 和 Per-Job 模式。我个人的经验是:小任务用 Session,大任务用 Per-Job。

前置条件

  • Hadoop 集群已部署(YARN 和 HDFS 必须启动)
  • 配置 HADOOP_CLASSPATH
# 设置 Hadoop 环境变量
export HADOOP_HOME=/opt/hadoop-3.3.4
export HADOOP_CLASSPATH=`$HADOOP_HOME/bin/hadoop classpath`

# 或者直接加到 flink-conf.yaml 里
env.java.opts: -Djava.library.path=/opt/hadoop-3.3.4/lib/native

Session 模式:先建集群,再提交任务

先启动一个常驻的 Flink 集群,然后往里面提交任务。

# 启动 YARN Session(分配 2 个 TM,每个 2 个 slot)
./bin/yarn-session.sh -n 2 -s 2 -jm 1024 -tm 2048

# 提交任务到 Session
./bin/flink run -c com.example.MyJob /path/to/job.jar

Per-Job 模式:任务即集群

每个任务启动一个独立的 Flink 集群,任务结束集群自动销毁。

# 直接提交任务,YARN 自动分配资源
./bin/flink run -m yarn-cluster \
  -yjm 1024 -ytm 2048 \
  -ys 2 -yn 2 \
  -c com.example.MyJob /path/to/job.jar

经验之谈: 我建议生产环境用 Per-Job 模式。虽然 Session 模式启动快,但多个任务共享资源容易互相影响。Per-Job 模式每个任务独立,出了问题也只影响一个任务,排查起来方便很多。

4.4 配置调优:那些容易忽略的细节

配置这东西,看着简单,但细节决定成败。我把自己踩过的坑整理成了一张表,你照着配基本不会出大问题。

配置项 默认值 推荐值 说明
taskmanager.memory.process.size 1728m 4096m 或更高 TM 总内存,根据数据量调整
taskmanager.numberOfTaskSlots 1 CPU 核心数 每个 slot 跑一个子任务
parallelism.default 1 集群总 slot 数 全局默认并行度
jobmanager.memory.process.size 1600m 2048m JM 内存,任务多时适当增加
state.backend memory rocksdb 生产环境必须用 RocksDB
state.checkpoints.dir 无 hdfs:///flink/checkpoints Checkpoint 存储路径

小提示: 配置 state.backend.incremental: true 可以开启增量 Checkpoint。我有个任务状态量 50GB,开启后 Checkpoint 时间从 5 分钟降到了 30 秒。

4.5 验证部署:跑一个简单的任务

不管哪种模式,部署完都要验证一下。我习惯用 Flink 自带的 SocketWindowWordCount 来测试。

# 启动 netcat 发送数据
nc -lk 9999

# 提交测试任务(以 YARN Per-Job 为例)
./bin/flink run -m yarn-cluster \
  ./examples/streaming/SocketWindowWordCount.jar \
  --hostname localhost --port 9999

在 Web UI 上能看到任务运行状态,输入一些单词,看输出是否正常。嗯,这一步虽然简单,但能帮你快速发现配置问题。

最后提醒: 我曾经在生产环境遇到过一个问题:YARN 集群时间不同步,导致 Checkpoint 一直失败。所以,部署前一定要确保所有节点的时间同步(NTP 服务)。这个坑我踩过一次,再也没忘过。