2

csv から spark にデータをロードして Elasticsearch に保存することをテストしていますが、spark を使用して Elasticsearch に RDD コレクションを保存する際に問題が発生しています。ジョブを送信すると、次のエラーが発生します。

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 は、ドライバー ノードとは別のノードで実行されます。Spark は、変換に応じてさまざまな段階で rdd グラフを計算します。これらのステージには、エグゼキューターで実行されるタスクがあります。そのため、ライブラリ メソッドを使用して rdd を計算する場合は、依存する jar をエグゼキューターとドライバーの両方に渡す必要があります。

--jarsspark-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 に答える