起因
工作中一位新同事咨询请教Flink client cluster启动失败问题,相关日志文件如下:
2019-03-29 15:01:18,645 | ERROR | [main] | YARN Application Master initialization failed | org.apache.flink.yarn.YarnApplicationMasterRunner (YarnApplicationMasterRunner.java:426)
java.lang.NoSuchMethodError: org.apache.flink.runtime.clusterframework.BootstrapTools.createWebMonitorIfConfigured(Lorg/apache/flink/configuration/Configuration;Lorg/apache/flink/runtime/highavailability/HighAvailabilityServices;Lorg/apache/flink/runtime/webmonitor/retriever/LeaderGatewayRetriever;Lorg/apache/flink/runtime/webmonitor/retriever/MetricQueryServiceRetriever;Lorg/apache/flink/api/common/time/Time;Lorg/apache/flink/runtime/concurrent/ScheduledExecutor;Lorg/slf4j/Logger;)Lorg/apache/flink/runtime/webmonitor/WebMonitor;
at org.apache.flink.yarn.YarnApplicationMasterRunner.runApplicationMaster(YarnApplicationMasterRunner.java:345)
at org.apache.flink.yarn.YarnApplicationMasterRunner$1.call(YarnApplicationMasterRunner.java:195)
at org.apache.flink.yarn.YarnApplicationMasterRunner$1.call(YarnApplicationMasterRunner.java:192)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1781)
at org.apache.flink.runtime.security.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
at org.apache.flink.yarn.YarnApplicationMasterRunner.run(YarnApplicationMasterRunner.java:192)
at org.apache.flink.yarn.YarnApplicationMasterRunner.main(YarnApplicationMasterRunner.java:125)
很明显这个是包有问题,了解得知没有对源码包做任何改动,只是想测试Flink job相关submit的测试,初步定位有个是工程的包冲突了。最终原因有两个:
1. Flink版本1.4,且自带的web工程依赖了很多Flink自身的很多包没有与开发者本身的同步,这个很好解决,在同事的工程下修改flink版本即可;
2. 问题任然无法解决,查看同事工程pom依赖情况,发现冲突的包很多,因此专门花了半个多小时排包确认版本;
正题
个人以为对项目工程依赖的第三方包没有清晰的认识,是不严谨和不负责任的行为!笔者多次遇见某项目包自测ok后但是在不同生产环境下出现的各种诡异错误,最终都是包版本问题。其实方法很简单,如下介绍一种常用的解决方法:
1.首先打开idea工程,打开pom.xml,如图打开依赖图:
依赖关系查看.PNG2.查看依赖关系:
diagram冲突解决.PNG如图很明显有一个xz包连接线是红色的,表明这个包已经产生了冲突。
3.解决冲突
diagram冲突解决.PNG查看pom.xml发现会在引用xz包的地方添加:
<exclusion>
<artifactId>xz</artifactId>
<groupId>org.tukaani</groupId>
</exclusion>
扩展
对于大型工程来说,操作不方便,笔者这里推荐一款好用的idea插件:Maven Helper
安装plugin后,可以发现在pom.xml编辑区域下,多了一个Dependency Analyse:
查看可以发现红色的是冲突:选择右键点击后选择Exclude即可:
maven_helper解决冲突.PNG
其他情况
有些情况比如说一个包必须依赖某包1.2版本,另外一个包必须依赖1.3,那么需要使用maven-shade-plugin对包进行shade处理,本文不做详细赘述,比如常见的 ES和Hbase Guava包冲突解决方式
说明:建议idea 2018版本以上,新版本对各插件的支持比较好,低版本可以不一定有相关支持;另外还是eclipse赶紧改IDE吧!
参考链接:
https://www.elastic.co/cn/blog/to-shade-or-not-to-shade
https://plugins.jetbrains.com/plugin/7179-maven-helper
网友评论