flink mysql集群增删改查

1.1、source/sink/mapFunction 处理的区别

kafka作为source,流数据处理,需要查mysql,查redis,合并数据再查再处理,再输出。

对比表格:Source/Sink 内查询 vs 独立 Map

维度 在 Source/Sink 内查询 独立 RichMapFunction
职责 Source/Sink 承担了不属于它的逻辑 每个算子职责单一
并行度 受限于 Source/Sink 的并行度(Source 受分区数限制) 原因参考1.1.2 可独立设置并行度,充分利用资源
代码复用 查询逻辑无法在其他作业复用 增强函数可以独立复用
测试 需要模拟 Source/Sink 环境 可以单独单元测试 Map 函数
资源管理 连接池生命周期与 Source/Sink 绑定,容易错 连接池在静态单例中,Map 只引用,无需管理关闭
性能 无法异步(除非自己实现)原因参考1.1.3 可以轻松切换为异步(AsyncDataStream
可读性 逻辑耦合,维护困难 清晰的数据流管道:Source → Map → Sink

一个 Flink 作业应该像一条流水线:Source 进料 → 多个 Transformation(增强、过滤、聚合)→ Sink 出货。
任何需要访问外部存储的逻辑,都应该放在独立的 Transformation 算子中(如 RichMapFunction),而不是塞进 Source 或 Sink。

这样做的好处:

  • 并行度自由调整

  • 资源生命周期可控

  • 代码易于理解和维护

  • 符合 Flink 的最佳实践

1.1.2、为什么 Source 和 Sink 会受"分区"限制?

1.1.2.1 Source 的并行度 ≤ Kafka 分区数

Kafka 一个分区只能被同组一个消费者消费,Flink Kafka Source 并行度 = 消费者实例数。若并行度 > Kafka 分区数,多余并行实例会空闲,无法提升效率。

结论:Source 并行度上限由 Kafka 分区数决定,不能随便调大。

1.1.2.2 Sink 的并行度不一定受分区限制,但有其他约束
  • 写入数据库 Sink(如 JDBC)时,并行度受数据库连接池大小、目标表锁等影响,不是受分区限制,而是受资源限制

1.1.3、source/sink不支持异步

Flink 里 Source 和 Sink 不是不能异步,而是不推荐这么做

  1. 会破坏 exactly-once、checkpoint、事务 等一致性语义,实现复杂易出错;
  2. Source/Sink 本身是按序拉取 / 写入,不需要中间算子那种多元素并发模式;
  3. 强行在 Source 里查库会阻塞,吞吐低,而 AsyncDataStream 才是专门给中间算子做异步查询、提升吞吐 的标准方案。

1.1.4、逻辑耦合在 Source/Sink 的危害

把逻辑写在 Source 里会导致:

  1. 复用性差:逻辑和 Kafka 绑定,其他数据源无法复用
  2. 测试麻烦:必须启动 Kafka、MySQL 才能测
  3. 维护风险大:改逻辑要动 Source,易影响数据读取

拆成独立 Map 算子:

  • 逻辑通用可复用
  • 单元测试简单
  • 修改安全、风险小
维度 写在 Source/Sink 写在独立 Map 算子
并行度灵活性 Source 受 Kafka 分区数限制 可独立调大(例如设为 100)
异步 I/O 支持 极难实现,不推荐 直接使用 AsyncDataStream
作业间复用 无法复用 任何数据源都能使用该 Map 函数
测试难度 需要外部系统(Kafka、MySQL) 纯单元测试即可
职责清晰度 Source 既读数据又做业务,混乱 一个算子只做一件事
容错恢复 Checkpoint 复杂 无状态,恢复简单

1.1.5、正确模块使用指南

  1. Source 只做:Kafka → KafkaParamVO

  2. Map 算子 做:KafkaParamVO → (查 MySQL 两次 + Redis) → EnrichedResult

    • 如果是同步查询,用 RichMapFunction

    • 如果是高吞吐异步,用 AsyncDataStream + 自定义 RichAsyncFunction

  3. Sink 只做:EnrichedResult → 目标系统

这样你的作业既稳定,又能发挥 Flink 的并行优势,还能随意复用增强逻辑。


二、mysql查询实践


三、flink集群日志管理

你只需要在Kubernetes里完成下面几步:

  1. 准备配置文件 :根据你使用的日志框架(如 Log4j2),创建一个包含滚动策略的配置文件(例如 log4j.properties)。可以参照前文方案一中的配置示例。

  2. 创建 ConfigMap:在K8s集群中创建一个 ConfigMap 来存放你的日志配置文件。

  3. 挂载 ConfigMap :在 JobManager 和 TaskManager 的 Pod 定义中,将这个 ConfigMap 以文件形式挂载,覆盖 Flink 容器内 /opt/flink/conf/log4j.properties 的默认配置。

  4. 滚动更新:更新你的 Flink 集群或任务,使配置生效。


四、flink负载均衡测试

五、如何丝滑升级flink任务

在K8s上管理Flink任务,要实现"丝滑"的提交与升级,最推荐的方式是采用 Flink Kubernetes Operator

它通过K8s的声明式API(YAML文件),让你像管理其他K8s应用一样管理Flink任务,从而实现自动化、声明式、无中断的任务升级。


📦 如何提交任务?

在K8s上提交Flink任务主要有三种方式,以下是它们的对比和选择建议:

方式 简介 优点 缺点 适用场景
1. Flink Kubernetes Operator (强烈推荐) 通过声明式YAML文件定义任务,Operator自动完成资源创建和生命周期管理。 声明式管理 ,契合K8s理念;支持自动化、无中断升级 ;简化运维,生产首选 需要额外安装和了解Operator机制。 生产环境,追求高自动化和稳定性的团队。
2. Flink Native Client 使用Flink自带的命令行工具直接提交任务到K8s集群。 直接,无需安装Operator;快速上手,适合初期测试。 升级、停止等操作需手动管理;不够"K8s原生";脚本方式难以管理大量任务。 开发测试,或初期小规模使用。
3. Flink Web UI / REST API 通过Web界面上传JAR包提交任务。 图形化操作,直观;调试方便。 不适合自动化运维;不适合生产环境。 临时调试,或非生产环境。

🚀 如何实现"丝滑"升级?

任务升级的核心是保证状态不丢失服务不中断 ,关键在于 Savepoint。它就像是给运行中的任务照了一张"快照",保存了当前所有的计算状态,升级时新任务可以直接从这个"快照"中恢复,无缝衔接工作。

Operator通过upgradeMode参数控制升级时的行为,主要有三种模式:

升级模式 (upgradeMode) 运作方式 生产环境推荐度
savepoint 最安全的方式。升级时自动创建一个Savepoint,新任务从该Savepoint恢复。如果任务运行健康,能保证状态100%不丢失。 强烈推荐
last-state 快速升级。直接从最后一个Checkpoint恢复,无需额外创建Savepoint。即使任务异常也可用。 推荐
stateless 无状态升级。不保存任何状态,任务从零开始。 ⚠️ 仅限无状态任务
配置示例与操作步骤

假设你有一个 flink-deployment.yaml 文件,用于定义一个Application模式的Flink任务。

  1. 配置Savepoint存储 :首先,你需要为Savepoint和Checkpoint配置一个持久化存储(如S3, HDFS, NFS等),并在flinkConfiguration中指定。

    yaml

    复制代码
    spec:
      flinkConfiguration:
        state.savepoints.dir: s3://your-bucket/flink-savepoints
        state.checkpoints.dir: s3://your-bucket/flink-checkpoints
        high-availability.storageDir: s3://your-bucket/flink-ha
  2. 定义升级模式 :在spec.job中设置upgradeMode: savepoint。当需要升级任务时,你只需要更新YAML文件中的镜像、JAR包或并行度等配置,然后重新apply即可

    yaml

    复制代码
    spec:
      job:
        upgradeMode: savepoint
        jarURI: local:///opt/flink/usrlib/your-new-flink-job.jar # 指向新版本的JAR
        parallelism: 2 # 假设你将并行度从1改为了2
        state: running
  3. 执行升级:运行以下命令即可触发自动化升级流程。

    bash

    复制代码
    kubectl apply -f flink-deployment.yaml

    执行后,Operator会自动完成"创建Savepoint -> 停止旧任务 -> 从Savepoint启动新任务"的全流程,实现无缝升级。

💡 核心注意事项

  • 高可用(HA)是基石:在生产环境中,务必为Flink集群和Operator本身配置HA,避免单点故障。

  • 状态兼容性需谨慎:升级任务时,如果修改了状态的Schema,新任务可能无法读取旧的Savepoint。升级前请务必验证状态兼容性。

  • 从零到一的规划

    1. 搭建存储:准备好S3、MinIO等持久化存储。

    2. 安装Operator:通过Helm或YAML在K8s集群中安装Flink Kubernetes Operator。

    3. 部署任务 :编写YAML文件(配置好HA和upgradeMode),使用kubectl apply -f提交任务。

    4. 升级任务 :修改YAML文件中的业务配置(如镜像、并行度),再次执行kubectl apply -f

总的来说,生产环境的最佳实践是:使用Flink Kubernetes Operator + Application模式 + upgradeMode: savepoint + 远程持久化存储。这套方案能很好地帮你实现自动化、高可用的任务管理。

相关推荐
PythonFun24 分钟前
告别加班!3分钟搞定百余份荣誉证书,WPS这个组合功能太强了
大数据·wps
csgo打的菜又爱玩26 分钟前
11.JobManager 启动流程总结
大数据·开发语言·qt·microsoft·flink
OneBlock Community32 分钟前
重磅!SEC & CFTC 联手“定义加密”,Polkadot 被写进规则!
大数据·人工智能
CS软件开发框架1 小时前
QMS软件案例 - 成本核算报价管理系统软件截图
大数据
大大大大晴天️1 小时前
Flink技术实践-Flink重启策略选型指南
java·大数据·flink
Francek Chen1 小时前
【大数据存储与管理】实验3:熟悉常用的HBase操作
大数据·数据库·分布式·hbase
努力努力再努力wz1 小时前
【MySQL 进阶系列】C/C++ 如何通过客户端库访问 MySQL?从连接原理到 API 调用流程详解(附完整demo代码)
服务器·c语言·数据结构·数据库·c++·b树·mysql
烟花情报局2 小时前
小炮庄5.5工厂联盟生态大会召开
大数据
kuaixunbao2 小时前
2026年5月PCB厂家推荐:口碑好的产品解决高频信号传输稳定性痛点
大数据·运维·网络
adminwolf2 小时前
美团点评客服自动回复神器|告别手动回复,轻松达标平台考核
大数据·前端·人工智能