2. Flink环境搭建与部署
说实话,Flink 的环境搭建是很多初学者第一道坎。我记得刚接触 Flink 那会儿,光是在 YARN 上部署就折腾了两天。后来带团队做实时 ETL 项目,发现不少同事也是卡在这一步。今天我就把几种部署模式掰开揉碎讲清楚,你跟着走一遍,基本就能上手了。
Flink 的四种安装模式
Flink 支持四种部署模式,说白了就是「怎么跑起来」的问题。我按复杂度从小到大给你捋一遍:
| 模式 | 适用场景 | 资源管理 | 生产推荐度 |
|---|---|---|---|
| Local | 本地开发调试 | 本机进程 | ⭐ |
| Standalone | 小规模测试集群 | Flink 自带 | ⭐⭐ |
| YARN | 生产环境(主流) | Hadoop YARN | ⭐⭐⭐⭐⭐ |
| Kubernetes | 容器化生产环境 | K8s | ⭐⭐⭐⭐ |
我的建议:如果你刚入门,先从 Local 模式跑通第一个 WordCount。等理解了作业提交流程,再切到 YARN 模式。别一上来就搞 K8s,容易劝退。
Local 模式:5 分钟跑起来
Local 模式最简单。你下载好 Flink 压缩包,解压,直接启动就行。
# 下载 Flink 1.17.0
wget https://archive.apache.org/dist/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
# 启动本地集群
./bin/start-cluster.sh
启动后,打开浏览器访问 http://localhost:8081,就能看到 Flink Web UI 了。嗯,这里要注意——Local 模式本质是在本机启动一个 JVM 进程,JobManager 和 TaskManager 都在同一个进程里。所以它只适合你写代码时快速验证逻辑。
小技巧:我在本地调试时,经常用 ./bin/stop-cluster.sh 停掉集群。如果遇到端口被占用,检查一下是不是之前没关干净。
Standalone 模式:搭建一个迷你集群
Standalone 模式会启动独立的 JobManager 和 TaskManager 进程。我早期做 POC(概念验证)项目时用过这种模式,配置起来很直接。
你需要修改 conf/flink-conf.yaml 里的几个关键参数:
# JobManager 地址
jobmanager.rpc.address: node01
# TaskManager 的 slot 数量
taskmanager.numberOfTaskSlots: 4
# 并行度
parallelism.default: 2
然后在主节点启动:
./bin/start-cluster.sh
从节点会自动注册到 JobManager。你可以在 Web UI 的 Task Managers 页面看到所有节点。
避坑指南:我曾经在生产环境遇到过 Standalone 模式下 TaskManager 内存溢出。原因是默认的 taskmanager.memory.process.size 只有 1GB,处理大状态作业时根本不够。建议至少配到 4GB 以上。
YARN 模式:生产环境的首选
YARN 模式是我最推荐的。它把资源管理交给 Hadoop YARN,Flink 只负责计算。说白了,你不用操心集群资源怎么分配,YARN 会帮你搞定。
YARN 模式有两种提交流程:
- Session 模式:先启动一个 Flink 集群常驻在 YARN 上,然后往里面提交作业。适合短作业多、频繁提交的场景。
- Per-Job 模式:每个作业单独启动一个 Flink 集群,作业结束后自动释放资源。适合长作业、资源隔离要求高的场景。
提交命令也很简单:
# Session 模式 - 先启动集群
./bin/yarn-session.sh -n 4 -s 4 -jm 2048 -tm 4096
# 然后提交作业
./bin/flink run -m yarn-cluster -yn 4 ./examples/streaming/WordCount.jar
# Per-Job 模式 - 一步到位
./bin/flink run -m yarn-cluster \
-yjm 2048 -ytm 4096 -ys 4 \
./examples/streaming/WordCount.jar
经验之谈:我在做实时 ETL 时,90% 的作业都用 Per-Job 模式。原因很简单——每个作业独立运行,一个挂了不影响其他作业。Session 模式虽然省资源,但一旦集群出问题,所有作业都受影响。
Kubernetes 模式:云原生的未来
K8s 模式是趋势。如果你的公司已经在用容器化部署,那 Flink on K8s 是自然的选择。Flink 支持两种 K8s 部署方式:
- Native Kubernetes:Flink 直接调用 K8s API 创建 Pod
- Standalone Kubernetes:手动管理 Pod,适合自定义网络配置
我建议用 Native 模式,省心。配置示例:
# 先创建 ConfigMap
kubectl create configmap flink-config --from-file=conf/
# 提交作业到 K8s
./bin/flink run-application \
-t kubernetes-application \
-Dkubernetes.cluster-id=my-flink-cluster \
-Dkubernetes.container.image=flink:1.17.0 \
-Djobmanager.memory.process.size=2048m \
-Dtaskmanager.memory.process.size=4096m \
-Dtaskmanager.numberOfTaskSlots=4 \
local:///opt/flink/usrlib/my-etl-job.jar
注意:K8s 模式需要提前配置好 RBAC 权限和 ServiceAccount。我踩过这个坑——忘了配权限,结果 Flink 创建不了 Pod,报了一堆 403 错误。
Flink Web UI 介绍
Web UI 是你调试作业的利器。打开 http://localhost:8081,你会看到这几个核心页面:
| 页面 | 作用 | 我常用的功能 |
|---|---|---|
| Overview | 集群概览,显示 JobManager 和 TaskManager 状态 | 看集群是否健康 |
| Running Jobs | 当前运行的作业列表 | 查看作业状态、取消作业 |
| Completed Jobs | 已完成的作业 | 分析历史作业的指标 |
| Task Managers | 所有 TaskManager 的详细信息 | 检查内存使用、GC 情况 |
| Job Manager | JobManager 的配置和日志 | 查看异常日志 |
你想想看,一个作业跑着跑着突然慢了,你第一反应是什么?我一般先看 TaskManager 的内存使用,再看 GC 频率。如果 GC 频繁,说明内存不够或者状态太大。
Flink 命令行提交作业
命令行是生产环境最常用的提交流程。基本语法:
./bin/flink run [options] <jar-file> [arguments]
常用参数:
-m或--jobmanager:指定 JobManager 地址-p或--parallelism:设置并行度-d或--detached:后台运行,不阻塞终端-c或--class:指定主类
举个例子,提交一个实时 ETL 作业:
./bin/flink run \
-m yarn-cluster \
-p 8 \
-d \
-c com.example.RealTimeETLJob \
./flink-etl-job-1.0.jar \
--input kafka://topic:orders \
--output mysql://table:order_summary
重要提醒:提交作业时一定要加 -d 参数。我刚开始做项目时忘了加,结果终端一关,作业就停了。后来才知道,不加 -d 的话,作业会随着终端会话结束而终止。
知识体系总览
下面这张图帮你理清本章的核心脉络:
好了,这一章的内容就到这里。你跟着把 Local 模式跑通,再试试 YARN 模式提交一个作业,基本就入门了。记住,环境搭建是基础,基础打牢了,后面写实时 ETL 作业才不慌。