在spark作业上使用elasticsearch时guava jar冲突

4uqofj5v  于 2021-05-29  发布在  Hadoop
关注(0)|答案(5)|浏览(609)

所以我有一段代码,可以将记录索引到弹性体中。这段代码是用spark和hadoop运行的。我刚把elasticsearch升级到2.3.1。当我在本地机器上运行我的代码时,它工作得很好。当我试图用spark提交作业运行它时,我
java.lang.nosuchmethoderror:com.google.common.util.concurrent.moreexecutors.directexecutor()ljava/util/concurrent/executor;
在搜索了google之后,我意识到问题出在Guava上,所以在pom.xml中我把
com.google.guava guava 19.0下的dependencymanagement。
但是这个错误仍然会发生,所以我猜spark(1.6)也在使用一个旧版本的guava,但是我找不到解决它的地方和方法。。。我还试着做了一个新的jar,用它来搜索2.3.1+com.google.common,但是也没用

pnwntuvh

pnwntuvh1#

在向spark cluster提交工作时,我面临着完全相同的问题@阿尔伯特第二个解决方案对我有用。我使用elastic search 2.4.0客户端作为依赖项,因此我找到了2.4.0的替代着色jar:

<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.4.0-atlassian-shaded-1</version>
</dependency>
tpgth1q7

tpgth1q72#

在使用Yarn、Spark和SparkCassandra连接器时,如何解决Guava11.0.2和16.0之间的冲突?工作正常。你只需要设置 spark.driver.userClassPathFirsttrue .

vecaoik1

vecaoik13#

使用spark提交选项:

spark-submit --jars path_to/guava-18.0.jar,.. \
--conf spark.driver.extraClassPath=guava-18.0.jar \
--conf spark.executor.extraClassPath=guava-18.0.jar  \
...
gopyfrb3

gopyfrb34#

我也遇到了同样的问题,我可以通过将“guava-16.0.1.jar”添加到“--addjars”属性并设置sparkconf.set(“spark.driver.extraclasspath”,“guava-16.0.1.jar”)来解决这个问题;因为“spark.driver.extraclasspath”条目将在驱动程序的类路径之前,所以您上传的guava.jar将覆盖hadoop的guava.jar。

SparkConf sparkConf = new SparkConf().setAppName("YarnResource").setMaster("yarn-cluster").set("spark.driver.extraClassPath", "guava-16.0.1.jar");

List<String> argList = new ArrayList<>();
int argIndex = 0;
argList.add(argIndex++, "--addJars");
argList.add(argIndex++, "/home/myuser/myapp/lib/guava-16.0.1.jar"); 
String[] sparkArgArray = argList.toArray(new String[argList.size()]);
ClientArguments cArgs = new ClientArguments(sparkArgArray, sparkConf);
// create an instance of yarn Client client
Client client = new Client(cArgs, hadoopConfig, sparkConf);
0s7z1bwu

0s7z1bwu5#

问题是elasticsearch和spark都使用guava,但版本不同:es使用18.0,spark使用14.0。
因此,在pom.xml中,您可以尝试排除spark使用的旧版本:

<dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core</artifactId>
        <version>1.6.0</version>
        <exclusions>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

或者使用博客文章中描述的方法:https://www.elastic.co/blog/to-shade-or-not-to-shade

相关问题