spark elasticsearch:在类路径中检测到多个 ES-Hadoop 版本
spark elasticsearch: Multiple ES-Hadoop versions detected in the classpath
我是 spark 新手。我正在尝试 运行 一个将数据加载到 elasticsearch 的 spark 作业。我用我的代码构建了一个 fat jar 并在 spark-submit
.
期间使用了它
spark-submit \
--class CLASS_NAME \
--master yarn \
--deploy-mode cluster \
--num-executors 20 \
--executor-cores 5 \
--executor-memory 32G \
--jars EXTERNAL_JAR_FILES \
PATH_TO_FAT_JAR
elasticsearch-hadoop
依赖的maven依赖为:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop</artifactId>
<version>5.6.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
当我没有在 EXTERNAL_JAR_FILES
列表中包含 elasticsearch-hadoop
jar 文件时,我会收到此错误。
java.lang.ExceptionInInitializerError
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.spark.rdd.CompatUtils
at java.net.URLClassLoader.run(URLClassLoader.java:372)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:344)
at org.elasticsearch.hadoop.util.ObjectUtils.loadClass(ObjectUtils.java:73)
... 26 more
如果我将其包含在 EXTERNAL_JAR_FILES
列表中,则会出现此错误。
java.lang.Error: Multiple ES-Hadoop versions detected in the classpath; please use only one
jar:file:PATH_TO_CONTAINER/__app__.jar
jar:file:PATH_TO_CONTAINER/elasticsearch-hadoop-5.6.10.jar
at org.elasticsearch.hadoop.util.Version.<clinit>(Version.java:73)
at org.elasticsearch.hadoop.rest.RestService.createWriter(RestService.java:572)
at org.elasticsearch.spark.rdd.EsRDDWriter.write(EsRDDWriter.scala:58)
at org.elasticsearch.spark.sql.EsSparkSQL$$anonfun$saveToEs.apply(EsSparkSQL.scala:97)
at org.elasticsearch.spark.sql.EsSparkSQL$$anonfun$saveToEs.apply(EsSparkSQL.scala:97)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:108)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
有什么需要克服的吗?
通过在我构建的 fat jar 中不包含 elasticserach-hadoop
jar 来解决问题。我在依赖项中提到 scope
参数到 provided
。
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop</artifactId>
<version>5.6.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
我解决了这个问题
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop</artifactId>
<version>7.4.2</version>
<scope>provided</scope>
</dependency>
请注意 [<scope>provided</scope>]
然后你可以使用命令:
bin/spark-submit \
--maste local[*] \
--class xxxxx \
--jars https://repo1.maven.org/maven2/org/elasticsearch/elasticsearch-hadoop/7.4.2/elasticsearch-hadoop-7.4.2.jar \
/your/path/xxxx.jar
我遇到这个问题是因为我将项目的构建从 SBT 更改为 POM。在探索。我看到类路径中有两个 jar,一个来自 .ivy2 文件夹,另一个来自 .mvn
我从 .ivy2 中删除了那个,问题就消失了。希望对大家有帮助。
当我有一个依赖项使用不同版本的 elasticsearch-spark 而不是我的 pom 文件中明确说明的 elasticsearch-spark 依赖项时,这发生在我身上。例如,我添加了 elasticsearch-spark-30_2.12 依赖项,但我有一个单独的依赖项使用了 elasticsearch-spark-13_2.10 所以我只是在该单独的依赖项中添加了一个排除项我的 pom 文件是这样的,
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-spark-13_2.10</artifactId>
</exclusion>
</exclusions>
我是 spark 新手。我正在尝试 运行 一个将数据加载到 elasticsearch 的 spark 作业。我用我的代码构建了一个 fat jar 并在 spark-submit
.
spark-submit \
--class CLASS_NAME \
--master yarn \
--deploy-mode cluster \
--num-executors 20 \
--executor-cores 5 \
--executor-memory 32G \
--jars EXTERNAL_JAR_FILES \
PATH_TO_FAT_JAR
elasticsearch-hadoop
依赖的maven依赖为:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop</artifactId>
<version>5.6.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
当我没有在 EXTERNAL_JAR_FILES
列表中包含 elasticsearch-hadoop
jar 文件时,我会收到此错误。
java.lang.ExceptionInInitializerError
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.spark.rdd.CompatUtils
at java.net.URLClassLoader.run(URLClassLoader.java:372)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:344)
at org.elasticsearch.hadoop.util.ObjectUtils.loadClass(ObjectUtils.java:73)
... 26 more
如果我将其包含在 EXTERNAL_JAR_FILES
列表中,则会出现此错误。
java.lang.Error: Multiple ES-Hadoop versions detected in the classpath; please use only one
jar:file:PATH_TO_CONTAINER/__app__.jar
jar:file:PATH_TO_CONTAINER/elasticsearch-hadoop-5.6.10.jar
at org.elasticsearch.hadoop.util.Version.<clinit>(Version.java:73)
at org.elasticsearch.hadoop.rest.RestService.createWriter(RestService.java:572)
at org.elasticsearch.spark.rdd.EsRDDWriter.write(EsRDDWriter.scala:58)
at org.elasticsearch.spark.sql.EsSparkSQL$$anonfun$saveToEs.apply(EsSparkSQL.scala:97)
at org.elasticsearch.spark.sql.EsSparkSQL$$anonfun$saveToEs.apply(EsSparkSQL.scala:97)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:108)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
有什么需要克服的吗?
通过在我构建的 fat jar 中不包含 elasticserach-hadoop
jar 来解决问题。我在依赖项中提到 scope
参数到 provided
。
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop</artifactId>
<version>5.6.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
我解决了这个问题
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop</artifactId>
<version>7.4.2</version>
<scope>provided</scope>
</dependency>
请注意 [<scope>provided</scope>]
然后你可以使用命令:
bin/spark-submit \
--maste local[*] \
--class xxxxx \
--jars https://repo1.maven.org/maven2/org/elasticsearch/elasticsearch-hadoop/7.4.2/elasticsearch-hadoop-7.4.2.jar \
/your/path/xxxx.jar
我遇到这个问题是因为我将项目的构建从 SBT 更改为 POM。在探索。我看到类路径中有两个 jar,一个来自 .ivy2 文件夹,另一个来自 .mvn 我从 .ivy2 中删除了那个,问题就消失了。希望对大家有帮助。
当我有一个依赖项使用不同版本的 elasticsearch-spark 而不是我的 pom 文件中明确说明的 elasticsearch-spark 依赖项时,这发生在我身上。例如,我添加了 elasticsearch-spark-30_2.12 依赖项,但我有一个单独的依赖项使用了 elasticsearch-spark-13_2.10 所以我只是在该单独的依赖项中添加了一个排除项我的 pom 文件是这样的,
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-spark-13_2.10</artifactId>
</exclusion>
</exclusions>