详细介绍:Flink 2.x 独立集群(Standalone) 的部署
Apache Flink 2.x 独立集群(Standalone Cluster) 的部署是一种不依赖外部资源管理器(如 YARN 或 Kubernetes)的经典部署模式,非常适合中小规模生产环境、测试和概念验证。
一、 Standalone 集群架构剖析
1. 核心组件
一个 Flink Standalone 集群由两种进程组成,形成一种主从(Master-Worker)架构:
JobManager (主节点/Master):
职责: 集群的"大脑"。负责接收提交的作业(Job),调度任务(Task),协调检查点(Checkpoint),故障恢复等。
高可用(HA)模式: 通常需要部署多个 JobManager,其中一个为 Leader(活跃状态),其他为 Standby(备用状态)。通过 ZooKeeper 进行领导者选举和元数据存储,实现故障自动切换。
关键进程:
StandaloneSessionClusterEntrypoint
TaskManager (工作节点/Worker):
职责: 集群的"肌肉"。负责执行 JobManager 分配的具体数据任务(Task)。每个 TaskManager 是一个独立的 JVM 进程,提供一定数量的任务槽(Task Slot)。
任务槽: 是 Flink 资源调度的基本单位。一个 Slot 可以执行一个任务子任务(Subtask)。一个 TaskManager 的多个 Slot 共享该节点的网络和内存资源,但彼此隔离。
关键进程:
TaskManagerRunner
2. 高可用实现原理
Standalone 模式的高可用性严重依赖外部系统:
ZooKeeper: 用于在所有 JobManager 实例之间进行分布式协调和领导者选举。当活跃的 JobManager 宕机时,ZooKeeper 会通知备用的 JobManager,使其迅速接管领导权。
分布式文件系统(HDFS/S3/OSS等): 用于持久化存储元数据和检查点(Checkpoint)/保存点(Savepoint) 数据。新的 JobManager 在接管后,可以从这里恢复作业状态。
3. 架构拓扑图
图表
代码
渲染失败
如图所示,客户端向主 JobManager 提交作业,JobManager 将任务分配给各个 TaskManager 执行。同时,主 JobManager 通过 ZooKeeper 与其他备用 JobManager 保持协调,并将关键的元数据和状态快照持久化到共享存储中。
二、 独立集群部署与配置详解
1. 前置准备
机器规划:
1台 Master 主机: 运行 JobManager(生产环境建议至少2台,一主一备)。
N台 Worker 主机: 运行 TaskManager。
(可选)3台主机: 用于 ZooKeeper 集群(也可部署在 Master/Worker 机器上,测试环境可用1台)。
软件依赖:
Java: 在所有节点安装 JDK 8 或 JDK 11,并配置
JAVA_HOME
。SSH 免密登录: 从 Master 节点到所有 Worker 节点需配置 SSH 免密登录,以便通过脚本启动服务。
Flink 安装包: 在所有节点相同路径下解压 Flink 2.x 发行版(如
flink-2.1.0-bin-scala_2.12.tgz
)。
2. 关键配置文件
conf/flink-conf.yaml
(主配置文件的详细剖析)
yaml
# ========== 基础配置 ==========
# JobManager 的 RPC 地址,使用主机名或IP(重要!)
jobmanager.rpc.address: flink-master
# JobManager 堆内存大小 (生产环境建议 1G-4G)
jobmanager.memory.heap.size: 1024m
# TaskManager 堆内存大小 (生产环境根据任务需求调整,建议至少 2G)
taskmanager.memory.heap.size: 2048m
# 每个 TaskManager 提供的任务槽数 (建议设置为机器的 CPU 核心数)
taskmanager.numberOfTaskSlots: 4
# 作业的默认并行度
parallelism.default: 4
# ========== 高可用配置 (核心!) ==========
# 启用高可用模式
high-availability: zookeeper
# ZooKeeper 集群地址
high-availability.zookeeper.quorum: zk-node1:2181,zk-node2:2181,zk-node3:2181
# Flink 在 ZooKeeper 中的根路径,用于隔离不同集群
high-availability.zookeeper.path.root: /flink
# 集群ID,用于区分不同Flink集群。Standalone模式通常设为固定值。
high-availability.cluster-id: /my-standalone-cluster
# JobManager 元数据和检查点数据在分布式存储上的持久化路径
high-availability.storageDir: hdfs:///flink/recovery/
# ========== 状态后端与检查点配置 ==========
# 状态后端类型 (RocksDB 适用于大状态场景)
state.backend: rocksdb
# 检查点存储位置(与HA存储路径可相同也可不同)
state.checkpoints.dir: hdfs:///flink/checkpoints/
# 每 60秒 触发一次检查点
execution.checkpointing.interval: 60s
# 检查点超时时间
execution.checkpointing.timeout: 5min
# 启用增量检查点 (RocksDB专用,大幅减少CK耗时和大小)
state.backend.incremental: true
# ========== Web UI 配置 ==========
# REST API 端口,用于提交作业和监控
rest.port: 8081
# (可选)绑定地址,如果需要外部访问可设为 0.0.0.0
rest.bind-address: 0.0.0.0
conf/masters
(指定所有 JobManager 主机和 Web UI 端口)
text
flink-master:8081
flink-master-backup:8081
conf/workers
(指定所有 TaskManager 主机)
text
flink-worker-01
flink-worker-02
flink-worker-03
conf/zoo.cfg
(如果自建 ZK 集群,需配置)
text
server.1=zk-node1:2888:3888
server.2=zk-node2:2888:3888
server.3=zk-node3:2888:3888
3. 部署与启动步骤
分发配置: 将配置好的
flink-conf.yaml
,masters
,workers
文件分发到所有节点的 Flink 目录下的conf/
中。启动 ZooKeeper 集群(如果尚未启动)。
启动 HDFS 集群(如果尚未启动)。
启动 Flink 集群: 在 Master 节点上执行:
bash
# 进入到 Flink 安装目录 cd /opt/flink-2.1.0 # 使用内置脚本启动整个集群(会自动通过SSH启动workers文件中的TaskManager) bin/start-cluster.sh
验证:
执行
jps
命令,在 Master 节点应看到StandaloneSessionClusterEntrypoint
,在 Worker 节点应看到TaskManagerRunner
。访问
http://<flink-master>:8081
,打开 Flink Web UI,查看集群和 TaskManager 是否正常注册。
三、 生产环境考量与最佳实践
资源隔离: 避免将 ZooKeeper、HDFS DataNode 等关键服务与 TaskManager 部署在同一台机器,防止资源竞争。
监控与告警: 集成 Prometheus 和 Grafana,对 CPU、内存、背压(Backpressure)、检查点时长等关键指标进行监控和告警。
日志管理: 将 Flink 的日志(
log/
目录)收集到 ELK 或 Splunk 等集中式日志系统中,方便排查问题。客户端分离: 建议在专门的客户端机器上提交作业 (
flink run
),而非在 JobManager 节点上,以降低对主节点的干扰。网络与安全: 确保集群节点间网络通畅,防火墙开放所需端口(如 6123 for RPC, 8081 for REST, 以及 TaskManager 的数据传输端口)。考虑使用 SSL/TLS 加密网络通信。
总结
Flink Standalone 集群部署模式提供了简单、稳定且功能完备的独立运行时环境。其核心优势在于部署简单、易于管理。但要使其达到生产级别的高可用,必须依赖 ZooKeeper 和分布式文件系统。
对于资源管理需求不复杂、团队技术栈偏向传统的中小型公司,Standalone 模式是一个非常好的起点。当需要更精细化的资源管理和多租户隔离时,再考虑迁移到 YARN 或 Kubernetes 模式。