一次 Maven 事故

2018 年 1 月 8 日 ImportNew

(点击上方公众号,可快速关注)


来源:whatbeg,

whatbeg.com/2017/12/24/mavenaccident.html


改动mllib中的org.apache.spark.ml.tree.impl.DTStatsAggregator源码,加了一个原来没有的allStats(): Array[Double] = ..的方法,然后打成MLlib包,替换maven库中的mllib包。


报IllegalAccessError:


Caused by: java.lang.IllegalAccessError: tried to access method org.apache.spark.ml.tree.impl.DTStatsAggregator.allStats()[D from class org.apache.spark.ml.tree.impl.RandomForestImpl$


private[ml] val allStatSize

val allStats = new Array[Double](allStatSize)


应该要能访问到


是不是用的不是我的jar,或者用的不是我的jar中的class?


运行jar包时设置


--conf "spark.driver.extraJavaOptions=-XX:+TraceClassLoading -XX:+TraceClassUnloading


监测类的加载情况,果然发现有一条


[Loaded xxx from file:/home/huqiu/programs/spark/jars/spark-mllib_2.11-2.1.0.jar


这说明程序不从我打好的jar包中加载class,而从spark安装目录中的jars目录中读取了。


为什么从spark本地读而不从打好的jar包中读?


为了先解决问题,我把mllib包复制到SPARK_HOME的jars目录中,这下总能读到我的jar了吧。


但是又出现一个问题:


java.lang.NoClassDefFoundError: Could not initialize class org.apache.spark.ml.core.JNAScala$

 

Caused by: java.lang.ClassNotFoundException: com.sun.jna.Native


原来是没找到jna的Native class,一看,确实没有打入mllib包中,那是什么原因呢?难道是谁把它exclude掉了?

重新编译一下,发现这么一条:


[INFO] Excluding net.java.dev.jna:jna:jar:4.2.2 from the shared jar.


说白了就是排除了net.java.dev.jna:jna:jar,所以写的代码中用到Native的都会找不到类。


后来发现是spark-parent排除的,且删掉spark-parent的exclude的语句也没用,根本原因在于mllib的打包方式不会把其依赖打入mllib的jar包中。


解决的方法就是将此依赖打入mllib中,但是这样就会变成mllib-jar-with-dependencies,肯定不是我们想要的结果。


这就涉及到了代码设计的层面了,一般情况下,不建议直接修改Mllib源码,更不要说在Mllib源码中还加入外部包了,这样太紧耦合了,比较建议的方法是自己建立一个project,建立于spark mllib同样的包路径即可,然后修改需要修改的文件,但缺点是改动文件需要改名字,不然系统会读取底层Mllib的同名文件而不会读取你项目中的。但是这样确是松耦合的。


目前还没有找到好的方法,最小程度上改动代码,增加或删除一些东西。


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

登录查看更多
0

相关内容

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
【牛津大学&DeepMind】自监督学习教程,141页ppt
专知会员服务
179+阅读 · 2020年5月29日
【CMU】深度学习模型中集成优化、约束和控制,33页ppt
专知会员服务
45+阅读 · 2020年5月23日
专知会员服务
123+阅读 · 2020年3月26日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
使用 C# 和 Blazor 进行全栈开发
DotNet
6+阅读 · 2019年4月15日
工作4年,我从阿里巴巴辞职到了国企
互联网架构师
3+阅读 · 2019年3月17日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
超级!超级!超级好用的视频标注工具
极市平台
8+阅读 · 2018年12月27日
深度学习面试100题(第71-75题)
七月在线实验室
5+阅读 · 2018年8月2日
消息队列技术点梳理(思维导图版)
架构文摘
3+阅读 · 2018年4月3日
Talking-Heads Attention
Arxiv
15+阅读 · 2020年3月5日
Arxiv
101+阅读 · 2020年3月4日
Arxiv
5+阅读 · 2019年10月31日
Knowledge Flow: Improve Upon Your Teachers
Arxiv
5+阅读 · 2019年4月11日
Arxiv
27+阅读 · 2017年12月6日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
【牛津大学&DeepMind】自监督学习教程,141页ppt
专知会员服务
179+阅读 · 2020年5月29日
【CMU】深度学习模型中集成优化、约束和控制,33页ppt
专知会员服务
45+阅读 · 2020年5月23日
专知会员服务
123+阅读 · 2020年3月26日
相关资讯
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
Linux挖矿病毒的清除与分析
FreeBuf
14+阅读 · 2019年4月15日
使用 C# 和 Blazor 进行全栈开发
DotNet
6+阅读 · 2019年4月15日
工作4年,我从阿里巴巴辞职到了国企
互联网架构师
3+阅读 · 2019年3月17日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
超级!超级!超级好用的视频标注工具
极市平台
8+阅读 · 2018年12月27日
深度学习面试100题(第71-75题)
七月在线实验室
5+阅读 · 2018年8月2日
消息队列技术点梳理(思维导图版)
架构文摘
3+阅读 · 2018年4月3日
相关论文
Talking-Heads Attention
Arxiv
15+阅读 · 2020年3月5日
Arxiv
101+阅读 · 2020年3月4日
Arxiv
5+阅读 · 2019年10月31日
Knowledge Flow: Improve Upon Your Teachers
Arxiv
5+阅读 · 2019年4月11日
Arxiv
27+阅读 · 2017年12月6日
Top
微信扫码咨询专知VIP会员