intellij-idea apache-spark sbt sbt-assembly

intellij idea - ¿Cómo trabajar de manera eficiente con SBT, Spark y las dependencias "proporcionadas"?



intellij-idea apache-spark (7)

Necesitas hacer que el IntellJ funcione.

El truco principal aquí es crear otro subproyecto que dependerá del subproyecto principal y tendrá todas las bibliotecas proporcionadas en el ámbito de compilación. Para hacer esto agrego las siguientes líneas a build.sbt:

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

Ahora actualizo el proyecto en IDEA y cambio ligeramente la configuración de ejecución anterior para que use el nuevo classpath del módulo mainRunner:

Funciona perfectamente para mí.

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

Estoy creando una aplicación Apache Spark en Scala y estoy usando SBT para construirla. Aquí está la cosa:

  1. cuando estoy desarrollando bajo IntelliJ IDEA, quiero que se incluyan las dependencias de Spark en el classpath (estoy lanzando una aplicación regular con una clase principal)
  2. al empaquetar la aplicación (gracias al complemento sbt-assembly), no quiero que se incluyan las dependencias de Spark en mi JAR gordo
  3. cuando ejecuto pruebas unitarias a través de la sbt test , quiero que se incluyan las dependencias de Spark en el classpath (igual que en el # 1 pero desde el SBT)

Para coincidir con la restricción # 2, estoy declarando dependencias de Spark como se provided :

libraryDependencies ++= Seq( "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided", ... )

Luego, la documentación de sbt-assembly sugiere agregar la siguiente línea para incluir las dependencias para las pruebas unitarias (restricción # 3):

run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))

Eso me deja con la restricción # 1 que no se llena por completo, es decir, no puedo ejecutar la aplicación en IntelliJ IDEA ya que las dependencias de Spark no se detectan.

Con Maven, estaba usando un perfil específico para construir el JAR de uber. De esa manera, estaba declarando las dependencias de Spark como dependencias regulares para el perfil principal (IDE y pruebas de unidad) mientras las declaraba como provided para el empaquetado JAR grueso. Consulte https://github.com/aseigneurin/kafka-sandbox/blob/master/pom.xml

¿Cuál es la mejor manera de lograr esto con SBT?


¿Por qué no omitir sbt y agregar manualmente spark-core y spark-streaming como bibliotecas a sus dependencias de módulo?

  • Abra el cuadro de diálogo Estructura del proyecto (por ejemplo, ⌘;).
  • En el panel izquierdo del cuadro de diálogo, seleccione Módulos.
  • En el panel de la derecha, seleccione el módulo de interés.
  • En la parte derecha del cuadro de diálogo, en la página Módulo, seleccione la pestaña Dependencias.
  • En la pestaña Dependencias, haga clic en agregar y seleccione Biblioteca.
  • En el cuadro de diálogo Elegir bibliotecas, seleccione nueva biblioteca, desde maven
  • Encuentra chispa de núcleo. Ex org.apache.spark:spark-core_2.10:1.6.1
  • Lucro

https://www.jetbrains.com/help/idea/2016.1/configuring-module-dependencies-and-libraries.html?origin=old_help#add_existing_lib


(Respondiendo a mi propia pregunta con una respuesta que recibí de otro canal ...)

Para poder ejecutar la aplicación Spark desde IntelliJ IDEA, simplemente tiene que crear una clase principal en el directorio src/test/scala ( test , no main ). IntelliJ recogerá las dependencias provided .

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

Gracias Matthieu Blanc por señalarlo.


No debería estar mirando SBT para un ajuste específico de IDEA. En primer lugar, si se supone que el programa se ejecuta con spark-submit, ¿cómo lo ejecuta en IDEA? Supongo que estarías ejecutando de forma independiente en IDEA, mientras lo ejecutas a través de spark-submit normalmente. Si ese es el caso, agregue manualmente las bibliotecas de chispas en IDEA, usando Archivo | Estructura del proyecto | Bibliotecas. Verá todas las dependencias listadas de SBT, pero puede agregar artefactos de jarrones / maven arbitrarios usando el signo + (más). Eso debería hacer el truco.


Una solución basada en la creación de otro subproyecto para ejecutar el proyecto localmente se describe https://github.com/JetBrains/intellij-scala/wiki/%5BSBT%5D-How-to-use-provided-libraries-in-run-configurations .

Básicamente, necesitarías build.sbt archivo build.sbt con lo siguiente:

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") )

Y luego ejecute el nuevo subproyecto localmente con Use classpath of module: localRunner en la configuración de ejecución.


Utilice el nuevo ''Incluir dependencias con alcance "Proporcionado" en una configuración de IntelliJ.


[Obsoleto] Consulte la nueva respuesta "Use las nuevas ''Incluir dependencias con el alcance" Proporcionado "en una configuración de IntelliJ". responder.

La forma más fácil de agregar las dependencias provided para depurar una tarea con IntelliJ es:

  • Haga clic derecho en src/main/scala
  • Seleccione Mark Directory as... > Test Sources Root

Esto le dice a IntelliJ que trate a src/main/scala como una carpeta de prueba para la cual agrega todas las dependencias etiquetadas como se provided a cualquier configuración de ejecución (depuración / ejecución).

Cada vez que realice una actualización de SBT, vuelva a realizar estos pasos ya que IntelliJ restablecerá la carpeta a una carpeta de origen normal.