2. Flink环境搭建:从本地到集群的实战部署

说实话,搞Flink开发,第一步就是搭环境。很多初学者觉得这步没啥技术含量,随便装个单机版就开始写代码了。但我见过太多人,本地跑得好好的,一上集群就各种报错——ClassNotFound、端口冲突、内存溢出……说白了,就是没理解不同部署模式背后的差异。

这一章,我会带你走一遍Flink的四种部署方式:本地模式、Standalone集群、YARN模式,以及怎么用命令行提交作业。每种模式我都会结合项目中的实际经验来讲,该避的坑一个不落。

本章核心脉络:从单机调试到生产集群,理解每种模式的适用场景和配置要点。

Flink 部署模式全景图 Flink 部署模式 本地模式 (Local) Standalone 集群 YARN 模式 K8s 📌 各模式适用场景 • 本地模式:开发调试、单元测试、学习入门 • Standalone:小规模集群、测试环境、快速验证 • YARN模式:生产环境首选,资源统一管理,与Hadoop生态集成 • K8s模式:容器化部署,弹性伸缩,云原生场景

2.1 本地模式:快速上手调试

本地模式是Flink最简单的运行方式。说白了,它把JobManager和TaskManager都跑在同一个JVM进程里。我刚开始学Flink时,就是用这个模式在笔记本上跑WordCount的。

安装步骤:

  1. 下载Flink:去官网或者镜像站,我习惯用清华镜像,速度快。选对应Hadoop版本的包,比如 flink-1.17.0-bin-scala_2.12.tgz
  2. 解压:tar -xzf flink-*.tgz
  3. 启动:./bin/start-cluster.sh
  4. 访问Web UI:浏览器打开 http://localhost:8081

💡 小技巧:本地模式下,默认并行度等于你机器的CPU核心数。如果你只是想快速验证逻辑,可以在代码里显式设置 env.setParallelism(1),避免资源争抢。

启动后,你会看到两个进程:一个Flink JobManager,一个Flink TaskManager。这时候提交一个示例作业试试:

./bin/flink run ./examples/streaming/SocketWindowWordCount.jar --port 9000

然后在另一个终端开个netcat发数据:nc -lk 9000,随便敲几个单词,看看控制台输出。嗯,能跑通就说明环境没问题。

⚠️ 注意:本地模式默认使用临时目录存储检查点和作业元数据。一旦进程重启,所有状态都会丢失。所以它只适合开发调试,千万别在生产环境用。

2.2 Standalone集群:自己动手搭集群

Standalone模式,就是Flink自己管理资源,不依赖YARN或K8s。我早期在一个数据中台项目里用过,当时Hadoop集群还没建好,就先搭了个Standalone集群做实时ETL。

部署架构:

  • JobManager:负责调度、协调、Web UI。一般部署1台,生产环境建议配HA(高可用)。
  • TaskManager:真正干活的节点,执行算子。可以部署多台,每台配置slot数。
  • Slot:TaskManager内部的资源单元,每个slot可以运行一个subtask。

配置步骤:

  1. 修改 conf/flink-conf.yaml:
# JobManager地址
jobmanager.rpc.address: node01
# TaskManager的slot数,建议等于CPU核心数
taskmanager.numberOfTaskSlots: 4
# 并行度默认值
parallelism.default: 2
  1. 修改 conf/workers(旧版本叫slaves),每行一个TaskManager节点:
node02
node03
node04
  1. 把整个Flink目录分发到所有节点:scp -r flink-1.17.0 node02:/opt/
  2. 在主节点启动集群:./bin/start-cluster.sh

启动后,访问 http://node01:8081,你应该能看到所有TaskManager都注册上来了。

配置项 默认值 生产建议 说明
jobmanager.memory.process.size 1g 4g-8g JobManager堆内存,作业多时调大
taskmanager.memory.process.size 1g 8g-32g TaskManager总内存,根据数据量调整
taskmanager.numberOfTaskSlots 1 CPU核心数 每个slot一个线程,不宜过多
parallelism.default 1 总slot数 全局默认并行度

⚠️ 我曾经踩过的坑:Standalone模式下,如果TaskManager挂了,Flink不会自动重启它。你得写个监控脚本或者用systemd来保证进程存活。另外,所有节点的时间必须同步,否则事件时间语义会出问题——我因为这个排查了整整一个下午。

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

YARN模式,说白了就是把Flink作业当成一个YARN应用来跑。资源由YARN统一管理,跟MapReduce、Spark共享集群。我个人强烈建议,如果你的公司已经有Hadoop集群,直接用YARN模式,别折腾Standalone。

两种运行方式:

  • Session模式:先启动一个Flink集群在YARN上,然后往这个集群提交作业。适合短作业、交互式查询。
  • Per-Job模式:每个作业单独启动一个Flink集群,作业结束集群自动释放。适合长作业、生产ETL。

配置要点:

  1. 确保 HADOOP_CLASSPATH 已配置,或者把Hadoop配置放到 conf/ 目录下。
  2. 启动Session集群:
./bin/yarn-session.sh -n 4 -s 4 -jm 2048 -tm 8192

参数说明:-n TaskManager数量,-s 每个TaskManager的slot数,-jm JobManager内存(MB),-tm TaskManager内存(MB)。

  1. 提交作业到Session:
./bin/flink run -m yarn-cluster ./examples/streaming/SocketWindowWordCount.jar
  1. Per-Job模式直接提交:
./bin/flink run -m yarn-cluster \
  -yjm 2048 -ytm 8192 \
  -ys 4 -yn 4 \
  ./my-job.jar

💡 经验之谈:Per-Job模式在Flink 1.15之后改名叫Application模式了。我个人更推荐Application模式,因为JobManager和TaskManager的资源配置可以针对每个作业单独调优,互不影响。

2.4 命令行提交作业:日常操作必备

不管用哪种部署模式,最终都要通过 flink run 命令提交作业。这里我总结几个最常用的命令和参数。

基本语法:

./bin/flink run [OPTIONS] <job-jar> [job-args]

常用选项:

选项 说明 示例
-m 或 --jobmanager 指定JobManager地址 -m yarn-cluster 或 -m localhost:8081
-c 或 --class 指定入口类 -c com.example.MyJob
-p 或 --parallelism 覆盖作业并行度 -p 8
-d 或 --detached 后台运行,不阻塞终端 -d
-s 或 --fromSavepoint 从指定savepoint恢复 -s hdfs:///flink/savepoints/savepoint-xxx

实际案例:提交一个带checkpoint的作业到YARN集群

./bin/flink run -m yarn-cluster \
  -d \
  -c com.example.UserBehaviorAnalysis \
  -p 16 \
  -ys 4 \
  -yjm 4096 \
  -ytm 16384 \
  /data/jars/user-behavior-1.0.jar \
  --input hdfs:///data/user_behavior.log \
  --output hdfs:///output/result

🔑 关键点:-d 参数一定要加,否则你关掉终端作业就停了。我刚开始用Flink时就犯过这个错,跑了一晚上的作业,早上来发现终端超时断开了,作业也跟着没了……

查看和管理作业:

  • 列出所有作业:./bin/flink list -m yarn-cluster
  • 取消作业:./bin/flink cancel <job-id> -m yarn-cluster
  • 触发savepoint:./bin/flink savepoint <job-id> hdfs:///flink/savepoints -m yarn-cluster

嗯,到这里,Flink的四种部署模式就讲完了。从本地模式的一键启动,到Standalone的手动搭建,再到YARN模式的生产级部署,每一步都有它的适用场景。你想想看,如果只是学习,本地模式就够了;如果是团队协作,Standalone能快速验证;但真要上生产,YARN模式才是王道。