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 等标签,方便血缘平台分组
相关推荐
KaMeidebaby2 小时前
卡梅德生物技术快报|peg 修饰调控 MXene/WS2 异质结,氨气传感器制备与机理研究
大数据·前端·人工智能·架构·spark·新浪微博
ydyd202604212 小时前
设备管理应用推荐2026深度测评!
大数据·人工智能·机器学习
志栋智能2 小时前
超自动化巡检:降低运维总成本(TCO)的有效路径
大数据·运维·网络·人工智能·自动化
LONGZETECH2 小时前
软硬协同+故障注入:无人机仿真维修与操控仿真底层算法逻辑拆解
大数据·c语言·算法·3d·unity·无人机
码农小白AI3 小时前
AI报告审核与IACheck:自动化检测全面铺开后,为什么报告审核反而成了新的效率瓶颈?
大数据·人工智能·自动化
数智顾问3 小时前
(133页PPT)数据中心基础设施规划设计(附下载方式)
大数据·数据库·人工智能
2601_957190903 小时前
原厂稳交付,玻璃剧场打造文旅长效增收新业态
大数据·人工智能
私域合规研究3 小时前
法律护航携手天道异业达成战略合作
大数据·人工智能
汽车仪器仪表相关领域4 小时前
南华 NHA-604/605 汽车排放气体测试仪:国六b全适配高精度便携检测设备
大数据·人工智能·功能测试·深度学习·安全·fpga开发·压力测试
媒介发稿小能手4 小时前
全链路透明可控API接口赋能|GEO媒介平台解锁可量化增长
大数据·人工智能