[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文件。

posted @ 2023-02-12 20:01  CQzhangyu  阅读(194)  评论(0编辑  收藏  举报