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 + 远程持久化存储。这套方案能很好地帮你实现自动化、高可用的任务管理。

相关推荐
xcbrand2 小时前
工业制造品牌全案公司找哪家
大数据·人工智能·python·制造
dualven_in_csdn2 小时前
EMQX 开启 **MySQL + password_based** 认证
android·数据库·mysql
Guheyunyi2 小时前
无人机巡检系统,高效精准守护全场景安全
大数据·人工智能·科技·安全·架构·无人机
蓝耘智算2 小时前
Token经济学:读懂AI时代的“新石油”
大数据·人工智能·ai·token·蓝耘
xuhaoyu_cpp_java2 小时前
MySql学习(一)
经验分享·学习·mysql
上海达策TECHSONIC2 小时前
汽车零配件 SAP 转型数字化标杆 上海达策实施 SAP Business One 赋能汽车底盘转向领域
大数据·运维·人工智能·汽车·运维开发·制造
Thomas21432 小时前
pyspark 新接口 DataSource V2 写法 写入paimon为例
大数据·分布式·spark
武子康2 小时前
大数据-268 实时数仓-ODS 层 Flink+Kafka+HBase实时流处理:Kafka数据写入维度表实战
大数据·后端·flink
熬夜的咕噜猫2 小时前
LVS+Keepalived高可用群集
大数据·网络·数据库·mysql·mysql高可用