环境:
hadoop:2.5.3.0-37版本
Spark:1.6.2
斯卡拉:2.10.5
java:1.8版本
快速总结:fat jar spark-assembly-1.6.2.2.5.3.0-37-hadoop2.7.3.2.5.3.0-37.jar包含了来自bouncycastle jar文件的类文件,并去除了bouncycastle的签名;因此,bouncycastleprovider不能用作编解码器,因为该逻辑要求使用正确的签名验证包含的jar文件。
堆栈跟踪:
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:100)
at javax.crypto.SecretKeyFactory.getInstance(SecretKeyFactory.java:204)
at ai.by247.MainJob$.scrapeLogs(MainJob.scala:57)
at ai.by247.MainJob$.main(MainJob.scala:26)
at ai.by247.MainJob.main(MainJob.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:738)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.util.jar.JarException: file:/hdp/2.5.3.0-37/spark/lib/spark-assembly-1.6.2.2.5.3.0-37-hadoop2.7.3.2.5.3.0-37.jar has unsigned entries - org/apache/spark/SparkConf$$anonfun$5.class
at javax.crypto.JarVerifier.verifySingleJar(JarVerifier.java:500)
at javax.crypto.JarVerifier.verifyJars(JarVerifier.java:361)
at javax.crypto.JarVerifier.verify(JarVerifier.java:289)
at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:159)
at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:185)
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:97)
... 13 more
触发此错误的scala逻辑很简单:
Security.insertProviderAt(new BouncyCastleProvider(), 1)
SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC", "BC")
在阅读了几篇文章之后,我尝试使用各种配置选项来解决这个问题,但到目前为止没有任何效果。如:
--conf spark.driver.extraJavaOptions="-Djava.security.properties=file:/path/to/my.java.security -Djava.security.policy=file:/path/to/my.security.policy"
其中my.java.security是:
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
我的安全政策是:
grant {
// There is no restriction to any algorithms.
permission javax.crypto.CryptoAllPermission;
};
可能我可以通过强制spark submit为类路径中的bouncycastle jar文件的签名版本设置驱动程序和执行程序逻辑的优先级来解决这个问题。从我读到的文件中不清楚这是可能的。
更一般地说:我怀疑将bouncycastle或任何其他已签名jar文件的内容包含到spark-assembly-hadoop.jar中只是一个错误。也就是说,如果编译一个fatjar会去掉包含的已签名jar文件的签名,那么在fatjar中是否存在对该逻辑有用的问题(我意识到这个版本的spark 1.6.2是一个遗留版本,所以也许这个问题已经在最近的快照中得到了解决。)
我怎样才能避开这个问题?
暂无答案!
目前还没有任何答案,快来回答吧!