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

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

所以我有一段代码,可以将记录索引到弹性体中。这段代码是用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:

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

tpgth1q72#

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

vecaoik1

vecaoik13#

使用spark提交选项:

  1. spark-submit --jars path_to/guava-18.0.jar,.. \
  2. --conf spark.driver.extraClassPath=guava-18.0.jar \
  3. --conf spark.executor.extraClassPath=guava-18.0.jar \
  4. ...
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。

  1. SparkConf sparkConf = new SparkConf().setAppName("YarnResource").setMaster("yarn-cluster").set("spark.driver.extraClassPath", "guava-16.0.1.jar");
  2. List<String> argList = new ArrayList<>();
  3. int argIndex = 0;
  4. argList.add(argIndex++, "--addJars");
  5. argList.add(argIndex++, "/home/myuser/myapp/lib/guava-16.0.1.jar");
  6. String[] sparkArgArray = argList.toArray(new String[argList.size()]);
  7. ClientArguments cArgs = new ClientArguments(sparkArgArray, sparkConf);
  8. // create an instance of yarn Client client
  9. Client client = new Client(cArgs, hadoopConfig, sparkConf);
0s7z1bwu

0s7z1bwu5#

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

  1. <dependency>
  2. <groupId>org.apache.spark</groupId>
  3. <artifactId>spark-core</artifactId>
  4. <version>1.6.0</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>com.google.guava</groupId>
  8. <artifactId>guava</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

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

相关问题