当前位置: 首页 > news >正文

Flink checkopint使用教程

一、持久化存储对比

Flink checkpoint 需要写入远程持久化存储(如 HDFS、S3 等),不能直接存在本地,因为 Kubernetes Pod 是临时易失的。


正常使用PVC = 本地硬盘(快,独享),MinIO/S3 = 共享网盘(慢,共享)

正常公司使用PVC即可

二、PVC持久化

2.1、存储类型

PVC 能不能跨节点,本质看它绑定的 StorageClass 的provisioner(存储插件)

  • local-path / local CSI→ 本地磁盘 →不能跨机器
  • nfs / ceph rbd / cephfs→ 网络存储 →可以跨机器

怎么看当前 PVC 用的是哪种 StorageClass

查看所有 PVC

kubectl get pvc -A

STORAGECLASS那一列,就是存储类名称, 若空,说明本地


2.2、NFS/Ceph对比

使用成本 & 运维难度对比

对比项NFSCeph / CephFS
部署难度简单,几分钟复杂,需集群规划
节点数量1 台即可至少 3 台
资源占用极低高,耗 CPU、内存、网络
维护成本高(扩容、均衡、故障排查)
适合场景测试、小业务、配置共享、日志生产、高可用、数据库、大容量

Ceph 官方强烈建议:必须用独立裸盘(整块硬盘),不要用系统盘、不要用分区

怎么看服务器有没有裸盘?

直接在每台 worker 节点执行下面命令。

lsblk

输出类似这样:

这台机器目前没有符合要求的「干净裸盘」

Ceph 要求的合格裸盘必须同时满足:

  1. TYPEdisk(整块物理盘)
  2. 没有任何子分区(不会出现sdb1sdb2这类分区)
  3. MOUNTPOINT为空,没有挂载任何目录
  4. 没有格式化、没有文件系统

你这台机器只有一块sda系统盘,已经被系统完全占用,没有额外的独立硬盘,所以没有可用的裸盘


2.3、搭建NFS服务

2.3.1. 选一台 Worker 做 NFS 服务器

(比如 10.50.3.58)
- 在这台机器上:装 NFS 服务端
- 共享目录: /public
- 这台机器就是“存储中心”

yum install -y nfs-utils rpcbind

创建共享目录

mkdir -p /data/nfs chmod 777 /data/nfs

配置共享

echo "/data/nfs *(rw,sync,no_root_squash,no_subtree_check)" >> /etc/exports

启动服务

exportfs -r systemctl restart nfs-server
2.3.2. 其他所有节点(Master + 其他 Worker)


- 只需要:装 NFS 客户端
- 不需要配置共享目录
- 它们只是“挂载者”

yum install -y nfs-utils

查看k8s集群有哪些节点

[root@k8smaster01 task]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8smaster01 Ready control-plane,master 586d v1.23.6 k8smaster02 Ready control-plane,master 586d v1.23.6 k8sworker01 Ready <none> 586d v1.23.6 k8sworker02 Ready <none> 586d v1.23.6 k8sworker03 Ready <none> 364d v1.23.6 k8sworker04 Ready <none> 262d v1.23.6 k8sworker05 Ready <none> 262d v1.23.6
2.3.3. K8S 主节点(Master)


- 你在 Master 上写 PV/PVC YAML
- 指向 NFS 服务器(10.50.3.58)
- K8S 自动让所有 Pod 挂载这个共享盘

# 第一个:NFS 持久卷 PV apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv spec: capacity: storage: 100Gi accessModes: - ReadWriteMany nfs: server: 10.50.3.58 # 你的 NFS 服务器 Worker IP path: /data/nfs # NFS 共享目录 --- # 第二个:NFS 持久卷申请 PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc namespace: test spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi

2.3.4. 最终效果


- 所有 Pod 都能读写同一个目录
- Pod 漂移到任何节点都能访问数据
- Flink 状态、Checkpoint 不会丢

一句话总结

一台 Worker 当 NFS 服务器, 其他节点当客户端, Master 写 YAML 对接, 全部 Pod 共享数据。

2.4、flink使用NFS集群配置

2.4.1、脚本内容如下

pv_test.yam文件内容如下

apiVersion: v1 kind: PersistentVolume metadata: name: flink-nfs-pv spec: capacity: storage: 20Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain mountOptions: - nfsvers=3 - tcp nfs: server: 10.50.3.58 path: /data/nfs --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: flink-nfs-pvc namespace: test spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi

flink_test.yaml文件内容如下

apiVersion: apps/v1 kind: Deployment metadata: name: flink-jobmanager namespace: test spec: replicas: 1 selector: matchLabels: app: flink component: jobmanager template: metadata: labels: app: flink component: jobmanager spec: securityContext: runAsUser: 0 runAsGroup: 0 fsGroup: 0 containers: - name: jobmanager image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/apache/flink:1.19.1-java8 args: ["jobmanager"] ports: - containerPort: 6123 name: rpc - containerPort: 6124 name: blob - containerPort: 8081 name: ui env: - name: JOB_MANAGER_RPC_ADDRESS value: flink-jobmanager - name: FLINK_PROPERTIES value: | jobmanager.memory.process.size: 1g jobmanager.memory.jvm-overhead.max: 256m state.backend: filesystem state.checkpoints.dir: file:///mnt/data/flink cluster.evenly-spread-out-slots: true volumeMounts: - name: flink-storage mountPath: /mnt/data/flink volumes: - name: flink-storage persistentVolumeClaim: claimName: flink-nfs-pvc # 这里已对齐 ✅ --- apiVersion: v1 kind: Service metadata: name: flink-jobmanager namespace: test spec: ports: - name: rpc port: 6123 - name: blob port: 6124 - name: ui port: 8081 selector: app: flink component: jobmanager type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: flink-taskmanager namespace: test spec: replicas: 3 selector: matchLabels: app: flink component: taskmanager template: metadata: labels: app: flink component: taskmanager spec: securityContext: runAsUser: 0 runAsGroup: 0 fsGroup: 0 containers: - name: taskmanager image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/apache/flink:1.19.1-java8 args: ["taskmanager"] ports: - containerPort: 6121 name: data - containerPort: 6122 name: rpc env: - name: JOB_MANAGER_RPC_ADDRESS value: flink-jobmanager - name: FLINK_PROPERTIES value: | taskmanager.bind-host: 0.0.0.0 taskmanager.numberOfTaskSlots: 16 taskmanager.memory.process.size: 1024m taskmanager.memory.heap.size: 512m taskmanager.memory.off-heap.size: 256m taskmanager.memory.managed.size: 256m taskmanager.memory.jvm-metaspace.size: 128m taskmanager.memory.jvm-overhead.min: 64m taskmanager.memory.jvm-overhead.max: 128m cluster.evenly-spread-out-slots: true volumeMounts: - name: flink-storage mountPath: /mnt/data/flink volumes: - name: flink-storage persistentVolumeClaim: claimName: flink-nfs-pvc # 这里已对齐 ✅ --- apiVersion: v1 kind: Service metadata: name: flink-jobmanager-rest namespace: test spec: ports: - name: ui port: 8081 targetPort: 8081 nodePort: 30081 selector: app: flink component: jobmanager type: NodePort

执行yaml文件脚本

[root@k8smaster01 task]# kubectl apply -f pv_test.yaml persistentvolume/flink-data-pv1 created persistentvolumeclaim/flink-data-pvc1 created [root@k8smaster01 task]# kubectl apply -f flink_test.yaml deployment.apps/flink-jobmanager created service/flink-jobmanager created deployment.apps/flink-taskmanager created service/flink-jobmanager-rest created service/flink-taskmanager-http created
2.4.2、验证是否启动成功

查看容器状态

kubectl get pod -n test

若出现Running状态,代表启动成功

若启动失败,需要查询日志

查看事件失败的原因

[root@k8smaster01 task]# kubectl describe pod flink-jobmanager-78f8788779-cfpmh -n test

删掉重建

kubectl delete pods -n test -l app=flink

附上删除pv/pvc教程(存在删除不掉的情况)

1、检测PVC状态: kubectl get pvc -n <namespace> <pvc-name> 2、查看状态是否为Terminating或Bound 3、查看保护锁:kubectl get pvc <pvc-name> -o yaml | grep finalizers -A 4、若有kubernetes.io/pvc-protection则被锁定。 4.1、解锁:kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}' --type=merge 4.2、然后删除:kubectl delete pvc <pvc-name> --force --grace-period=0。 若仍删不掉,先删除使用该PVC的Pod或Deployment。
kubectl patch pv flink-jars-pv -p '{"metadata":{"finalizers":null}}' --type=merge kubectl delete pv flink-jars-pv --force --grace-period=0

kubectl get pod -n test

2.5、验证checkpoint是否可以漂移

2.6、验证数据的准确性

http://www.jsqmd.com/news/605444/

相关文章:

  • 大学物理(Ⅱ)核心公式解析与应用指南
  • PVE内存管理全攻略:如何避免CT容器内存超配导致的OOM问题
  • HDLbits通关秘籍:Rule 90/110与生命游戏,用Verilog玩转细胞自动机(附完整代码)
  • SEO案例教程有哪些
  • SEO_从0到1的SEO实战教程,手把手教你操作
  • OpenClaw+千问3.5-9B对比测试:3种模型接口性能实测
  • 网站优化过程中如何防范黑帽SEO行为
  • 花了一周,我做出了第一个游戏(打砖块),这些坑你别再踩了(持续更新中)
  • QGIS+OpenStreetMap实战:用DEM和建筑数据生成3D城市模型(含Aerialod配置)
  • OpenClaw技能扩展实战:千问3.5-35B-A3B-FP8助力内容自动化处理
  • 告别UNCLAIMED!在Jetson AGX Orin上为Intel AX200网卡‘注入灵魂’的完整指南
  • 泛型:类·学习笔记
  • 未发表!25年顶级SCI算法SOO优化CNN-LSTM-Attention一键实现多步预测!多步预测全家桶更新啦!
  • STM32duino驱动X-NUCLEO-IKS5A1多传感器融合开发指南
  • 高效解放双手:OnmyojiAutoScript阴阳师智能自动化工具全解析
  • 红外遥控技术原理与电路设计实践
  • 事件驱动的本质的庖丁解牛
  • 从芯片手册到实际电路:聊聊74HC74、74HC112这些D/JK触发器芯片怎么用(附常见坑点)
  • 【Java设计模式 | 创建者模式】单例模式
  • 在Ubuntu虚拟机上玩转QNX 8.0:手把手教你搭建嵌入式开发环境
  • 飞书机器人进阶:OpenClaw接入Kimi-VL-A3B-Thinking处理群聊图片
  • 从音频到全身动捕:手把手教你用AudCast和扩散模型生成会说话、会做手势的虚拟人视频
  • 告别Matlab!用FPGA手把手实现Canny边缘检测(附Verilog代码与仿真)
  • 在Ubuntu 20.04上从源码编译CasADi C++库,顺便搞定Ipopt和HSL依赖(保姆级避坑指南)
  • 保姆级教程!小程序开发只需3步,Gemini设计 + Trae开发 + 微信开发者工具预览上架
  • [具身智能-253]:从梯度下降到成长型思维:AI深度学习与人类进化的共同算法
  • 使用私有部署的 AI 接入智能体
  • OpenClaw多模型切换:Qwen3-32B-Chat与本地小模型协同工作方案
  • html怎么用netlify部署_Netlify如何托管纯HTML静态网站
  • 从Level6到Level13:手把手带你绕过RCE靶场中的那些“奇葩”WAF