2. Flink环境搭建:从本地到集群的实战部署
说实话,搞Flink开发,第一步就是搭环境。很多初学者觉得这步没啥技术含量,随便装个单机版就开始写代码了。但我见过太多人,本地跑得好好的,一上集群就各种报错——ClassNotFound、端口冲突、内存溢出……说白了,就是没理解不同部署模式背后的差异。
这一章,我会带你走一遍Flink的四种部署方式:本地模式、Standalone集群、YARN模式,以及怎么用命令行提交作业。每种模式我都会结合项目中的实际经验来讲,该避的坑一个不落。
本章核心脉络:从单机调试到生产集群,理解每种模式的适用场景和配置要点。
2.1 本地模式:快速上手调试
本地模式是Flink最简单的运行方式。说白了,它把JobManager和TaskManager都跑在同一个JVM进程里。我刚开始学Flink时,就是用这个模式在笔记本上跑WordCount的。
安装步骤:
- 下载Flink:去官网或者镜像站,我习惯用清华镜像,速度快。选对应Hadoop版本的包,比如
flink-1.17.0-bin-scala_2.12.tgz - 解压:
tar -xzf flink-*.tgz - 启动:
./bin/start-cluster.sh - 访问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。
配置步骤:
- 修改
conf/flink-conf.yaml:
# JobManager地址
jobmanager.rpc.address: node01
# TaskManager的slot数,建议等于CPU核心数
taskmanager.numberOfTaskSlots: 4
# 并行度默认值
parallelism.default: 2
- 修改
conf/workers(旧版本叫slaves),每行一个TaskManager节点:
node02
node03
node04
- 把整个Flink目录分发到所有节点:
scp -r flink-1.17.0 node02:/opt/ - 在主节点启动集群:
./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。
配置要点:
- 确保
HADOOP_CLASSPATH已配置,或者把Hadoop配置放到conf/目录下。 - 启动Session集群:
./bin/yarn-session.sh -n 4 -s 4 -jm 2048 -tm 8192
参数说明:-n TaskManager数量,-s 每个TaskManager的slot数,-jm JobManager内存(MB),-tm TaskManager内存(MB)。
- 提交作业到Session:
./bin/flink run -m yarn-cluster ./examples/streaming/SocketWindowWordCount.jar
- 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模式才是王道。