web-dev-qa-db-ja.com

SBT、Sparkおよび「提供された」依存関係を効率的に使用するには?

Apache SparkアプリケーションをScalaで構築しています。SBTを使用して構築しています。

  1. intelliJ IDEAで開発しているとき、Spark依存関係をクラスパスに含めたい(メインクラスで通常のアプリケーションを起動している)
  2. (sbt-Assemblyのおかげで)アプリケーションプラグインをパッケージ化するとき、notをSpark依存関係にしたいファットJARに含まれています
  3. 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でこれを達成する最良の方法は何ですか?

25

(自分の質問に別のチャンネルから得た答えを答える...)

IntelliJ IDEAからSparkアプリケーションを実行できるようにするには、src/test/scalaディレクトリにメインクラスを作成する必要があります(testmainではなく、IntelliJはprovided依存関係を取得します。

object Launch {
  def main(args: Array[String]) {
    Main.main(args)
  }
}

Matthieu Blanc 指摘してくれてありがとう。

17

IntelliJ構成で新しい「提供されたスコープを持つ依存関係を含める」を使用します。

IntelliJ config with Provided scope checkbox

12
Martin Tapp

IntellJを機能させる必要があります。

ここでの主なトリックは、メインサブプロジェクトに依存する別のサブプロジェクトを作成し、その提供されたすべてのライブラリをコンパイルスコープに含めることです。これを行うには、build.sbtに次の行を追加します。

lazy val mainRunner = project.in(file("mainRunner")).dependsOn(RootProject(file("."))).settings(
  libraryDependencies ++= spark.map(_ % "compile")
)

ここで、プロジェクトをIDEAで更新し、以前の実行構成をわずかに変更して、新しいmainRunnerモジュールのクラスパスを使用するようにします。

intellj

私にとって完璧に動作します。

ソース: https://github.com/JetBrains/intellij-scala/wiki/%5BSBT%5D-How-to-use-provided-libraries-in-run-configurations

3
Atais

[廃止]新しい回答「IntelliJ構成で新しい「提供された」スコープに依存関係を含める」の回答を参照してください。答え

provided依存関係を追加してIntelliJでタスクをデバッグする最も簡単な方法は次のとおりです。

  • 右クリック src/main/scala
  • 選択する Mark Directory as...> Test Sources Root

これは、IntelliJsrc/main/scalaは、providedとしてタグ付けされたすべての依存関係を実行構成(デバッグ/実行)に追加するテストフォルダーとして。

SBTの更新を行うたびに、IntelliJがフォルダーを通常のソースフォルダーにリセットするため、これらの手順をやり直してください。

2
Martin Tapp

プロジェクトをローカルで実行するための別のサブプロジェクトを作成することに基づくソリューションは、 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を使用して、新しいサブプロジェクトをローカルで実行します。

1
bertslike

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
0
VasiliNovikov

IDEA特定の設定についてSBTを見てはいけません。まず、プログラムがspark-submitで実行されることになっている場合、どのようにIDEA?IDEAでスタンドアロンとして実行し、spark-submitで通常どおり実行していると思います。その場合は、IDEAでsparkライブラリFile | Project Structure | Librariesを使用すると、すべての依存関係がSBTから一覧表示されますが、+(プラス)記号を使用して任意のjar/mavenアーティファクトを追加できます。

0
Roberto Congiu