[Spark] 用Maven构建Spark项目时可能出现的问题
[Spark] 用Maven构建Spark项目时可能出现的问题
至于如何安装Spark,这个网站写的很清楚:Apache Spark - Installation (tutorialspoint.com)
另外建议阅读官方文档。里面介绍了如何快速构建一个Spark项目。
这里我想Maven来构建一个java项目。在Maven中添加Spark很容易,只需要在dependencies里加入对应的依赖即可。详细内容可以去mvnrepository查。比如:
<dependency> <!-- Spark dependency -->
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.3.1</version>
<scope>provided</scope>
</dependency>
可能出现的问题
问题一
Error: Failed to load class WordCount.
这可能是在spark-submit中,--class
的参数不对导致的。注意--class
的参数需要是一个完整的类名。如果你想要用的class的package是spark_test
,那么你就要写--class spark_test.WordCount
而不是--class WordCount
问题二
Error: Failed to load spark_test.WordCount: org/apache/logging/log4j/LogManager
我一开始使用的Spark版本是3.2.3,我想使用log4j2。但是Spark的3.2.x之前的版本使用的都是log4j1。这导致我的log4j2和Spark的log4j1产生冲突。虽然mvn package
不会出问题,但在spark-submit
时,就会报上面的那个错误,无法运行。
解决方法:最简单的解决办法就是将Spark升级到3.3.x。3.3版本以后的Spark都使用log4j2,这就直接避免了上面的问题。
如果你偏要同时使用低版本的Spark和log4j2,那外网上应该也有一些解决办法,只不过不推荐(我也没看懂)、
问题三
如何在spark-submit
中使用第三方库?
比如,我使用了一个picocli
的第三方库,并且在pom.xml
中添加了对应的依赖。这在mvn package
时是不会出任何问题的。但是当spark-submit
时,就会出现问题:
Exception in thread "main" java.lang.NoClassDefFoundError: picocli/CommandLine
这是因为spark-submit
并没有找到第三方库的jar包。
解决方法:在官方文档中已经简要说明了解决办法。只需要在maven的编译过程中,将第三方库一并编入到生成的jar包中去就好了。具体做法是使用插件,在pom.xml
中添加:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>cqzhangyu.spark_test.WordCount</mainClass> <!-- change to your own project name -->
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在spark-submit
时,别忘了将jar文件换成生成的xxx-1.0-jar-with-dependencies.jar
文件。
| 欢迎来原网站坐坐! >原文链接<