在 Spark 作业上使用 ElasticSearch 时番石榴 jar 冲突
guava jar conflict when using ElasticSearch on Spark job
所以我有一段代码可以将记录索引到弹性中。此代码是 运行 spark 和 hadoop。
我刚刚将 Elasticsearch 升级到 2.3.1。
当我 运行 在本地机器上运行我的代码时,它运行良好。
当我尝试 运行 它与 spark 提交作业时,我得到
java.lang.NoSuchMethodError:
com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
搜索 google 后,我意识到问题出在番石榴上,所以在我的 pom.xml 中,我只是把
com.google.guava
番石榴
19.0
在dependencyManagement.
下
但错误仍然发生,所以我猜 spark (1.6) 也在使用旧版本的 guava,但我找不到在哪里以及如何解决它...
我还尝试制作一个新的 jar 来遮蔽 elastic-search 2.3.1 + com.google.common 并使用它,但也没有用
问题是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>
或使用该博客 post 中描述的方法:https://www.elastic.co/blog/to-shade-or-not-to-shade
我遇到了完全相同的问题,我可以通过将 "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);
使用 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 \
...
我在将作业提交到 spark 集群时遇到了完全相同的问题。 @alpert 第二个解决方案对我有用。我使用 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>
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
.
所以我有一段代码可以将记录索引到弹性中。此代码是 运行 spark 和 hadoop。 我刚刚将 Elasticsearch 升级到 2.3.1。 当我 运行 在本地机器上运行我的代码时,它运行良好。 当我尝试 运行 它与 spark 提交作业时,我得到
java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;
搜索 google 后,我意识到问题出在番石榴上,所以在我的 pom.xml 中,我只是把
com.google.guava 番石榴 19.0 在dependencyManagement.
下但错误仍然发生,所以我猜 spark (1.6) 也在使用旧版本的 guava,但我找不到在哪里以及如何解决它... 我还尝试制作一个新的 jar 来遮蔽 elastic-search 2.3.1 + com.google.common 并使用它,但也没有用
问题是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>
或使用该博客 post 中描述的方法:https://www.elastic.co/blog/to-shade-or-not-to-shade
我遇到了完全相同的问题,我可以通过将 "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);
使用 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 \
...
我在将作业提交到 spark 集群时遇到了完全相同的问题。 @alpert 第二个解决方案对我有用。我使用 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>
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
.