03实现Flink集群的部署——Flink

本文详细介绍Flink集群的部署步骤及关键配置项,包括解压安装包、配置Flink参数、设置JAVA_HOME、配置taskmanager及分发配置文件等。通过本教程,读者将学会如何从零开始搭建并启动Flink集群。

官网中,有两种版本,一种是有hadoop支持的版本,一种是没有hadoop支持的版本

解压后重点有两个目录,一个是bin,一个是conf

1、解压到指定目录

tar -zxvf flink-1.7.2-bin-scala_2.11.tgz -C local/

2、

配置
Flink的配置很简单。 我们需要调整一些参数,我们都已设置好。 作业管理器节点和任务管理器节点的大多数配置都相同。 所有配置都在conf/flink-conf.yaml文件中完成。下面配置
进入目录

cd /usr/flink-1.6.2/conf

vi flink-conf.yaml

需要修改的参数是:jobmanager.rpc.address: localhost

localhost改为主机hostname,我这里的hostnamejob.

第二步:配置JAVA_HOME
还有我们需要添加JAVA_HOME

export JAVA_HOME=/usr/...

第三步:配置taskmanager

  1. vi slaves

复制代码

第四步:分发配置文件

  1. scp -r conf/ aboutyun@task1:~
  2. scp -r conf/ aboutyun@task1:~

 第五步:启动集群
进入bin目录

  1. ./start-cluster.sh

复制代码

 

 

 

 

 

 

### ✅ 问题:Flink 集群部署,如何实现增加服务器弹性扩容? --- ## 🚀 简短回答: > **Apache Flink 支持通过添加 TaskManager 节点来实现“弹性扩容”**,但 **Job 必须使用 Savepoint 或 Checkpoint 恢复才能利用新增资源提升并行度。** 📌 核心流程: 1. ✅ 停止当前作业(生成 Savepoint) 2. ✅ 增加新的 TaskManager 服务器 3. ✅ 修改 Job 并行度(或让其自动扩展) 4. ✅ 从 Savepoint 重启作业 5. ✅ Flink 自动将子任务重新分配到更多节点上运行 👉 实现了:**水平扩展 + 利用更多 CPU/内存资源处理更大流量** --- ## 🔍 详细解释与实操方案 ### 一、Flink 集群架构回顾 | 组件 | 角色 | |------|------| | **JobManager (JM)** | 负责调度、协调 Checkpoint、管理元数据 | | **TaskManager (TM)** | 执行具体任务(Subtask),提供 Slot 资源 | | **Client** | 提交作业,不参与运行 | ✅ 弹性扩容的本质: > ➕ 动态增加 **TaskManager** 实例 → 提供更多 Slot → 支持更高并行度 --- ### 二、弹性扩容的完整步骤(以 Standalone 或 Kubernetes 部署为例) #### ✅ 步骤 1:停止原作业并创建 Savepoint ```bash # 查询正在运行的作业 ID flink list -m yarn-cluster -yid application_1234567890 -j <jobmanager-host>:8081 # 触发停止并生成 Savepoint flink cancel -s file:///opt/flink/savepoints -m <jobmanager-address> <job-id> ``` 输出示例: ``` Savepoint stored in file:/opt/flink/savepoints/savepoint-abc123 ``` 📌 这个路径就是状态快照地址,后续恢复要用。 --- #### ✅ 步骤 2:横向扩展集群 —— 添加新 TaskManager ##### 方式①:Standalone 模式(手动启动 TM) 在新服务器上执行: ```bash # 启动一个 TaskManager ./bin/taskmanager.sh start ``` 前提条件: - `flink-conf.yaml` 中已配置正确的 `jobmanager.rpc.address` - 网络互通、共享存储(用于 Savepoint) ##### 方式②:Kubernetes 部署(推荐生产环境) 修改 Deployment 或 StatefulSet 的副本数: ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: flink-taskmanager spec: replicas: 4 # 原来是 2,现在扩到 4 ... ``` 应用更新: ```bash kubectl apply -f flink-tms.yaml ``` 等待新 Pod 启动并注册到 JobManager。 ##### 方式③:YARN 模式 直接提交作业时指定更多容器: ```bash flink run -m yarn-cluster -yn 4 -ys 4 -yjm 1024 -ytm 2048 ... ``` > `-yn 4`: 请求 4 个 TaskManager 容器 --- #### ✅ 步骤 3:调整 Job 并行度(可选) 你可以在代码中设置更高的并行度,或通过命令行覆盖: ```java // 在代码中(也可以不用改) env.setParallelism(8); // 原来是 4 ``` 或者通过 CLI 指定: ```bash flink run -p 8 -s file:///opt/flink/savepoints/savepoint-abc123 ./my-job.jar ``` ✅ 注意: - 新的并行度不能超过 `总 Slot 数` - 如果原来是 keyBy 后的算子并行度为 4,现在可以扩到 8,Flink 会自动 re-balance --- #### ✅ 步骤 4:从 Savepoint 重启作业 ```bash flink run \ -m <jobmanager-host>:8081 \ -s file:///opt/flink/savepoints/savepoint-abc123 \ -p 8 \ ./my-streaming-job.jar ``` ✅ 效果: - 状态从 Savepoint 恢复 - 子任务被重新划分到更多的 TaskManager 上 - 吞吐量理论上提升近 2 倍(假设资源充足) --- ### 三、关键配置建议(确保扩容成功) | 配置项 | 推荐值 | 说明 | |--------|--------|------| | `state.backend` | `filesystem` 或 `rocksdb` | 使用外部化存储 | | `execution.checkpointing.externalized-checkpoint-retention` | `RETAIN_ON_CANCELLATION` | 保留 Checkpoint | | `high-availability` | `zookeeper` / `k8s` | 支持 JobManager 容错 | | `state.checkpoints.dir` | HDFS/S3/NFS 路径 | 共享状态目录 | | `parallelism.default` | 可动态调整 | 不硬编码在代码中更好 | --- ### 四、支持自动弹性扩容吗?(进阶) Flink **本身不提供自动伸缩机制**,但可通过以下方式实现“近似自动扩容”: #### ✅ 方案①:监控 + 外部控制器(如 K8s Operator) - 使用 [**Flink Kubernetes Operator**](https://github.com/apache/flink-kubernetes-operator) - 监控反压、背压、延迟等指标 - 当 CPU > 80% 持续 5 分钟 → 自动触发 Savepoint → 扩容 TM → 重启作业 #### ✅ 方案②:结合 Prometheus + Alertmanager + 自定义脚本 ```bash # 示例自动化脚本逻辑 if [ $(get_backpressured_subtask_ratio) -gt 0.7 ]; then flink cancel -s s3a://savepoints/ $JOB_ID scale_out_taskmanagers # 扩容 TM sleep 30 flink run -s s3a://savepoints/savepoint-$JOB_ID -p 16 $JAR fi ``` --- ### 五、代码层面的最佳实践(便于扩容) #### ✅ 使用 `uid()` 固定算子 ID(避免状态不兼容) ```java DataStream<String> stream = env .addSource(new FlinkKafkaConsumer<>("topic", schema, props)) .setUid("kafka-source") // ← 必须加! .keyBy(value -> value.getKey()) .setUid("keyed-process") .process(new MyStatefulFunction()) .setUid("stateful-processor"); ``` ⚠️ 如果你不加 `uid()`,Flink 会根据拓扑生成随机 ID,导致: > ❌ 扩容后无法恢复状态! --- ### 六、验证扩容是否生效 #### 方法①:查看 Web UI - 访问 `http://<jobmanager>:8081` - 查看 **"Task Managers"** 页面:确认新增节点已连接 - 查看 **"Job -> Execution Graph"**:确认并行度已变为 8 #### 方法②:日志检查 ```log INFO Recovered operator state for kafka-source from checkpoint ... INFO Parallelism changed from 4 to 8, redistributing state... ``` #### 方法③:监控吞吐量 - 观察 Records/s 是否显著上升 - 背压是否缓解 --- ## ✅ 总结 > ❓ “Flink 如何实现弹性扩容?” > ✅ **答案:** > > Flink 支持通过 **增加 TaskManager 服务器 + 从 Savepoint 恢复作业** 实现弹性扩容。 > > 关键步骤: > 1. 停止作业并生成 Savepoint > 2. 添加新的 TaskManager 节点 > 3. 调整并行度 > 4. 从 Savepoint 重启作业 > > ✅ 支持所有状态类型(KeyedState、OperatorState、广播状态)恢复 > ⚠️ 必须保证状态后端可访问、算子 UID 一致 🔧 推荐部署模式: - 生产环境使用 **Kubernetes + Flink Operator** - 状态存放在 **S3/HDFS/NFS** - 使用 **Savepoint** 而非 Checkpoint 进行版本升级和扩容 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值