2016-11-02 28 views
8

に取り組んでいるにもかかわらず、私は私が得るとき、私はIntelliJの2016年2月5日からそれを構築することができていますが、私build.sbtNoClassDefFoundErrorが:SparkSession - ビルドは

name := "newproject" 
version := "1.0" 
scalaVersion := "2.11.8" 

javacOptions ++= Seq("-source", "1.8", "-target", "1.8") 
scalacOptions += "-deprecation" 

libraryDependencies ++= Seq(
    "org.apache.spark" % "spark-core_2.11" % "2.0.0" % "provided", 
    "org.apache.spark" % "spark-sql_2.11" % "2.0.0" % "provided", 
    "org.apache.spark" % "spark-mllib_2.11" % "2.0.0" % "provided", 
    "org.jpmml" % "jpmml-sparkml" % "1.1.1", 
    "org.apache.maven.plugins" % "maven-shade-plugin" % "2.4.3", 
    "org.scalatest" %% "scalatest" % "3.0.0" 
) 

を新しいプロジェクトにhttps://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/ml/RandomForestClassifierExample.scalaをコピーして、セットアップエラー

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$ 
    at org.apache.spark.examples.ml.RandomForestClassifierExample$.main(RandomForestClassifierExample.scala:32) 
    at org.apache.spark.examples.ml.RandomForestClassifierExample.main(RandomForestClassifierExample.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession$ 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 7 more 

私もSparkSessionをクリックしてソースコードにアクセスできます。何が問題ですか?

+1

あなたのアプリを実行するには 'spark-submit'を使用していますか? – maasg

+0

英語を使う必要がありますね:-) – maasg

+0

@maasg:Dang - 私はとても疲れています。今日は本当に厳しい仕事の日でした。私は言った:いいえ私はしていない。私はIntelliJを使いました。 SBTの「提供」と矛盾していると思います。 – Make42

答えて

10

あなたの依存関係についてprovidedと言うと、ビルドはその依存関係に対してコンパイルされますが、実行時にクラスパスに追加されることはありません(すでにそこにあると仮定されます)。

これは、​​のSparkジョブをビルドするときの正しい設定です(依存関係を提供するSparkコンテナ内で実行され、2回目の組み込みを含むと問題が発生するため)。

ただし、ローカルで実行する場合は、その依存関係が必要です。したがって、このprovidedを持たないようにビルドを変更するか(ジョブをサブミットするためにビルドするときに調整する必要があります)、IDEにランタイムクラスパスを設定して、すでにそのjarファイルがあるようにします。

+0

ありがとうございます。 Sparkの[IntelliJ]の実行時クラスパスに、既にそのjarファイルがあるようにするにはどうすればよいですか? http://stackoverflow.com/a/24843914/4533188 - 「spark-2.0.1-bin-hadoop2.7/jars」というフォルダを追加しますか?それは私が試したものですが、うまくいきません。もう一度 'NoClassDefFoundError'を取得します。 – Make42

2

私の場合は、デフォルトでインストールされたSpark 1.6.1とParak 2.0.0を小包としてインストールしたローカルCloudera CDH 5.9.0クラスタを使用していました。したがって、​​は、スパーク1.6.1を使用し、spark2-submitは、スパーク2.0.0を使用していました。 SparkSessionは1.6.1に存在しなかったので、エラーがスローされました。正しいspark2-submitコマンドを使用して問題を解決しました。

0

spark-submitを使用してsparkジョブを送信する前に、SPARK_HOME変数を設定しても同じ問題が発生し、修正されました。

0

私はここに、何か他のものを探しているsbt gitterチャネルのリンクに沿って上陸しました。私はこれのための解決策を持っています。 Thiloが問題を正しく説明しています。 sbtには、スパークライブラリが提供されているクラスタで実行するときにターゲット環境に適した「提供済み」と表示されますが、IntelliJ内でローカルに実行する場合は、実行時にこれらの外部ライブラリをIntelliJに「提供する」必要があります。それを行うための方法は、あなたがのIntelliJを再起動したときに、このプロセスを繰り返す必要がある場合がありますことを

Right click on your project -> 
Open Module settings -> 
Select Libraries on LHS menu -> 
Click + sign -> 
choose 'From Maven' -> 
Type or search for maven coordinates. You can search by typing the lib name and hit the tab key. This will show a dropdown of all matches and you can choose the correct version for your library -> 
Click OK 

注だろう。私はこれがOS X El Captain上のIntelliJ IDEA 2016.3.6のケースであることを発見しました。

関連する問題