2

我正在测试从 csv 加载数据到 spark,然后将其保存在 Elasticsearch 中,但是我在使用 spark 将我的 RDD 集合保存在 Elasticsearch 中时遇到了一些麻烦。提交作业时会引发此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/elasticsearch/spark/rdd/api/java/JavaEsSpark

但是我的依赖项应该是正确的,因为我使用 Maven 编译...

我的 pom.xml 在这里: http: //pastebin.com/b71KL903

当我到达这一行时,会引发错误:

JavaEsSpark.saveToEs(javaRDD, "index/logements");

我的其余代码在这里: http: //pastebin.com/8yuJB68A

我已经搜索过这个问题,但没有找到任何东西: https ://discuss.elastic.co/t/problem-between-spark-and-elasticsearch/51942 。

https://github.com/elastic/elasticsearch-hadoop/issues/713

https://github.com/elastic/elasticsearch-hadoop/issues/585

我刚刚了解到:出现“ClassNotFoundException”是因为 Spark 将在发生异常时立即关闭其作业类加载器,因此任何其他需要加载的类都将失败,从而导致隐藏初始错误。

但我不知道如何进行。我使用详细模式提交了我的工作,但没有看到其他任何内容: http: //pastebin.com/j6zmyjFr

感谢您的进一步帮助:)

4

1 回答 1

3

Spark 有 executor 和 driver 进程。Executor 运行在与驱动节点不同的节点上。Spark 根据转换在不同阶段计算 rdd 图。这些阶段的任务在执行者上执行。因此,如果您使用库方法来计算 rdd,则需要将相关 jar 传递给执行程序和驱动程序。

--jars您应该在 spark-submit的选项中传递依赖的 jar

    spark-submit --jars $JARS \
     --driver-class-path $JARS_COLON_SEP \
     --class $CLASS_NAME $APP_JAR  

在你的情况下,它会是

    spark-submit --jars elasticsearch-hadoop-2.3.2.jar \
    --master local[4]\
     --driver-class-path elasticsearch-hadoop-2.3.2.jar \
     --class "SimpleApp" target/simple-project-1.0.jar  
于 2016-06-30T09:35:30.910 回答