在Spark作业上使用ElasticSearch时,guava jar冲突

时间:2016-05-09 15:51:59

标签: hadoop elasticsearch apache-spark yarn

所以我有一段代码将记录索引为弹性。此代码使用spark和hadoop运行。 我刚刚将Elasticsearch升级到2.3.1。 当我在本地计算机上运行我的代码时,它运行良好。 当我试图用火花提交工作运行它时,我正在

  

java.lang.NoSuchMethodError:   com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava / util的/并行/执行器;

搜索谷歌后,我意识到问题出在番石榴上,所以在我的pom.xml中我只是把

com.google.guava 番石榴 19.0 在dependencyManagement下。

但是错误stil发生了,所以我猜spark(1.6)也使用旧版本的番石榴,但我无法找到解决问题的地方和方法...... 我还尝试制作一个新的jar,它使用弹性搜索2.3.1 + com.google.common并使用它,但也没有工作

5 个答案:

答案 0 :(得分:1)

问题是elasticsearch和spark都使用番石榴但是版本不同: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

答案 1 :(得分:1)

将工作提交到Spark Cluster时,我面临着完全相同的问题。 @alpert第二个解决方案为我工作。我使用弹性搜索2.4.0客户端作为依存关系,所以我找到了2.4.0的替代阴影罐:

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

答案 2 :(得分:0)

使用spark-submit选项:

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  \
...

答案 3 :(得分:0)

How to resolve the conflict between 11.0.2 and 16.0 of guava when using yarn, spark and spark-cassandra-connector?中提出的解决方案运行良好。您只需要将spark.driver.userClassPathFirst的值设置为true

答案 4 :(得分:-2)

我有同样的问题,我可以通过将“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);