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 等标签,方便血缘平台分组
相关推荐
唐可盐20 分钟前
【数据治理实践】第 10 期:数据时代的导航——数据目录
大数据·人工智能·数据治理·数字化转型·数据资产·数据资产入表
智链RFID1 小时前
当企业运营遇到瓶颈:RFID 为什么越来越被采用?
大数据·网络·人工智能·科技·rfid
Data-Miner1 小时前
50页可编辑PPT | 某大数据资产平台建设项目启动会材料
大数据
旺仔Sec1 小时前
2026江苏省职业院校技能大赛新一代信息技术赛道大数据应用开发项目样题
大数据·数据挖掘
wx_xkq12882 小时前
营销智脑V3企业级AI平台架构设计:优秘智能完成从单点工具到全链路生态布局
大数据·人工智能
2601_955363152 小时前
技术赋能B端拓客:号码核验行业的革新与价值重构,氪迹科技法人,股东号码筛选系统,阶梯式价格
大数据·人工智能·重构
大大大大晴天️2 小时前
大数据实时计算-反压机制剖析
大数据·flink·spark streaming
zxsz_com_cn2 小时前
设备预测性维护数据采集方案设计
大数据
尽兴-2 小时前
仿京东电商商品搜索服务实战:基于 Elasticsearch 的实现与落地
大数据·elasticsearch·jenkins·建模·dsl查询
AI扑社2 小时前
AI+GEO 驱动的全新数字营销解决方案
大数据·人工智能·geo·ai搜索