【问题标题】:Remove JAR from Spark default classpath in EMR从 EMR 中的 Spark 默认类路径中删除 JAR
【发布时间】: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.userClassPathFirstspark.executor.userClassPathFirst

【问题讨论】:

    标签: apache-spark amazon-emr spark-submit


    【解决方案1】:

    一种方法是指向您的 guice 旧版本 jar 所在的 lib,然后将其排除。

    spark-submit 的示例 shell 脚本:

    export latestguicejar='your path to latest guice jar'
    
       #!/bin/sh
        # build all other dependent jars in OTHER_JARS
    
    JARS=`find /usr/lib/spark/jars/ -name '*.jar'`
    OTHER_JARS=""
       for eachjarinlib in $JARS ; do    
    if [ "$eachjarinlib" != "guice-3.0.jar" ]; then
           OTHER_JARS=$eachjarinlib,$OTHER_JARS
    fi
    done
    echo ---final list of jars are : $OTHER_JARS
    echo $CLASSPATH
    
    spark-submit --verbose --class <yourclass>
    ... OTHER OPTIONS
    --jars $OTHER_JARS,$latestguicejar,APPLICATIONJARTOBEADDEDSEPERATELY.JAR
    

    另见霍尔顿answer。检查你的 spark 版本有什么可用的。

    根据文档,runtime-environmentuserClassPathFirst 目前已出现在最新版本的 spark 中。

    spark.executor.userClassPathFirst
    spark.driver.userClassPathFirst

    为此,您可以使用所有应用程序级别的依赖项制作 uber jar。

    【讨论】:

    • Holdens answer / userClassPathFirst 不适用于这种情况,因为我在客户端模式下运行 Spark(我将编辑我的问题以包含此信息,我的错)。不过我会试试你的建议。
    • 好的,当您发送 --jars 和您的 uber jar 时,您是否还需要驱动程序和执行程序类路径。我的意思是如果你真的必须这样做,你可以把你的 uber jar 放在驱动程序和执行程序类路径中
    • 您好,您能解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 2012-11-26
    • 2018-11-24
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多