【flink-cdc】flink-cdc 3版本debug启动pipeline任务,mysql-doris

官方文档
github仓库地址
Flink cdc debug调试动态变更表结构

经过测试使用,在启动任务配置Modify classpath添加jar的方式,容易出错classNotFoundException等等。
![[image-20250103094408176.png]]

一、build project

flink-cdc版本:3.2.1

mvn clean package "-Dmaven.test.skip=true" "-Drat.skip=true" "-Dcheckstyle.skip"
# 当然install 也可以
mvn clean install "-Dmaven.test.skip=true" "-Drat.skip=true" "-Dcheckstyle.skip"

二、create module for test

在flink-cdc项目中新建一个module flink-cdc-test

将需要的flink cdc的connector依赖添加至pom


    <properties>        
        <flink.version>1.18.1</flink.version>  
        <maven.compiler.source>8</maven.compiler.source>  
        <maven.compiler.target>8</maven.compiler.target>  
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    </properties>  
  
    <dependencies>        
        <dependency>  
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-table-common</artifactId>  
            <version>${flink.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-table-runtime -->  
        <dependency>  
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-table-runtime</artifactId>  
            <version>${flink.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-table-api-java-bridge -->  
        <dependency>  
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-table-api-java-bridge</artifactId>  
            <version>${flink.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-core -->  
        <dependency>  
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-core</artifactId>  
            <version>${flink.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-java -->  
        <dependency>  
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-streaming-java</artifactId>  
            <version>1.18.1</version>  
            <scope>test</scope>  
        </dependency>  
  
        <dependency>            
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-clients</artifactId>  
            <version>1.18.1</version>  
            <scope>test</scope>  
        </dependency>  
  
        <dependency>            
        <groupId>org.apache.flink</groupId>  
            <artifactId>flink-cdc-cli</artifactId>  
            <version>${project.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <dependency>            
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-cdc-pipeline-connector-mysql</artifactId>  
            <version>${project.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <dependency>            
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-cdc-pipeline-connector-kafka</artifactId>  
            <version>${project.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <dependency>            
            <groupId>org.apache.flink</groupId>  
            <artifactId>flink-cdc-pipeline-connector-doris</artifactId>  
            <version>${project.version}</version>  
            <scope>test</scope>  
        </dependency>  
  
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->  
        <dependency>  
            <groupId>mysql</groupId>  
            <artifactId>mysql-connector-java</artifactId>  
            <version>8.0.27</version>  
        </dependency>  
    
    </dependencies>  

create pipeline yaml

创建flink cdc pipeline的配置文件mysql-to-doris.yaml

注意:drois的端口号不是9030,而是8030

source:  
  type: mysql  
  name: MySQL-Source  
  hostname: 192.168.100.123 
  port: 3306  
  username: root  
  password: 123456  
  tables: test.student  
  server-id: 5401-5404  
  server-time-zone: UTC  
  
sink:  
  type: doris  
  name: Doris-Sink  
  fenodes: 192.168.101:8030
  username: root
  password: 123456  
  
  
pipeline:  
  name: MySQL to Doris Schema Evolution  
  parallelism: 1

create pipeline start entrypoint

测试类,需在src/test目录下:

import org.apache.flink.cdc.cli.CliFrontend;  
import org.junit.jupiter.api.Test;  
  
import java.util.ArrayList;  
import java.util.List;  
  
public class MysqlPipelineTest {  
  
    @Test  
    public void testMysql() throws Exception {  
        List<String> args= new ArrayList<>();  
        args.add("D:\\flink-cdc-release-3.2.1\\flink-cdc-test\\pipelines\\mysql-to-doris.yaml");  
        args.add("--use-mini-cluster");  
        args.add("true");  
        CliFrontend.main(args.toArray(new String[0]));  
    }  
}

修改启动配置添加FLINK_HOME环境变量:
在这里插入图片描述
启动任务:
启动

flink doris connector 采集任务报错 2025-07-21 18:02:13,730 ERROR io.debezium.pipeline.ErrorHandler [] - Producer failure io.debezium.DebeziumException: java.lang.NullPointerException at io.debezium.pipeline.source.AbstractSnapshotChangeEventSource.execute(AbstractSnapshotChangeEventSource.java:85) ~[flink-sql-connector-mysql-cdc-2.4.2.jar:2.4.2] at io.debezium.pipeline.ChangeEventSourceCoordinator.doSnapshot(ChangeEventSourceCoordinator.java:155) ~[flink-sql-connector-mysql-cdc-2.4.2.jar:2.4.2] at io.debezium.pipeline.ChangeEventSourceCoordinator.executeChangeEventSources(ChangeEventSourceCoordinator.java:137) ~[flink-sql-connector-mysql-cdc-2.4.2.jar:2.4.2] at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:109) ~[flink-sql-connector-mysql-cdc-2.4.2.jar:2.4.2] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_212] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_212] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_212] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_212] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_212] Caused by: java.lang.NullPointerException at io.debezium.connector.oracle.OracleSnapshotChangeEventSource.createSchemaChangeEventsForTables(OracleSnapshotChangeEventSource.java:230) ~[flink-sql-connector-oracle-cdc-2.4.2.jar:2.4.2] at io.debezium.relational.RelationalSnapshotChangeEventSource.doExecute(RelationalSnapshotChangeEventSource.java:121) ~[flink-sql-connector-mysql-cdc-2.4.2.jar:2.4.2] at io.debezium.pipeline.source.AbstractSnapshotChangeEventSource.execute(AbstractSnapshotChangeEventSource.java:76) ~[flink-sql-connector-mysql-cdc-2.4.2.jar:2.4.2] ... 8 more 2025-07-21 18:02:13,736 INFO io.debezium.pipeline.ChangeEventSourceCoordinator [] - Connected metrics set to &#39;false&#39; 2025-07-21 18:02:14,138 INF
最新发布
07-22
<think>我们正在处理一个Flink Doris连接器任务失败的问题,错误是NullPointerException,发生在Debezium快照变更事件源中。根据用户提供的引用,我们需要结合Flink Doris Connector的使用和配置来排查。 首先,NullPointerException通常表示在代码中尝试访问一个空对象的属性或方法。在Debezium快照变更事件源的上下文中,可能是在处理快照事件时某个对象未被正确初始化。 根据引用[4]:我们自定义DorisSourceFunction时,需要获取相关表的执行计划和分区。如果在这个过程中,某个对象为空(比如连接未建立,或者获取执行计划返回了空值),就可能抛出NullPointerException。 另外,引用[2]中提到了Flink Doris Sink的配置,但用户的问题是关于数据采集(读取)的,所以可能是在Source端的问题。 由于用户提到是Debezium快照变更事件源,说明可能使用了Debezium作为CDC源,然后通过Flink Doris Connector写入Doris。但错误发生在Debezium的snapshot阶段。 可能的排查步骤: 1. **检查依赖版本兼容性**:确保FlinkDoris Connector、Debezium版本兼容。引用[1][2][3]中提到了不同版本的connector,比如`flink-doris-connector-1.16`和`doris-flink-connector`,注意用户使用的是哪个版本。同时,Debezium的版本也需要与FlinkDoris Connector兼容。 2. **检查Doris表结构**:在Debezium进行快照时,需要读取源表的结构。如果源表结构无法正确获取(比如表不存在,或者权限问题导致无法获取元数据),则可能导致空指针。 3. **检查连接配置**:在Flink作业配置中,检查Doris的连接参数(如`fenodes`、`username`、`password`等)是否正确,确保能够连接到Doris集群并访问目标表。 4. **检查快照阶段的数据**:Debezium在快照阶段会读取当前表的数据,如果表中有异常数据(如某些字段为null,但代码中未做空值处理),也可能导致空指针。 5. **查看完整的堆栈信息**:NullPointerException的堆栈信息会指出具体的代码行,从而定位是哪个对象为空。用户需要提供更详细的错误日志。 6. **自定义SourceFunction的初始化**:根据引用[4],在自定义DorisSourceFunction的初始化中,获取执行计划和分区时,需要确保这些步骤不会返回null。如果返回了null,需要处理异常情况。 由于用户没有提供完整的错误堆栈,我们只能给出一般性的建议。 **解决方案建议:** - 确认Flink Doris Connector的版本Flink版本匹配。例如,如果使用Flink 1.16,则connector应为`flink-doris-connector-1.16`(如引用[1]所示)。 - 检查Doris表是否存在,以及Flink作业用户是否有访问该表的权限。 - 在代码中添加空值判断,特别是在初始化获取执行计划和分区的地方。 - 如果问题仍然存在,尝试升级Flink Doris Connector到最新版本,或者查看社区是否已知此问题。 **相关问题**: 根据用户的问题,我们生成以下相关问题: 1. 如何查看Flink Doris Connector的详细日志以定位NullPointerException? 2. Flink Doris Connector与Debezium整合时需要注意哪些配置? 3. 如何确保Flink Doris Connector的版本FlinkDoris版本兼容? 4. 在自定义DorisSourceFunction时,如何安全地获取执行计划和分区以避免空指针? 5. 除了空指针异常,Flink Doris Connector在快照阶段还可能遇到哪些常见错误? 注意:在回答中,我们引用了用户提供的引用[4]来支持我们的分析。</think>### Flink Doris Connector任务中NullPointerException错误排查 根据错误描述,Flink Doris Connector任务在Debezium快照变更事件源中出现`NullPointerException`,可能涉及以下原因及解决方案: #### 1. **依赖版本不兼容** - **问题**:Flink Doris Connector版本Flink/Debezium版本不匹配 - **解决方案**: - 确保Connector版本Flink版本严格对应(参考引用[1][3]) - 检查Maven依赖: ```xml <!-- 示例:Flink 1.16版本对应配置 --> <dependency> <groupId>org.apache.doris</groupId> <artifactId>flink-doris-connector-1.16</artifactId> <version>24.0.1</version> <!-- 需与Doris版本一致 --> </dependency> ``` - 验证Debezium依赖是否兼容(建议使用Doris官方推荐的Debezium版本) #### 2. **表元数据获取失败** - **问题**:快照阶段无法获取表结构信息(引用[4]) - **解决方案**: - 检查Doris表权限:确保Flink作业用户有`SELECT`权限 - 验证表标识符配置: ```sql CREATE TABLE flink_doris_sink ( ... ) WITH ( &#39;table.identifier&#39; = &#39;db.table&#39;, -- 确认库名和表名正确 ... ); ``` - 在`DorisSourceFunction`初始化时添加空值检测: ```java if (partitionInfo == null) { throw new RuntimeException("Doris partition metadata is null"); } ``` #### 3. **快照数据异常** - **问题**:Debezium读取的变更事件包含空值 - **解决方案**: - 启用字段非空校验(在Doris表中设置`NOT NULL`约束) -Flink作业中添加数据清洗: ```java DataStream<Row> cleanedStream = sourceStream .filter(row -> row.getField("key_column") != null); // 过滤关键字段空值 ``` #### 4. **Checkpoint配置问题** - **问题**:状态快照与事务提交冲突(引用[2]) - **解决方案**: - 增加Checkpoint间隔避免冲突: ```sql SET &#39;execution.checkpointing.interval&#39; = &#39;30s&#39;; -- 从10s调整为30s ``` - 添加事务超时配置: ```sql SET &#39;pipeline.time-characteristic&#39; = &#39;EventTime&#39;; SET &#39;doris.sink.max-retries&#39; = &#39;5&#39;; // 增加重试次数 ``` #### 5. **资源未正确加载** - **问题**:Connector JAR未部署到集群(引用[3]) - **解决方案**: ```bash # 将编译后的JAR放入Flink集群 cp doris-flink-connector-1.0.0.jar $FLINK_HOME/jars/ # Yarn集群需预部署到所有节点 ``` > **关键排查步骤**: > 1. 检查Flink TaskManager日志,定位NPE具体抛出位置 > 2. 使用`try-catch`包装快照逻辑捕获空指针来源 > 3. 在测试环境复现问题,逐步缩小数据范围 > 4. 降级Debezium版本至官方兼容版本(如1.6.x) --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值