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]  [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 的话,作业会随着终端会话结束而终止。

知识体系总览

下面这张图帮你理清本章的核心脉络:

Flink 部署模式知识体系 Flink 部署模式 Local 模式 Standalone 模式 YARN 模式 Kubernetes 模式 各模式适用场景 • Local:本地开发调试,快速验证逻辑 • Standalone:小规模测试集群,适合 POC 项目 • YARN:生产环境主流选择,资源管理成熟 • K8s:云原生趋势,适合容器化部署 核心建议:开发用 Local,生产用 YARN,未来看 K8s

好了,这一章的内容就到这里。你跟着把 Local 模式跑通,再试试 YARN 模式提交一个作业,基本就入门了。记住,环境搭建是基础,基础打牢了,后面写实时 ETL 作业才不慌。