Apache SparkアプリケーションをScalaで構築しています。SBTを使用して構築しています。
sbt test
を介してユニットテストを実行するとき、Spark依存関係をクラスパスに含めます(#1と同じですが、SBTから)制約#2に一致させるために、Spark依存関係をprovided
として宣言しています:
libraryDependencies ++= Seq(
"org.Apache.spark" %% "spark-streaming" % sparkVersion % "provided",
...
)
次に、 sbt-Assemblyのドキュメント は、ユニットテストの依存関係を含めるために次の行を追加することを提案しています(制約#3):
run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
そのため、制約#1がいっぱいになりません。つまり、IntelliJでアプリケーションを実行できませんIDEA as Spark依存関係が取得されていません。
Mavenでは、特定のプロファイルを使用してuber JARを構築していました。そのようにして、Spark=依存関係をメインプロファイル(IDEおよびユニットテスト)の通常の依存関係として宣言し、ファットJARパッケージのprovided
として宣言しました。参照 https://github.com/aseigneurin/kafka-sandbox/blob/master/pom.xml
SBTでこれを達成する最良の方法は何ですか?
(自分の質問に別のチャンネルから得た答えを答える...)
IntelliJ IDEAからSparkアプリケーションを実行できるようにするには、src/test/scala
ディレクトリにメインクラスを作成する必要があります(test
、main
ではなく、IntelliJはprovided
依存関係を取得します。
object Launch {
def main(args: Array[String]) {
Main.main(args)
}
}
Matthieu Blanc 指摘してくれてありがとう。
ここでの主なトリックは、メインサブプロジェクトに依存する別のサブプロジェクトを作成し、その提供されたすべてのライブラリをコンパイルスコープに含めることです。これを行うには、build.sbtに次の行を追加します。
lazy val mainRunner = project.in(file("mainRunner")).dependsOn(RootProject(file("."))).settings(
libraryDependencies ++= spark.map(_ % "compile")
)
ここで、プロジェクトをIDEAで更新し、以前の実行構成をわずかに変更して、新しいmainRunnerモジュールのクラスパスを使用するようにします。
私にとって完璧に動作します。
[廃止]新しい回答「IntelliJ構成で新しい「提供された」スコープに依存関係を含める」の回答を参照してください。答え
provided
依存関係を追加してIntelliJ
でタスクをデバッグする最も簡単な方法は次のとおりです。
src/main/scala
Mark Directory as...
> Test Sources Root
これは、IntelliJ
にsrc/main/scala
は、provided
としてタグ付けされたすべての依存関係を実行構成(デバッグ/実行)に追加するテストフォルダーとして。
SBTの更新を行うたびに、IntelliJがフォルダーを通常のソースフォルダーにリセットするため、これらの手順をやり直してください。
プロジェクトをローカルで実行するための別のサブプロジェクトを作成することに基づくソリューションは、 here で説明されています。
基本的に、次のようにbuild.sbt
ファイルを変更する必要があります。
lazy val sparkDependencies = Seq(
"org.Apache.spark" %% "spark-streaming" % sparkVersion
)
libraryDependencies ++= sparkDependencies.map(_ % "provided")
lazy val localRunner = project.in(file("mainRunner")).dependsOn(RootProject(file("."))).settings(
libraryDependencies ++= sparkDependencies.map(_ % "compile")
)
次に、実行構成の下でUse classpath of module: localRunner
を使用して、新しいサブプロジェクトをローカルで実行します。
runningspark job)の場合、「提供された」依存関係の一般的な解決策は機能します: https:/ /stackoverflow.com/a/21803413/1091436
その後、sbt
、Intellij IDEA、またはその他のいずれかからアプリを実行できます。
基本的にはこれに要約されます:
run in Compile := Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run)).evaluated,
runMain in Compile := Defaults.runMainTask(fullClasspath in Compile, runner in(Compile, run)).evaluated
IDEA特定の設定についてSBTを見てはいけません。まず、プログラムがspark-submitで実行されることになっている場合、どのようにIDEA?IDEAでスタンドアロンとして実行し、spark-submitで通常どおり実行していると思います。その場合は、IDEAでsparkライブラリFile | Project Structure | Librariesを使用すると、すべての依存関係がSBTから一覧表示されますが、+(プラス)記号を使用して任意のjar/mavenアーティファクトを追加できます。