2016-07-19 7 views
2

私はこの問題をしばらく解決しようとしていましたが、答えが見つからないようです。私はNiFiレシーバーをインスタンス化Scalaでは、単純なスパークアプリケーションを書いています、そしてそれはSBTで正常にビルドが、私が使用してアプリケーションを実行しようとすると、私は次のエラーが表示火花を提出:NiFi受信機をインスタンス化するSparkアプリケーションを実行すると依存関係エラーが発生する

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/nifi/spark/NiFiReceiver 
    at <app name>.main(main.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731) 
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) 
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) 
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) 
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 
Caused by: java.lang.ClassNotFoundException: org.apache.nifi.spark.NiFiReceiver 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     ... 10 more 

私が試してみましたいくつかのバリエーションが、これは私のbuild.sbtファイルです。私がScalaの同等物を使用するには、2本のnifiラインを変更した場合(つまり、各行の最初のパーセント記号を2に置き換えていることに留意すべきである

name := "<application name here>" 
version := "1.0" 
scalaVersion := "2.10.5" 

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.2" % "provided" 
libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.6.2" % "provided" 
libraryDependencies += "org.apache.nifi" % "nifi-spark-receiver" % "0.7.0" 
libraryDependencies += "org.apache.nifi" % "nifi-site-to-site-client" % "0.7.0" 

%s)を実行すると、実際に次のエラーが表示されます。

[error] (*:update) sbt.ResolveException: unresolved dependency: org.apache.nifi#nifi-spark-receiver_2.10;0.7.0: not found 
[error] unresolved dependency: org.apache.nifi#nifi-site-to-site-client_2.10;0.7.0: not found 

私が前に述べたように、単一のパーセント記号(したがってJava依存性を使用して)でビルドにエラーは発生しませんが、実行時にエラーが発生します。

(削除特定の名前で)自分のアプリケーションの関連部分は次のとおりです。NifiReceiverがインスタンス化された場合、エラーが、ここでの最後の行を参照している

import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.SparkConf 
import java.time 
import java.time._ 
import org.apache.nifi._ 
import java.nio.charset._ 
import org.apache.nifi.spark._ 
import org.apache.nifi.remote.client._ 
import org.apache.spark._ 
import org.apache.nifi.events._ 
import org.apache.spark.streaming._ 
import org.apache.spark.streaming.StreamingContext._ 
import org.apache.nifi.remote._ 
import org.apache.nifi.remote.protocol._ 
import org.apache.spark.streaming.receiver._ 
import org.apache.spark.storage._ 
import java.io._ 
import org.apache.spark.serializer._ 

object <app name> { 
    def main(args: Array[String]) { 

     val nifiUrl = "<nifi url>" 
     val nifiReceiverConfig = new SiteToSiteClient.Builder() 
      .url(nifiUrl) 
      .portName("Data for Spark") 
      .buildConfig() 

     val conf = new SparkConf().setAppName("<app name>") 
     val ssc = new StreamingContext(conf, Seconds(10)) 
     val packetStream = ssc.receiverStream(new NiFiReceiver(nifiReceiverConfig, StorageLevel.MEMORY_ONLY)) 

- 見つけることができないようそのクラス名はどこにでもあります。

私はこれまでに(別々に)以下を含む多くのアプローチを試してきました: 1)nifi-spark-receiverとnifi-site-to-site-clientのjarファイルを見つけてlibディレクトリ私のプロジェクトでは 2)この投稿に続いてhttps://community.hortonworks.com/articles/12708/nifi-feeding-data-to-spark-streaming.html。私はspark-defaults.confのディレクトリにspark-default.conf.templateのコピーを作成し、spark-defaults.confに名前を変更し、そのリンクのステップ1の2行をファイルに追加しました(実際の名前と場所を置き換えます問題のファイルのうちの1つ)。そのページの2つのコード例で使用されていたすべての必要なインポートステートメントがあることを確認しました 3)アプリケーションディレクトリのルートにプロジェクトディレクトリを作成し、アセンブリディレクトリ内にassembly.sbtというファイルを作成しました。その後

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3") 

は、私は、アプリケーションがユーバーjarを作成してもらう代わりに、「SBTパッケージ」の「SBTアセンブリ」を走ったが、これは失敗した:(:https://github.com/sbt/sbt-assemblyをここに参照されるように)私はその後、内部の次の行を追加しました同様build.sbtファイルでScalaの依存関係を持つ「SBTパッケージ」を実行したときと同じエラーで:

[error] (*:update) sbt.ResolveException: unresolved dependency: org.apache.nifi#nifi-spark-receiver_2.10;0.7.0: not found 
[error] unresolved dependency: org.apache.nifi#nifi-site-to-site-client_2.10;0.7.0: not found 

任意のより詳細な情報が必要な場合は私に知らせてください。助けを前にありがとう。

答えて

1

わかりましたので、私はこれを解決するために管理され、ここに興味がある可能性があり、誰のための答えですしました:

答えはユーバー・ジャールートの下に戻って、代わりに「SBTアセンブリ」を使用していました"sbtパッケージ"の中に必要な依存関係のジャーを私のuber-jarに含める。

1)ルートの下に、「プロジェクト」と呼ばれるディレクトリを作成し、そこに(私の元の試みから、ここで追加のリゾルバラインである)以下を含むでassembly.sbtという名前のファイルを配置します。

resolvers += Resolver.url("sbt-plugin-releases-scalasbt", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/")) 

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3") 

2)ビルド中。プロジェクトのルートにSBTファイル、依存関係の参照以下の使用(すなわち特定のバージョンを刺激しない):

libraryDependencies += "org.apache.nifi" % "nifi-spark-receiver" % "0.7.0" 
libraryDependencies += "org.apache.nifi" % "nifi-site-to-site-client" % "0.7.0" 

私も火花コアをマークし、火花ストリーミング「を提供」として、すなわち

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.2" % "provided" 
libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.6.2" % "provided" 

これは別にスパークを供給する必要があることを意味しますが、ウーファージャーをさらに大きくするのを止めます。

3)同じファイルでは、()内の依存関係を引っ張ったときに、これは重要であるマージに対処するために、次のコードを追加します。

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 
    { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case x => MergeStrategy.first 
    } 
} 

4)を、関連するimport文は、あなたのScalaの中に存在していることを確認しますファイル、例えばあなたは、「SBTアセンブリ」を実行すると

import org.apache.nifi._ 
import org.apache.nifi.spark._ 

など

そして、それが正常にビルドする必要があり - 「火花提出」を呼び出すときだけ、このjarファイルを参照する、すなわち

spark-submit --class "<application class name>" --master "<local or url>" "<path to uber-jar from project root directory>" 

を留意すべき次の投稿はこの解決策を見つける上で大きな助けとなったと言っている:java.lang.NoClassDefFoundError: org/apache/spark/streaming/twitter/TwitterUtils$ while running TwitterPopularTags

関連する問題