所以我有一段代码,其索引记录到弹性。此代码与火花和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发生,所以我想火花(1.6)也使用番石榴的旧版本,但我找不到在哪里以及如何解决它。我也试图使一个新的jar掩映弹性搜索2.3.1 + com.google.common和使用它,但也没工作
问题是既elasticsearch和火花使用番石榴,但不同的版本:ES采用18.0和火花采用14.0。
所以,在你的pom.xml,你可以尝试使用火花排除旧版本:
<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
我正面临完全一样的问题提交我的工作就是激发群集时。 @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>
使用火花提交选项:
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 \
...
在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
。
我有同样的确切问题,我能够加入“番石榴16.0.1.jar”到“--addJars”属性,并通过设置sparkConf.set(“spark.driver.extraClassPath”来解决这个问题,“番石榴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);