第一次用 spark-submit
提交任务,是 Scala 的程序,命令格式是
spark-submit --class <main-class> --master local[*] --name "My first Spark Job" spark-test-fat-1.0-SNAPSHOT.jar
结果报出错误
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:330)
at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:263)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:318)
......
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Google 查了下,是需要把 jar 文件中的 META-INF/*.RSA META-INF/*.DSA META-INF/*.SF
文件清理掉。我们可以执行如下命令从现有的 jar 中除去
zip -d <jar file name>.jar META-INF/*.RSA META-INF/*.DSA META-INF/*.SF
是因为 jar 包中包含有这些文件才造成提交 Spark 时验证文件签名摘要时失败。
由于我是采用 maven-shade-plugin
生成前面那个 fat(也就 uberjar) jar 包的,其实在配置这个构建插件的时候也可以不把 META-INF/*.RSA META-INF/*.DSA META-INF/*.SF
三种类型的文件包含在最终的 jar 包中。需要在生成 uberjar 时把它们排除掉,见下面的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> <configuration> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </plugin> |
这样后,再执行 mvn package
生成的 uberjar 包就可以成功被 spark-submit
提交了。
参考:Solving a Spark Invalid signature file digest for Manifest main attributes error