Spark 提交任务时 Invalid signature file digest 错误
第一次用 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<plugin><br/>
2 <groupId>org.apache.maven.plugins</groupId><br/>
3 <artifactId>maven-shade-plugin</artifactId><br/>
4 <version>3.0.0</version><br/>
5 <executions><br/>
6 <execution><br/>
7 <phase>package</phase><br/>
8 <goals><br/>
9 <goal>shade</goal><br/>
10 </goals><br/>
11 </execution><br/>
12 </executions><br/>
13 <configuration><br/>
14 <filters><br/>
15 <filter><br/>
16 <artifact>*:*</artifact><br/>
17 <excludes><br/>
18 <exclude>META-INF/*.SF</exclude><br/>
19 <exclude>META-INF/*.DSA</exclude><br/>
20 <exclude>META-INF/*.RSA</exclude><br/>
21 </excludes><br/>
22 </filter><br/>
23 </filters><br/>
24 </configuration><br/>
25</plugin>这样后,再执行 mvn package 生成的 uberjar 包就可以成功被 spark-submit 提交了。
参考:Solving a Spark Invalid signature file digest for Manifest main attributes error
永久链接 https://yanbin.blog/spark-submit-invalid-signature-file-digest-error/, 来自 隔叶黄莺 Yanbin's Blog[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。