Flink JobStatusChangedListener把作业状态变化 + Lineage 发到 DataHub / OpenLineage

1、它是什么?何时触发?

  • 你实现的是:JobStatusChangedListener

  • 触发时机:应用(作业)状态每次变化都会触发

    • 比如 CREATED / RUNNING / FAILING / FAILED / CANCELLING / CANCELED / FINISHED 等(以 Flink 的 job status 为准)
  • 血缘信息(lineage)在哪里?

    • JobCreatedEvent 中包含 source/sink lineage 信息
    • 你在 onEvent(JobStatusChangedEvent event) 里收到事件,遇到 JobCreatedEvent 时可以解析并上报

2、插件怎么做:3 步走(和 FailureEnricher 很像)

要实现一个自定义 JobStatusChangedListener 插件,你需要:

  1. 实现 JobStatusChangedListener
  2. 实现 JobStatusChangedListenerFactory
  3. 使用 Java SPI 注册工厂类:
    创建文件
    META-INF/services/org.apache.flink.core.execution.JobStatusChangedListenerFactory
    内容是你的 Factory 全类名

打成 jar 后放入 Flink 的 plugins 目录(独立 classloader 隔离):

text 复制代码
$FLINK_HOME/plugins/
  job-status-changed-listener/
    flink-lineage-listener.jar

3、最小示例代码(可直接改成 DataHub/OpenLineage 上报)

3.1 Factory 示例

java 复制代码
package com.yourcompany.flink.lineage;

public class MyJobStatusChangedListenerFactory implements JobStatusChangedListenerFactory {
    @Override
    public JobStatusChangedListener createListener(Context context) {
        return new MyJobStatusChangedListener(context);
    }
}

3.2 Listener 示例(接收事件并处理 JobCreatedEvent)

java 复制代码
package com.yourcompany.flink.lineage;

public class MyJobStatusChangedListener implements JobStatusChangedListener {

    private final JobStatusChangedListenerFactory.Context context;

    public MyJobStatusChangedListener(JobStatusChangedListenerFactory.Context context) {
        this.context = context;
    }

    @Override
    public void onEvent(JobStatusChangedEvent event) {
        // 1) 所有状态变化都会到这里
        // 2) lineage 在 JobCreatedEvent 里
        if (event instanceof JobCreatedEvent) {
            JobCreatedEvent created = (JobCreatedEvent) event;

            // 伪代码:从 created 中提取 source/sink lineage
            // LineageInfo lineage = created.getLineageInfo();
            // sendToDatahubOrOpenLineage(lineage);

        } else {
            // 你也可以上报运行/失败/取消等状态,用于血缘系统里的运行实例关联
            // sendJobStatus(event.getNewStatus(), event.getJobId(), ...)
        }
    }
}

3.3 SPI 文件内容

文件路径:

text 复制代码
META-INF/services/org.apache.flink.core.execution.JobStatusChangedListenerFactory

文件内容(一个工厂类名一行):

text 复制代码
com.yourcompany.flink.lineage.MyJobStatusChangedListenerFactory

4、配置:不配就不启动(关键)

Flink 启动时加载 JobStatusChangedListener 插件,但是否启用由配置决定:

properties 复制代码
execution.job-status-changed-listeners = com.yourcompany.flink.lineage.MyJobStatusChangedListenerFactory

注意:

  • 这里配置的是 Factory 的类名(你给的例子也是 factory)
  • 如果该配置为空:不会启动任何 listener

5)实践建议:做成"血缘上报"生产可用版本

  • 只在 JobCreatedEvent 做血缘解析:避免每次状态变化都做重逻辑
  • 异步上报 + 超时兜底:上报系统不可用时别拖垮 JM 线程
  • 幂等/去重:同一个 jobId + runId(或提交时间)做幂等 key,避免重复写血缘
  • 关联运行实例:把 RUNNING/FAILED/FINISHED 状态也上报,用于 lineage 系统展示"本次运行"
  • 多环境标识:在上报里附加 clusterId、namespace、env、tenant 等标签,方便血缘平台分组
相关推荐
Data-Miner20 小时前
面对 AI 大模型智能涌现,如何从技术层面保护好隐私与数据安全?
大数据·人工智能
会议咨询21 小时前
2027年电力电子、人工智能与大数据国际会议(PEABD 2027)
大数据·人工智能·电力电子
GlobalInfo1 天前
全球包装检测用3D轮廓传感器市场调研:2026年规模预计达1.87亿美元,食品医药与电商物流需求推动增长
大数据·人工智能·3d
程序 代码狂人1 天前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
starzy19901 天前
Kafka响应发送:字节是怎么真正写回客户端的
大数据·kafka
数字新视界1 天前
国产动环数据库在智能机房环境监控中的应用与优势分析
大数据·人工智能·数据中心·机房管理·模块化机房
古法老登瞎折腾1 天前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp
keyipatience1 天前
Git学习(2)撤销与分支操作全指南
大数据·elasticsearch·搜索引擎
数字新视界1 天前
模块化机房的设计与实施原理剖析
大数据·物联网·信息可视化·信息与通信·一体化机柜
用户3610588626121 天前
Flink 注册Slot源码深度剖析:从TaskManager注册到Slot状态机的完整链路
大数据·flink