当前位置: 首页 > 知识库问答 >
问题:

从EMR中的Spark默认类路径中删除JAR

金嘉言
2023-03-14
  spark-submit \
    ....
    --class ${MY_CLASS} "${SUPER_JAR_S3_PATH}"

...等

但是,默认情况下,Spark会加载jar文件:/usr/lib/Spark/jars/guice-3.0.jar,其中包含com.google.inject.internal.injectorImpl,这个类也在我的超级jar中的Guice-4.x jar中。当我的服务启动时,这将导致java.lang.IllegalAccesserRor

我尝试在spark-submit中设置一些Spark conf,将super 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.xJAR中打包的InjectorImpl?我还在客户端模式下运行Spark,所以我不能使用Spark.driver.userclasspathfirstSpark.executor.userclasspathfirst

共有1个答案

易炳
2023-03-14

一种方法是指向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

也见霍尔登斯回答。请检查您版本的spark有什么可用的。

 类似资料:
  • 对于运行在YARN (yarn-client)上的Spark作业,可以用位于HDFS的jar指定类路径吗 这有点像使用Map Reduce jobs:

  • 问题内容: 我试图在一些使用ant脚本的旧项目上进行“干净的专家”设置。我对蚂蚁知之甚少,所以我的问题似乎很幼稚。 我快完成了,但是由于classpath中的冗余,所以传递ant脚本失败了。如果我了解构建,则这些行应将“提供”范围内的每个库添加到类路径中: 然后这个: 将那些依赖项添加到ant.home目录中的库中。 麻烦的是,我使用的maven pom依赖于我无法修改的父pom,因此,我的类路径

  • 我在Win10中使用Windows子系统Linux(Ubuntu 18.04),并在其中安装了一个Maven。此外,我之前在Win10中安装了一个maven。现在,当我在WSL中使用时,它告诉我maven编译失败。我使用,发现它引用了Win10中安装的Maven。 此外,我运行并发现win10的路径被添加到wsl的路径中。我在使用WSL的时候不想使用Win10的路径中的任何东西,该怎么办呢?

  • 我有一个包含一些文件路径的长文本。 我想做的是从其中删除路径。文件路径都类似于: 我知道使用“^/all”将选择以/all开头的句子,并选择以.js$结尾的句子。但我无法将这些合并在一起以选择整个文件路径。 毕竟,正则表达式应该放在下面的代码上以删除路径。 我能为它写正则表达式吗?有什么工具吗?

  • 问题内容: 第二个命令是否将当前路径添加为另一个搜索路径? 用冒号分隔多个路径是否正确? 默认情况下,当前路径不是始终在ClassPath中,因此不需要显式指定吗? 谢谢。 问题答案: 从Oracle的页面上设置类路径: 默认的类路径是当前目录。设置CLASSPATH变量或使用命令行选项将 覆盖 默认值,因此,如果要在搜索路径中包括当前目录,则必须包括“。”。在新设置中。 使用了Windows和类

  • 问题内容: 想知道不指定classpath选项时默认的classpath是什么吗? 问题答案: 当前的工作目录()。 从Java™教程中:PATH和CLASSPATH: 类路径 的 默认值为“。” ,表示仅搜索当前目录。指定CLASSPATH变量或-cp命令行开关将覆盖此值。 这包括子目录吗? 不,在类路径中没有条目是“递归的”。您必须明确列出每个子目录(或jar)。但是,如果您有一个表示clas