Flink - NoSuchMethodError: com.twitter.chill.java.Java8ClosureRegistrar.areOnJava8()Z

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 使用 Flink 1.13.1 + scala 2.11.12 的组合进行 Flink 本地测试是,报错.NoSuchMethodError: com.twitter.chill.java.Java8ClosureRegistrar.areOnJava8()Z,经过前面多次的 noSuchMethod 的折磨,现在已经轻车熟路,直接开始排查。...............

一.引言

使用 Flink 1.13.1 + scala 2.11.12 的组合进行 Flink 本地测试是,报错 .NoSuchMethodError: com.twitter.chill.java.Java8ClosureRegistrar.areOnJava8()Z,经过前面多次的 noSuchMethod 的折磨,现在已经轻车熟路,直接开始排查。

二.错误分析

1.字面含义

image.gif编辑

报错显示 com.twiter.chill.java.Java8ClosureRegistrar 类没有 areOnJava8()Z 这个方法,这个 Z 代表该函数返回值为 boolean,这里再顺便回顾下不同字符代表的函数返回值:

Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully-qualified-class fully-qualified-class
[ type type[]
( arg-types ) ret-type method type
<init> 构造方法
<cinit> 静态类初始化代码

2.深度分析

def isJavaLambda(klass: Class[_]): Boolean =
    Java8ClosureRegistrar.areOnJava8 && klass.getName().indexOf('/') >= 0

image.gif

既然没有 areOnJava8()Z 这个方法,我们首要的任务就是找到这个该方法所在类 Java8ClosureRegistrar 一看究竟,IDEA 可以快捷搜索直接锁定,可以看到项目内只要一个 Java8ClosureRegistrar.class,所以这里基本排除依赖冲突的问题,大概率是高低版本导致。

image.gif编辑

如果不是 IDEA,也可以到 maven 库按照字符排序快速搜查:

image.gif编辑

查看 0.9.3 版本的 com.twitter.chill 的 Java8ClosureRegistrar 类,果然没有 areOnJava8()Z,由于我是用的 Flink 版本相对较高,所以大概率匹配了更高版本的 com.twitter.chill,直接进入 maven 库查找高版本 com.twitter.chill:

image.gif编辑

博主使用 scala 2.11,最新的 0.10.0 支持 2.11,所以直接尝试最新的:

image.gif编辑

3.问题解决

<!-- https://mvnrepository.com/artifact/com.twitter/chill -->
<dependency>
    <groupId>com.twitter</groupId>
    <artifactId>chill_2.13</artifactId>
    <version>0.10.0</version>
</dependency>

image.gif

根据 maven 加载依赖的先后顺序,这里直接将新版本依赖加到 dependencies 的首位。在 maven 选项下执行 reload.Project:

image.gif编辑

reload 后任务执行正常:

image.gif编辑

三.总结

image.gif编辑

更新了 0.10.0 版本后,再次查看 Java8ClosureRegistrar 方法,发现依然没有 areOnJava8()Z 的方法,翻了下 GITHUB 上大神的解释:

no such method error is a binary incompatibility problem. You seem to have 
incorrect versions of chill on the classpath.This happens when you have two dependencies that use different versions and the wrong one gets selected.
I don't think we can fix this in the library itself. Please reopen if you 
feel this is a bug we can fix.

image.gif

大致翻译了一下:

no such method error 是二进制不兼容问题。您似乎在类路径上有不正确的 chill 版本。
当您有两个使用不同版本的依赖项并且选择了错误的依赖项时,就会发生这种情况。
我不认为我们可以在 library 本身解决这个问题。

image.gif

也是似懂非懂的,可能 areOnJava8()Z 就是验证 java 环境的隐函数吧,有了解的童鞋欢迎科普。总的来说,上面这个错误大致分为两种情况:A.版本过低 B.依赖冲突。

最后铺一下博主这两年遇到的 NoSuchMethod 的坑,有需要的大家也可以看一下解决过程,noSuchMethod 这个错误很痛苦,但是解决了很爽:

Spark : local 模式 org.apache.hadoop.conf.Configuration.getPassword(Ljava/lang/String;)[C

Spark: java.lang.NoSuchMethodError: com.alibaba.fastjson.JSONObject.getOrDefault

Java- MR 读写 orc 之 NoSuchMethodError: hive.ql.exec.vector.VectorizedRowBatch.getMaxSize

Spark - ml.dmlc.xgboost4j / spark 版本匹配与 NoSuchMethodError 解决

除此之外,大数据常见异常解决 专栏里还有很多大数据相关的异常与对应解决方法,有兴趣的童鞋可以移步。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
1月前
|
Java 开发工具 流计算
flink最新master代码编译出现Java Runtime Environment 问题
在尝试编译Flink源码时遇到Java运行时环境致命错误:EXCEPTION_ACCESS_VIOLATION。问题出现在JVM.dll+0x88212。使用的是Java 11.0.28和Java HotSpot(TM) 64-Bit Server VM。系统为Windows客户端,没有生成核心dump文件。错误日志保存在hs_err_pid39364.log和replay_pid39364.log。要解决这个问题,建议检查JDK版本兼容性,更新JDK或参照错误报告文件提交Bug至http://bugreport.java.com/bugreport/crash.jsp。
|
6月前
|
Java 流计算
Flink类型与Java基本类型关系映射表
Flink类型与Java基本类型关系映射表
37 0
|
16天前
|
Java 大数据 API
[AIGC] Flink入门教程:理解DataStream API(Java版)
[AIGC] Flink入门教程:理解DataStream API(Java版)
|
2月前
|
Java 关系型数据库 MySQL
Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
【2月更文挑战第33天】Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
67 2
|
3月前
|
Java 流计算
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
【2月更文挑战第6天】在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
22 3
|
3月前
|
关系型数据库 网络安全 对象存储
Flink报错问题之Flink报错java.io.EOFException: SSL peer shut down incorrectly如何解决
Flink报错通常是指在使用Apache Flink进行实时数据处理时遇到的错误和异常情况;本合集致力于收集Flink运行中的报错信息和解决策略,以便开发者及时排查和修复问题,优化Flink作业的稳定性。
|
3月前
|
Java 流计算
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
34 4
|
4月前
|
Java API Scala
【Flink】Flink Java 统计词频 开发
【1月更文挑战第26天】【Flink】Flink Java 统计词频 开发
|
5月前
|
消息中间件 监控 Java
一次线上Flink 背压情况分析之重新认识java dump 文件
一次线上Flink 背压情况分析之重新认识java dump 文件
77 0
|
5月前
|
SQL 存储 监控
Flink CDC用flinksql方式采集多张表,是每张表启动一个java进程吗?
Flink CDC用flinksql方式采集多张表,是每张表启动一个java进程吗?
56 0