Flink 的部署模式非常灵活,主要分为单机模式(Standalone)、集群模式(Standalone Cluster) 和基于资源管理器的模式(如 YARN, Kubernetes, Mesos)。

对于学习和测试,通常从单机和 Standalone 集群开始;而对于生产环境,YARN 和 Kubernetes 是更主流的选择。


一、核心概念与部署模式简介

在开始安装前,先了解两个核心概念:

  1. JobManager (Master): 负责协调分布式任务的执行,如调度任务、协调检查点(Checkpoint)、故障恢复等。它是集群的“大脑”。
  2. TaskManager (Worker): 负责执行数据流中的具体任务(Tasks),并提供内存来存储缓存数据。每个 Worker 都是一个 JVM 进程。

基于这两个组件,Flink 主要有三种部署模式:

  • Session Mode (会话模式): 先启动一个长期运行的集群(包含 JobManager 和 TaskManagers),然后向这个集群提交多个作业。所有作业共享集群资源。适合执行时间短、交互式的查询作业。
  • Per-Job Mode (作业模式): 为每个提交的作业启动一个独立的集群。作业完成后,集群资源释放。作业之间资源隔离性好,适合长期运行的大型作业。
  • Application Mode (应用模式): 将应用程序的 main() 方法在集群上运行,而不是在客户端运行。这减轻了客户端的压力,并且更好地实现了应用依赖的隔离。这是推荐的生产模式之一。

二、准备工作

  1. Java: 确保所有节点已安装 Java 8 或 11。这是运行 Flink 的唯一必需条件。
    java -version
    
  2. 下载 Flink: 从 Apache Flink 官网 下载稳定版本的二进制包,如 flink-1.17.1-bin-scala_2.12.tgz。
  3. SSH 无密码登录(集群模式): 如果你要部署多节点的 Standalone 集群,需要配置主节点到所有工作节点的 SSH 无密码登录。

三、安装部署实践

模式 1:本地单机模式 (Local)

这是最简单的方式,主要用于本地测试和调试。它会在单个 JVM 进程中启动一个迷你集群(包含一个 JobManager 和一个 TaskManager)。

步骤:

  1. 解压下载的 Flink 包。
    tar -xzf flink-1.17.1-bin-scala_2.12.tgz
    cd flink-1.17.1
    
  2. 启动集群。
    ./bin/start-cluster.sh
    
  3. 访问 Web UI。默认地址是 http://localhost:8081。在这里你可以查看集群状态、提交作业、查看日志等。
  4. 停止集群。
    ./bin/stop-cluster.sh
    
模式 2:Standalone 集群模式

这种模式使用 Flink 自带的资源调度器,不依赖外部平台(如 YARN)。

架构:

  • 1 个主节点 (Master):运行 JobManager
  • N 个工作节点 (Workers):运行 TaskManager

步骤(以 1 主 2 从为例):

  1. 修改配置 (conf/flink-conf.yaml):

    # 主节点的地址(或者使用主节点主机名,需配置hosts)
    jobmanager.rpc.address: master-node-ip-or-hostname
    
    # 每个 TaskManager 可用的总内存。根据机器配置调整。
    taskmanager.memory.process.size: 2048m
    
    # 每个 TaskManager 可用的任务槽数(通常设置为CPU核心数)
    taskmanager.numberOfTaskSlots: 4
    
    # 并行度默认值
    parallelism.default: 3
    
  2. 修改工作节点列表 (conf/workers):

    # 列出所有 TaskManager 节点的主机名或IP
    worker-node-1-ip-or-hostname
    worker-node-2-ip-or-hostname
    
  3. 分发 Flink 目录: 将配置好的 Flink 目录完整地拷贝到所有工作节点相同的路径下。

  4. 启动集群: 在主节点上执行:

    ./bin/start-cluster.sh
    

    这个脚本会通过 SSH 连接到所有 workers 文件中列出的节点,并启动 TaskManager 进程。

  5. 验证: 访问主节点的 http://master-node-ip:8081,在 “Task Managers” 标签页中应该能看到两个已注册的 TaskManager。

模式 3:在 YARN 上部署 (生产常用)

YARN 模式是生产环境中最常用的模式之一。Flink 客户端会与 YARN ResourceManager 通信,在 YARN 上启动 JobManager (作为 ApplicationMaster),然后由它申请 Container 来启动 TaskManagers。

步骤:

  1. 环境准备: 确保已设置 JAVA_HOME、HADOOP_HOME 环境变量,并且 Flink 的 lib 目录下有 flink-shaded-hadoop-3-uber-*.jar(用于连接对应版本的 Hadoop)。

  2. 提交作业 (Session Mode 示例):

    # 启动一个 YARN Session 集群
    ./bin/yarn-session.sh -nm MyFlinkSession -tm 2048 -s 2 -jm 1024
    
    # 在新的终端中,向这个已启动的 Session 集群提交作业
    ./bin/flink run ./examples/streaming/WordCount.jar
    
  3. 提交作业 (Per-Job Mode 示例 - 更推荐):

    # -t yarn-per-job 指定部署模式
    ./bin/flink run -t yarn-per-job \
      -yjm 1024 \
      -ytm 2048 \
      -ys 2 \
      ./examples/streaming/WordCount.jar
    
    • -yjm: JobManager 内存 (MB)
    • -ytm: 每个 TaskManager 内存 (MB)
    • -ys: 每个 TaskManager 的任务槽数 (Task Slots)
  4. 提交作业 (Application Mode 示例 - 最新推荐):

    ./bin/flink run-application -t yarn-application \
      -Djobmanager.memory.process.size=1024m \
      -Dtaskmanager.memory.process.size=2048m \
      -Dparallelism.default=4 \
      -Dtaskmanager.numberOfTaskSlots=2 \
      ./MyFlinkApp.jar
    
模式 4:在 Kubernetes 上部署 (云原生趋势)

这是云原生架构下的主流选择,容器化部署提供了极好的资源隔离和弹性伸缩能力。

主要方式:

  1. Native Deployment: 使用 kubectl 直接部署 Flink 的自定义资源(需要先部署 Flink Operator)。
  2. Standalone Deployment: 手动创建 JobManager 和 TaskManager 的 Deployment 和 Service。
  3. 使用 flink run-application: Flink 客户端直接与 Kubernetes API 交互来部署应用。

简单示例 (使用 flink run-application):

./bin/flink run-application -t kubernetes-application \
  -Dkubernetes.cluster-id=my-flink-cluster \
  -Dtaskmanager.memory.process.size=2048m \
  -Dkubernetes.taskmanager.cpu=2 \
  -Dparallelism.default=5 \
  -Dkubernetes.container.image=my-flink-image:latest \
  local:///opt/flink/usrlib/my-job.jar

这需要提前配置好 ~/.kube/config 文件以连接 Kubernetes 集群。


四、总结与建议

模式适用场景优点缺点
本地单机本地测试、学习极简,无需配置无分布式能力
Standalone中小规模集群,无YARN/K8s简单,不依赖外部组件需要自己管理资源,无高级调度
YARN生产环境(已有Hadoop生态)资源管理强大,与Hadoop集成深部署配置稍复杂
Kubernetes生产环境(云原生、混合云)弹性伸缩,资源隔离好,DevOps友好运维复杂度高,需要K8s知识

给初学者的建议:

  1. 从本地单机模式开始,熟悉 Web UI 和基本操作。
  2. 然后在Standalone 集群模式下,尝试在两台虚拟机上部署,理解主从架构。
  3. 最后再深入研究 YARN 或 Kubernetes 这种生产级部署模式。

希望这个详细的讲解能帮助你顺利部署 Flink!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐