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模式可选
我的建议: 别用太新的版本。Flink 1.13到1.16之间选一个,生态最成熟。我曾经追新用了1.17,结果发现好几个connector还没适配,折腾了两天才降回来。

2.2 Standalone模式:最简单,也最直接

Standalone模式,说白了就是Flink自己管资源。不需要依赖Hadoop、YARN这些外部系统。适合开发测试,或者小规模集群。

2.2.1 安装步骤

  1. 下载Flink安装包,解压到指定目录
  2. 配置 conf/flink-conf.yaml
  3. 配置 conf/workers(TaskManager节点列表)
  4. 启动集群

核心配置长这样:

# 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
避坑指南: 我曾经在Per-Job模式下忘记设置 -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
我的经验: K8s模式下,镜像大小是个坑。Flink基础镜像就1个多G,加上依赖的jar包,动不动2-3G。我建议用多阶段构建,或者把公共依赖打到基础镜像里,业务jar挂载进去。这样每次更新只传几MB,快多了。

2.5 三种模式对比

我把它们放在一起对比一下,方便你选型:

维度 Standalone YARN Kubernetes
资源管理 静态 动态 动态
部署复杂度 低 中 高
弹性伸缩 手动 自动 自动
运维成本 低 中 中高
适用场景 开发测试 生产环境 云原生

2.6 核心知识体系

下面这张图把三种模式的核心流程串起来了,你看一眼就能明白整体架构:

Flink部署模式核心架构 Flink 应用 Standalone 模式 JobManager + TaskManager 静态资源分配 适合开发测试 YARN 模式 Session / Per-Job 动态资源管理 生产环境首选 Kubernetes 模式 Native / Operator 容器化部署 云原生架构 实时数据交换体系 统一作业提交、监控、运维 选型建议 开发测试 → Standalone | 生产环境 → YARN | 云原生 → Kubernetes 三种模式可共存,根据业务场景灵活切换

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面向未来。选哪个,取决于你的团队技术栈和运维能力。