2. Flink环境搭建:三种部署模式实战
聊到Flink环境搭建,我得先说说自己的经历。刚接触Flink那会儿,我踩过不少坑——配置文件写错一个参数,集群半天起不来;版本选不对,跟Hadoop生态打架。后来慢慢摸清了门道,发现其实就三种主流部署模式:Standalone、YARN、Kubernetes。今天我把它们掰开揉碎了讲给你听。
2.1 环境准备:先把地基打牢
不管选哪种模式,有些东西是绕不开的。我个人习惯先把基础环境准备好,省得到后面手忙脚乱。
| 组件 | 版本要求 | 备注 |
|---|---|---|
| JDK | 1.8+(推荐11) | Flink 1.14+ 对JDK11支持更好 |
| SSH | 无密码登录 | Standalone模式必须 |
| Hadoop | 2.8+ / 3.x | YARN模式需要 |
| Docker | 20.10+ | Kubernetes模式可选 |
2.2 Standalone模式:最简单,也最直接
Standalone模式,说白了就是Flink自己管资源。不需要依赖Hadoop、YARN这些外部系统。适合开发测试,或者小规模集群。
2.2.1 安装步骤
- 下载Flink安装包,解压到指定目录
- 配置
conf/flink-conf.yaml - 配置
conf/workers(TaskManager节点列表) - 启动集群
核心配置长这样:
# conf/flink-conf.yaml
jobmanager.rpc.address: node01
jobmanager.rpc.port: 6123
jobmanager.memory.process.size: 1600m
taskmanager.memory.process.size: 1728m
taskmanager.numberOfTaskSlots: 4
parallelism.default: 2
关键点: taskmanager.numberOfTaskSlots 决定了每个TaskManager能跑几个子任务。我一般设成CPU核心数,或者稍微少一点,留点余量给系统。
启动命令很简单:
# 启动集群
./bin/start-cluster.sh
# 检查进程
jps # 应该看到 StandaloneSessionClusterEntrypoint 和 TaskManagerRunner
# 访问Web UI
# http://node01:8081
嗯,这里要注意——如果你在本地跑,记得把 jobmanager.rpc.address 改成 localhost。我在项目里遇到过有人直接复制生产配置,结果本地启动一直连不上,查了半天才发现是地址写死了。
2.2.2 提交作业
./bin/flink run -m node01:8081 -p 4 ./examples/streaming/WordCount.jar
-m 指定JobManager地址,-p 指定并行度。Standalone模式下,并行度不能超过所有TaskManager的slot总数。
2.3 YARN模式:生产环境的首选
说实话,我在生产环境里用得最多的就是YARN模式。为什么?因为资源可以动态分配,跟Hadoop生态无缝集成。你想想看,公司里大数据平台基本都是Hadoop那一套,Flink跑在YARN上,资源管理、权限控制都现成的。
2.3.1 两种运行方式
| 方式 | 特点 | 适用场景 |
|---|---|---|
| Session模式 | 共享集群,多个作业共用 | 小作业多,资源复用 |
| Per-Job模式 | 每个作业独享集群 | 大作业,资源隔离要求高 |
2.3.2 配置与启动
首先确保 HADOOP_CLASSPATH 配好了:
export HADOOP_CLASSPATH=`hadoop classpath`
Session模式启动:
# 启动YARN Session
./bin/yarn-session.sh -nm flink-session -s 4 -jm 1024 -tm 2048
# 提交作业到Session
./bin/flink run -d -yid application_xxx_xxxx ./examples/streaming/WordCount.jar
Per-Job模式更直接:
./bin/flink run -m yarn-cluster \
-yjm 1024 -ytm 2048 -ys 4 \
./examples/streaming/WordCount.jar
-yid,结果作业提交到了默认的Session里,资源抢占导致两个大作业互相拖垮。记住:Per-Job模式用 -m yarn-cluster,Session模式用 -yid 指定。
2.4 Kubernetes模式:云原生的未来
Kubernetes模式,说白了就是把Flink容器化,跑在K8s上。这两年越来越流行,尤其是微服务架构的公司。我去年帮一家金融客户搭过,效果确实好——弹性伸缩、滚动升级,运维成本低了不少。
2.4.1 两种部署方式
- Native模式: Flink直接跟K8s API交互,自己管理Pod
- Operator模式: 通过Flink Operator管理,更自动化
我个人更推荐Operator模式,尤其是集群规模大的时候。Operator帮你处理了故障恢复、版本升级这些脏活累活。
2.4.2 快速部署
先装Flink Operator:
# 安装Operator
helm repo add flink-operator-repo https://downloads.apache.org/flink/flink-kubernetes-operator-1.6.0/
helm install flink-kubernetes-operator flink-operator-repo/flink-kubernetes-operator
然后定义Flink集群的YAML:
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
name: my-flink-cluster
spec:
image: flink:1.16.0
flinkVersion: v1_16
serviceAccount: flink
jobManager:
resource:
memory: "1024m"
cpu: 1
taskManager:
resource:
memory: "2048m"
cpu: 2
job:
jarURI: local:///opt/flink/examples/streaming/WordCount.jar
parallelism: 4
应用配置:
kubectl apply -f flink-cluster.yaml
2.5 三种模式对比
我把它们放在一起对比一下,方便你选型:
| 维度 | Standalone | YARN | Kubernetes |
|---|---|---|---|
| 资源管理 | 静态 | 动态 | 动态 |
| 部署复杂度 | 低 | 中 | 高 |
| 弹性伸缩 | 手动 | 自动 | 自动 |
| 运维成本 | 低 | 中 | 中高 |
| 适用场景 | 开发测试 | 生产环境 | 云原生 |
2.6 核心知识体系
下面这张图把三种模式的核心流程串起来了,你看一眼就能明白整体架构:
2.7 常见问题与避坑
最后分享几个我踩过的坑,你遇到了能少走弯路:
- 端口冲突: Standalone模式下,如果多集群共用机器,记得改
jobmanager.rpc.port和rest.port。我见过两个集群端口一样,结果互相干扰,作业莫名其妙挂掉。 - 内存配置: YARN模式下,
yarn.nodemanager.resource.memory-mb要大于Flink申请的yjm + ytm。否则ResourceManager会直接拒绝,报错信息还不明显。 - K8s镜像拉取: 私有仓库记得配
imagePullSecrets。我曾经忘了配,Pod一直ImagePullBackOff,排查了半天才发现是认证问题。
一句话总结: 环境搭建没有银弹。Standalone适合练手,YARN适合生产,Kubernetes面向未来。选哪个,取决于你的团队技术栈和运维能力。