【发布时间】:2019-05-22 03:23:57
【问题描述】:
我正在以我的超级 JAR 作为主类的 EMR 步骤中执行 spark-submit 脚本,例如
spark-submit \
....
--class ${MY_CLASS} "${SUPER_JAR_S3_PATH}"
...等
但 Spark 默认加载 jar 文件:/usr/lib/spark/jars/guice-3.0.jar 其中包含 com.google.inject.internal.InjectorImpl,该类也在 Guice-4.x 中我的超级 JAR 中的 jar。当我的服务启动时,这会导致java.lang.IllegalAccessError。
我尝试在spark-submit 中设置一些Spark conf 以将我的超级jar 放在类路径中,希望在Spark 加载guice-3.0.jar 之前先加载它。它看起来像:
--jars "${ASSEMBLY_JAR_S3_PATH}" \
--driver-class-path "/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:${SUPER_JAR_S3_PATH}" \
--conf spark.executor.extraClassPath="/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:${SUPER_JAR_S3_PATH}" \
但这会导致同样的错误。
有没有办法从默认的 spark 类路径中删除 guice-3.0.jar,以便我的代码可以使用封装在 Guice-4.x JAR 中的 InjectorImpl?我也在客户端模式下运行 Spark,所以我不能使用 spark.driver.userClassPathFirst 或 spark.executor.userClassPathFirst
【问题讨论】:
标签: apache-spark amazon-emr spark-submit