在运行spark.ml机器学习库时,执行失败,错误日志为
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/spark/ml/recommendation/ALS
…
Caused by: java.lang.ClassNotFoundException: org.apache.spark.ml.recommendation.ALS
…
或者在运行spark.mllib机器学习库时
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/spark/mllib/recommendation/Rating
…
Caused by: java.lang.ClassNotFoundException: org.apache.spark.mllib.recommendation.Rating
解决方法:
查看maven依赖,
我使用的依赖为
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.11</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
将scope修改为compile,即
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.11</artifactId>
<version>${spark.version}</version>
<scope>compile</scope>
</dependency>
重新执行程序,运行成功。
原因:
scope=provided时,我们引用的artifact只在编译、测试阶段被加载,而在运行阶段,程序会认为容器中已经提供了这个artifact的jar包,所以程序就会抛出ClassNotFoundException异常。
而scope=compile,则我们依赖的artifact会在编译、测试、运行阶段都被加载到容器中。