2、Flink环境搭建:本地模式(Standalone)、YARN模式、Kubernetes模式的安装与配置
Flink 支持多种部署模式,以适应不同规模和场景的实时计算需求。本章将详细讲解三种最主流的部署方式:本地模式(Standalone)、YARN 模式 和 Kubernetes 模式。理解每种模式的架构、适用场景及配置要点,是搭建稳定、高效的实时特征计算环境的基础。
课前提示: 本章所有操作均基于 Flink 1.17 版本。请确保在开始前已准备好 Java 8 或 11 环境,并已下载对应版本的 Flink 安装包。生产环境建议统一使用 Linux 操作系统。
2.1 部署模式对比与选型
在动手安装之前,先通过下表快速了解三种模式的核心差异,以便根据实际场景做出选择。
| 对比维度 | Standalone 模式 | YARN 模式 | Kubernetes 模式 |
|---|---|---|---|
| 资源管理 | Flink 自身管理 | YARN (Hadoop) | Kubernetes |
| 适用场景 | 开发测试、小规模集群 | 已有 Hadoop 生态的企业 | 云原生、容器化、弹性伸缩 |
| 部署复杂度 | 低 | 中 | 高 |
| 资源利用率 | 较低(静态分配) | 高(动态分配) | 高(按需调度) |
| 运维成本 | 低 | 中 | 中高 |
| 与大数据生态集成 | 需手动集成 | 原生集成 | 通过 Operator 集成 |
选型建议:
- 学习/原型验证: 优先选择 Standalone 模式,快速启动,聚焦 Flink 本身。
- 企业生产(Hadoop 集群): 选择 YARN 模式,复用现有资源,管理成熟。
- 云原生/微服务架构: 选择 Kubernetes 模式,享受容器化带来的弹性与标准化。
2.2 Standalone 本地模式安装与配置
Standalone 模式是 Flink 最基础的部署方式,所有组件(JobManager、TaskManager)都在同一台或几台机器上以独立进程运行。本节以单节点模式为例进行演示。
2.2.1 安装步骤
- 解压安装包
tar -xzf flink-1.17.0-bin-scala_2.12.tgz cd flink-1.17.0 - 配置 Flink 参数(编辑
conf/flink-conf.yaml)# JobManager 地址(单节点为本机) jobmanager.rpc.address: localhost # JobManager 端口 jobmanager.rpc.port: 6123 # JobManager 堆内存 jobmanager.memory.process.size: 1600m # TaskManager 堆内存 taskmanager.memory.process.size: 1728m # 每台机器的 Task Slot 数 taskmanager.numberOfTaskSlots: 4 # 默认并行度 parallelism.default: 2 - 启动集群
./bin/start-cluster.sh - 验证启动
- 访问 Web UI:
http://localhost:8081 - 查看进程:
jps应看到StandaloneSessionClusterEntrypoint和TaskManagerRunner
- 访问 Web UI:
2.2.2 Standalone 模式架构图
下图展示了 Standalone 模式下 Flink 集群的核心组件与通信关系。
注意: Standalone 模式下的 JobManager 存在单点故障风险。生产环境建议配置 High Availability (HA),使用 ZooKeeper 实现 JobManager 主备切换。
2.3 YARN 模式安装与配置
YARN 模式将 Flink 作为 YARN 应用运行,由 YARN 的 ResourceManager 负责资源分配和容器管理。这是目前大数据生态中最主流的生产部署方式之一。
2.3.1 前置条件
- 已部署 Hadoop 集群(YARN 组件正常)
- 设置环境变量
HADOOP_CLASSPATH - Flink 安装包内包含
flink-shaded-hadoop-*jar 包,或手动配置 HADOOP_CLASSPATH
2.3.2 两种运行模式
| 模式 | 命令 | 特点 |
|---|---|---|
| Session 模式 | ./bin/yarn-session.sh |
预先启动一个常驻 YARN 集群,多个 Job 共享资源。适合短任务、交互式查询。 |
| Per-Job 模式 | ./bin/flink run -m yarn-cluster |
每个 Job 启动一个独立 YARN 集群,Job 结束后集群自动释放。适合长周期、资源隔离要求高的生产任务。 |
2.3.3 配置示例(Per-Job 模式)
# 提交 Flink 任务到 YARN
./bin/flink run \
-m yarn-cluster \
-yjm 1024 \ # JobManager 内存 (MB)
-ytm 2048 \ # TaskManager 内存 (MB)
-ys 2 \ # 每个 TaskManager 的 Slot 数
-ynm my_flink_job \ # YARN 应用名称
-c com.example.MyJob \
./path/to/your-job.jar
2.3.4 YARN 模式架构图
下图展示了 Flink 在 YARN 集群中的资源申请与任务执行流程。
生产建议: 在 YARN 模式下,务必配置
yarn.application-attempts 和 yarn.maximum-failed-containers 参数,以提升任务容错性。同时,开启 yarn.tags 便于在 YARN 管理界面快速定位 Flink 应用。
2.4 Kubernetes 模式安装与配置
Kubernetes (K8s) 模式是 Flink 云原生的部署方式,支持容器化、自动伸缩、滚动升级等特性。Flink 官方提供了 Flink Kubernetes Operator 来简化管理。
2.4.1 部署方式对比
| 方式 | 描述 | 适用场景 |
|---|---|---|
| Session 模式 | 在 K8s 中启动一个长期运行的 Flink 集群,多个 Job 提交到该集群。 | 开发测试、短任务共享集群。 |
| Job 模式 | 每个 Job 启动一个独立的 Flink 集群,Job 完成后集群自动销毁。 | 生产任务,资源隔离好。 |
| Application 模式 | Job 的 main() 方法在 K8s 集群内执行,打包更简洁。 |
生产任务,推荐方式。 |
2.4.2 使用 Flink Kubernetes Operator 部署
Operator 模式是目前最推荐的 K8s 部署方式,它通过自定义资源(CRD)管理 Flink 集群的生命周期。
- 安装 Operator
helm repo add flink-operator-repo https://downloads.apache.org/flink/flink-kubernetes-operator-1.7.0/ helm install flink-kubernetes-operator flink-operator-repo/flink-kubernetes-operator - 创建 FlinkDeployment 资源(YAML 文件:
flink-cluster.yaml)apiVersion: flink.apache.org/v1beta1 kind: FlinkDeployment metadata: name: my-flink-cluster spec: image: flink:1.17 flinkVersion: v1_17 flinkConfiguration: taskmanager.numberOfTaskSlots: "2" parallelism.default: "2" serviceAccount: flink jobManager: resource: memory: "1024m" cpu: 1 taskManager: resource: memory: "2048m" cpu: 1 - 部署集群
kubectl apply -f flink-cluster.yaml - 访问 Web UI
kubectl port-forward svc/my-flink-cluster-rest 8081:8081
2.4.3 Kubernetes 模式架构图
下图展示了 Flink 在 K8s 集群中通过 Operator 管理的核心组件关系。
关键优势:
- 声明式管理: 通过 YAML 定义集群状态,Operator 自动调和。
- 弹性伸缩: 支持基于 CPU/内存指标的 Horizontal Pod Autoscaler (HPA)。
- 滚动升级: 更新 Flink 版本或配置时,Operator 支持无中断滚动升级。
- 故障自愈: Pod 崩溃后自动重启,保证集群高可用。
2.5 环境验证与常见问题
无论使用哪种模式,部署完成后都应执行一个简单的 WordCount 任务来验证环境是否正常。
# 提交测试任务(以 Standalone 为例)
./bin/flink run ./examples/batch/WordCount.jar
# 查看 Web UI 中的 Job 执行状态
# 检查 TaskManager 日志是否有异常
常见问题排查:
- 端口冲突: 检查 8081 (Web UI)、6123 (RPC) 等端口是否被占用。
- 内存不足: 调整
jobmanager.memory.process.size和taskmanager.memory.process.size。 - YARN 队列权限: 确保提交用户有对应队列的提交权限。
- K8s 镜像拉取失败: 检查镜像仓库地址和拉取策略(ImagePullPolicy)。