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 等标签,方便血缘平台分组
相关推荐
Jouham2 小时前
中小微企业AI获客痛点解析:瞬维智能如何用“自动化+精准度”破局
大数据·人工智能·自动化
Hello.Reader2 小时前
Flink External Resource Framework让作业“原生”申请 GPU/FPGA 等外部资源
大数据·fpga开发·flink
AC赳赳老秦2 小时前
轻量化模型浪潮下的关键技术突破:DeepSeek INT4量化优化引领2026端侧算力新纪元
网络·安全·mongodb·web安全·flink·prometheus·deepseek
菜鸟小芯2 小时前
从“会聊天”到“能做事”:AI Agent(AI 智能体)的技术革命与落地实践
大数据·人工智能
龙山云仓2 小时前
No155:AI中国故事-对话宋应星——天工开物与AI造物:格物穷理与经世致用
大数据·人工智能·深度学习
Hello.Reader2 小时前
Flink History Server 集群停了也能看已完成作业的 Web UI 与 REST 数据
大数据·flink
赵谨言3 小时前
基于Python和ArcPy的不动产数据入库技术与运用
大数据·开发语言·经验分享·python
一条咸鱼_SaltyFish3 小时前
Elasticsearch索引规划:从字段类型到分片策略的实战思考
大数据·elasticsearch·搜索引擎·全文检索·后端开发·分片策略·索引规划
海兰3 小时前
Elasticsearch 9.3.0 系统日志采集详解
大数据·elasticsearch·搜索引擎