为什么 运行 Spark 作业无法在 EMR 上的 uberjar 中找到 类 而它在本地工作正常?

Why does running Spark job fail to find classes inside uberjar on EMR while it works locally fine?

我有一个 Spark 作业,它使用一些外部库来工作。当我 运行 通过 IntelliJ 的主要方法在本地作业时,作业 运行 没有任何问题。但是,当我将我的工作组装成 jarfile(我使用 sbt 创建了一个 UberJAR)并尝试在 EMR 上 运行 它时,它会抛出 ClassNotFoundException.

我检查过 class 确实在 jarfile 中,所以它应该可以用于 运行 的作业。我还尝试了 spark-submit 选项 spark.driver.extraClassPathspark.driver.extraLibraryPathspark.executor.extraClassPathspark.executor.extraLibraryPath 以及 spark.driver.userClassPathFirstspark.executor.userClassPathFirst。另外,我尝试在代码 sparkContext.addJar("/mnt/jars/myJar") 中做。 None 其中对我有用。

此外,当 运行 在 EMR 上运行时,我可以读取表明已添加 JAR 的日志(不确定它是否加载到 class 路径,但应该是因为其他 classes 正在正确加载):

15/11/02 04:10:26 INFO SparkContext: Added JAR file:///mnt/my-app-1.0-SNAPSHOT.jar at http://172.31.42.244:44471/jars/my-app-1.0-SNAPSHOT.jar with timestamp 1446437426661

我运行想不出还有什么可以尝试的。我一直在研究,我在 Spark JIRA 板上看到很少的票,但没有与我的问题相似的东西。

我运行正在使用 EMR 发布标签 4.1.0 (Spark 1.5.0)、Java 7、sbt 0.13.7 和 Scala 2.10.5。

我认为在 EMR 上启动您的工作时,您需要为您的 jar 依赖项提供 s3 位置 a la the manual 例如-u s3://sparksupport/libs。当 运行 spark 时,这些 jar 将被添加到类路径中。

原来是 Apache Commons Lang SerializationUtils 的问题。有一个未解决的问题,即使 class 在多 class 加载器环境中的 class 路径中,class 也会抛出 ClassNotFoundExceptionhttps://issues.apache.org/jira/browse/LANG-1049

我们离开了图书馆,我们的 Spark 作业现在运行良好。问题最终与Spark无关