一.引言
使用 Flink 1.13.1 + scala 2.11.12 的组合进行 Flink 本地测试是,报错 .NoSuchMethodError: com.twitter.chill.java.Java8ClosureRegistrar.areOnJava8()Z,经过前面多次的 noSuchMethod 的折磨,现在已经轻车熟路,直接开始排查。
二.错误分析
1.字面含义
编辑
报错显示 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
既然没有 areOnJava8()Z 这个方法,我们首要的任务就是找到这个该方法所在类 Java8ClosureRegistrar 一看究竟,IDEA 可以快捷搜索直接锁定,可以看到项目内只要一个 Java8ClosureRegistrar.class,所以这里基本排除依赖冲突的问题,大概率是高低版本导致。
编辑
如果不是 IDEA,也可以到 maven 库按照字符排序快速搜查:
编辑
查看 0.9.3 版本的 com.twitter.chill 的 Java8ClosureRegistrar 类,果然没有 areOnJava8()Z,由于我是用的 Flink 版本相对较高,所以大概率匹配了更高版本的 com.twitter.chill,直接进入 maven 库查找高版本 com.twitter.chill:
编辑
博主使用 scala 2.11,最新的 0.10.0 支持 2.11,所以直接尝试最新的:
编辑
3.问题解决
<!-- https://mvnrepository.com/artifact/com.twitter/chill --> <dependency> <groupId>com.twitter</groupId> <artifactId>chill_2.13</artifactId> <version>0.10.0</version> </dependency>
根据 maven 加载依赖的先后顺序,这里直接将新版本依赖加到 dependencies 的首位。在 maven 选项下执行 reload.Project:
编辑
reload 后任务执行正常:
编辑
三.总结
编辑
更新了 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.
大致翻译了一下:
no such method error 是二进制不兼容问题。您似乎在类路径上有不正确的 chill 版本。 当您有两个使用不同版本的依赖项并且选择了错误的依赖项时,就会发生这种情况。 我不认为我们可以在 library 本身解决这个问题。
也是似懂非懂的,可能 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 解决
除此之外,大数据常见异常解决 专栏里还有很多大数据相关的异常与对应解决方法,有兴趣的童鞋可以移步。