Flink混合编译(No SuchMethodError、ClassNotFoundException、NoClassDefFoundError、Could not resolve )附完整解决方案

本文讲述了在Flink任务部署中遇到的依赖冲突问题,如何通过MavenHelper插件排查并排除冲突,以及如何配置POM文件确保完整打包和正确引用,以避免 NoSuchMethodError、ClassNotFoundException等问题。

上周发生了一件十分不幸的事,就是之前依靠这篇博文进行的依赖冲突解决方案失灵了,又开始爆No Such类似的error,这次我可没有心情再一点点的排查了,直接寄出大杀器maven helper。maven helper 是一款idea的插件。

Step1: 下载maven helper 插件。 

Step2:插件安装完,打开pom文件。可以看到左下角有一个dependency analyzer。

Step3:查看冲突

Step4:排除冲突的依赖,这一点在maven helper里面特别方便。

 点击右边的冲突类,使用鼠标右键点击,会跳出来一个页面,这个时候选择EXCLUDE就可以。

 

更新分割线;

---------------------------------------------------------------------------------------------------------------------------------

一、Flink任务提交集群问题描述

本文的背景是编程语言使用Scala,Flink程序提交的方式是Per-Job Cluster Mode,Flink程序打包形式是采用胖包打包。

Flink程序Jar包提交的过程中,遇到的问题有:

  • NoSuchMethodError
  • Could not resolve ResourceManager address akka....
  • ClassNotFoundException
  • NoClassDefFoundError

上述的所有问题的根源都是maven的pom信息填写不正确,下面具体情况进行具体分析。

二、异常情况分析

2.1 NoSuchMethodError 和NoClassDefFoundError分析

这个异常就是找不到特定方法,这种异常的造成有两个原因。

1、有两个名字和引用位置都相同的类,这就导致了JVM对类进行加载的时候,找不到具体要加载哪个类,有可能同一个Jar包存在多个版本。

2、如果是提交到集群的话,那么极有可能有可能就是程序打包的时候,没有将需要的类打入到Jar包里面。

原因1的解决方案和方法:

使用Idea查看同名引用的类有哪些,找到其对应的Jar包。

在Pom文件中剔除掉冲突的Jar包(仅作为举例说明,按实际需求来就OK)

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
             <exclusions>
             <exclusion> 
                 <groupI
在使用 FlinkSQL 处理时间字段时,如果遇到 `Text could not be parsed at index` 错误,通常是因为数据源中的时间字符串格式与目标表定义的 `TIMESTAMP` 或 `DATE` 类型不匹配。FlinkSQL 在解析时间字段时会按照预设的格式尝试转换输入文本,如果格式不符合要求或包含非法字符,则会抛出此异常。 ### 常见原因及解决方法 #### 1. 时间字符串格式不匹配 确保 Kafka 中写入的时间字段格式与 FlinkSQL 表中定义的时间字段格式一致。例如,若字段定义为: ```sql CREATE TABLE source_table ( ... event_time TIMESTAMP(3) ) WITH ( 'connector' = 'kafka', ... ); ``` 则 Kafka 中的数据应提供类似 `"2023-04-05 12:30:45.123"` 的格式。否则,Flink 将无法正确解析该字段[^1]。 **解决方法:** - 使用 Kafka 生产端统一格式化时间字段。 - 如果数据源格式不可控,可在 FlinkSQL 中通过 `CAST` 或 `TO_TIMESTAMP` 函数进行自定义格式转换: ```sql SELECT ... TO_TIMESTAMP(event_time_str, 'yyyy-MM-dd HH:mm:ss') AS event_time FROM source_table; ``` #### 2. 含有非法字符或空值 有时时间字段可能为空或包含非标准字符(如中文、特殊符号等),也会导致解析失败。 **解决方法:** - 使用 `CASE WHEN` 判断并过滤非法数据: ```sql SELECT ... CASE WHEN REGEXP_MATCH(event_time_str, '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$') THEN TO_TIMESTAMP(event_time_str) END AS event_time FROM source_table; ``` - 若允许空值,可结合 `COALESCE` 设置默认时间: ```sql SELECT ... COALESCE(TO_TIMESTAMP(event_time_str), TO_TIMESTAMP('1970-01-01 00:00:00')) AS event_time FROM source_table; ``` #### 3. 使用 JSON 解析函数处理嵌套结构 当时间字段位于 JSON 字符串内部时,需先提取再转换: ```sql SELECT ... TO_TIMESTAMP(JSON_VALUE(json_data, '$.event_time')) AS event_time FROM source_table; ``` #### 4. 自定义反序列化器(Deserializer) 若上述方式仍无法满足需求,可以编写自定义的 Kafka 反序列化器,在读取阶段将原始数据进行清洗和格式标准化后再传入 FlinkSQL 流程中。 --- ### 总结 处理 `Text could not be parsed at index` 错误的核心在于确保时间字段的格式一致性,并在必要时通过 SQL 函数进行格式转换和容错处理。此外,数据质量的源头控制也是避免此类问题的关键因素之一。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大锤爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值