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 安装步骤

  1. 解压安装包
    tar -xzf flink-1.17.0-bin-scala_2.12.tgz
    cd flink-1.17.0
  2. 配置 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
  3. 启动集群
    ./bin/start-cluster.sh
  4. 验证启动
    • 访问 Web UI:http://localhost:8081
    • 查看进程:jps 应看到 StandaloneSessionClusterEntrypoint 和 TaskManagerRunner

2.2.2 Standalone 模式架构图

下图展示了 Standalone 模式下 Flink 集群的核心组件与通信关系。

Standalone 模式架构图 Flink Client JobManager (ResourceManager / Dispatcher / JobMaster) TaskManager 1 Slot: 0 | 1 | 2 | 3 TaskManager 2 Slot: 0 | 1 | 2 | 3 TaskManager 3 Slot: 0 | 1 | 2 | 3 说明:Client 提交 JobGraph 给 JobManager,JobManager 负责调度并分发 Task 到各 TaskManager 的 Slot 中执行。
注意: 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 模式架构图(Per-Job) Flink Client YARN ResourceManager (资源调度) NodeManager 容器 JobManager (AM) NodeManager 容器 TaskManager Slot: 0 | 1 NodeManager 容器 TaskManager Slot: 0 | 1 流程:Client 提交任务 → RM 分配容器启动 AM (JobManager) → AM 向 RM 申请资源 → 启动 TaskManager 容器执行 Task。 Per-Job 模式下,Job 完成后所有容器自动释放。
生产建议: 在 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 集群的生命周期。

  1. 安装 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
  2. 创建 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
  3. 部署集群
    kubectl apply -f flink-cluster.yaml
  4. 访问 Web UI
    kubectl port-forward svc/my-flink-cluster-rest 8081:8081

2.4.3 Kubernetes 模式架构图

下图展示了 Flink 在 K8s 集群中通过 Operator 管理的核心组件关系。

Kubernetes 模式架构图(Operator 管理) K8s Master (API Server / Scheduler) Flink Operator (管理 CRD: FlinkDeployment) Pod: JobManager Container: flink-jm Pod: TaskManager Container: flink-tm Pod: TaskManager Container: flink-tm 说明:Flink Operator 监听 FlinkDeployment CRD,自动创建/管理 JobManager 和 TaskManager 的 Pod,并处理扩缩容与故障恢复。
关键优势:
  • 声明式管理: 通过 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)。