02为实现Flink的部署做前期准备——Flink

在部署Flink之前,需要完成一系列准备工作,包括设置hostname,更新hosts文件,进行虚拟机克隆,安装SSH,以及安装Java。确保在所有节点上创建用户并赋予相应权限,通过SSH实现无密码登录。接着,安装JDK,将其上传并解压到指定目录,配置环境变量,并使用scp命令将JDK和环境变量配置文件复制到其他节点。

部署Flink前,先要做hostname,hosts,虚拟机克隆,ssh安装,Java安装等

 

然后cat /etc/passwd 可以看到你新建的用户在面显示

保存退出

也可以直接给cat /etc/passwd添加用户的方法进行添加用户名用户组

其他节点也是一样,添加用户,赋予密码,赋予权限

===============================================================

接着就是设置免密,先看看有没有对应的文件夹

其他的节点也是一样创建

然后就是创建免密了

同时也要传给自己的哦

同理,在其他节点也要创建秘钥,然后传给其他节点,及自己

还要最重要一步,给每个.ssh文件设置权限,否则无法进行免密登录

chmod 700 .ssh   #这个权限很重要

然后进行免密登录进行验证

到此,免密成功

 

 

 

接下来就是可以安装jdk

1、上传jdk、并解压到指定目录下

2、进入文件进行配置java的环境变量

vi .bash_profile 

3、然后用scp -r将jdk的解压包传给其他节点。同时.bash_profile记得要刷新一下让其生效

scp -r local flink@slave1:~/

scp -r local flink@slave2:~/

### ✅ 问题: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 进行版本升级和扩容 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值