Mi primera aplicacion Apache Spark en Scala con Maven en Intelligent Idea

Este post tiene como objetivo ayudar al lector a crear una simple aplicación Spark. Para ello, es necesario configurar bien una serie de herramientas informáticas que faciliten el desarrollo, las pruebas y el empaquetado.

Prerequisitos

En esta sección se van a definir las herramientas que se necesitan para iniciar el desarrollo. Para comenzar es necesario tener instalado en tu ordenador el JDK de Java, en este caso se usa la versión 1.8 que puedes descargar aquí .

Nota: Si dispones de una maquina en la que esté instalada Apache Spark para probar la aplicación, necesitas usas la misma versión de Java que tenga esa maquina instalada.

Para la gestión del código proyecto y el empaquetado se usará Apache Maven v.3. Puedes conseguir más información aquí

El lenguaje de programación que se ha usado es Scala v2.12. Puedes conseguir más información aquí

Finalmente para el desarrollo y la ejecución de la aplicación necesitas Apache Spark. Puedes conseguir más información aquí

Todas estas herramientas vienen integradas en la herramienta el entorno de desarrollo (IDE). Para este caso he decidido usar IDEA Intelligent su versión “free source”. Puedes más información aquí

Mi primera aplicación

La aplicación que vamos a generar es un simple “HelloWorld“.

Para empezar se abre el IDE y se crea un nuevo proyecto. Para ello, se pulsa “Create New Project” y se inicia un asistente. Como para la gestión del proyecto se usa Maven; Maven define una serie de estructuras pre-configuradas para crear proyectos, que facilita la integración de las dependencias y versiones de las mismas. Estas estructuras se llaman arquetipos “archetype”. Para habilitar la opción “Create from archetype” se debe marcar el check y seleccionar el arquetipo llamado “scala-archetype-simple” de net.alchim31.maven version 1.7

Sino lo encuentras el archetype que se usamos usa la herramienta de búsqueda, o añadelo mediante Add Archetype, completando los siguientes campos como la imagen siguiente.

Añadir Arquetipo

Añadir Arquetipo

Pulsa “Next” y dale un nombre: por ejemplo, en el groupId: com.fer.cam y en ArtifactId miprimeraAppScala. Pulsa Next y elige la versión de maven para la gestión del proyecto, en mi caso es la 3.3.9. Finalmente pulsa “Next” y “Finish”.

Habilita el importado automático

auto import

Comprueba que el pom.xml creado tiene las siguientes propiedades.

<properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <encoding>UTF-8</encoding>
  <scala.version>2.12.6</scala.version>
  <scala.compat.version>2.12</scala.compat.version>
  <spec2.version>4.2.0</spec2.version>
</properties>

Ahora el proyecto ya está listo para desarrollar, pero un desarrollo más complejo que nuestro “HelloWorld” queda fuera de este post.

No obstante, se necesita generar el fichero que contenga la aplicación. Este fichero se genera automáticamente tras la ejecución con éxito de un proyecto Maven. Veamos como se crea una ejecución maven y su configuración:

Acceder pulsando en la flecha blanca que apunta hacia abajo, y aparece el menú que vemos en la imagen. Pulsa “Edit Configrations…”

A continuación pulsa sobre Maven y “+” y rellena los campos como se muestran en la siguiente imagen:

  1. Name: miprimeraAppScala
  2. Working directoy: /workspacePath/IdeaProjects/miprimeraAppScala
  3. Command line: clean install
  4. Si quieres deshabilitar los Test, en la pestaña Runner selecciona “Skip Test

Finalmente pulsa “Apply” y “OK“.

Ahora se inicia la ejecución del proyecto eligiendo la opción miprimeraAppScala(install) y pulsando el triangulo verde). Si el resultado es “BUILD SUCCESS” se crea una carpeta llamada target donde se encuentra el fichero con la aplicación llamado “miprimeraAppScala-1.0-SNAPSHOT.jar

Nota: Si se quiere que este jar sea ejecutable se debe añadir los siguientes plugins al fichero pom.xml

El primer plugin copiará las dependencias del proyecto dentro del jar y el segundo plugin identifica en que objeto está el método main de la aplicación(donde comienza la aplicación); en este caso esta en el paquete com.fer.cam y se llama App

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>${project.build.directory}/lib</outputDirectory>
        <overWriteReleases>false</overWriteReleases>
        <overWriteSnapshots>false</overWriteSnapshots>
        <overWriteIfNewer>true</overWriteIfNewer>
      </configuration>
    </execution>
  </executions>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <addClasspath>true</addClasspath>
        <classpathPrefix>lib/</classpathPrefix>
        <mainClass>com.fer.cam.App</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

Una vez configurado el fichero pom.xml, volvemos a ejecutar el proyecto maven y tras el “BUILD SUCCESS”, tendremos el fichero ejecutable en el directorio target.

Ahora se añade al pom.xml las propiedades y las dependencias para acoplar Apache Spark 2.X al proyecto Scala.

<spark.version>2.1.1</spark.version>
<!-- Depencencias de Apache Spark 2.X-->
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-core_2.11</artifactId>
  <version>${spark.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-mllib_2.11</artifactId>
  <version>${spark.version}</version>   
</dependency>
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-sql_2.11</artifactId>
  <version>${spark.version}</version>
</dependency>

Las dependencias para ejecutar los Test de la aplicación

<!--Dependencias para Test -->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.scalatest</groupId>
  <artifactId>scalatest_${scala.compat.version}</artifactId>
  <version>3.0.5</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.specs2</groupId>
  <artifactId>specs2-core_${scala.compat.version}</artifactId>
  <version>${spec2.version}</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.specs2</groupId>
  <artifactId>specs2-junit_${scala.compat.version}</artifactId>
  <version>${spec2.version}</version>
  <scope>test</scope>
</dependency>

Ahora se vuelve a iniciar la ejecución del proyecto eligiendo la opción miprimeraAppScala(install) y se descargan las nuevas dependencias. Finalmente debes conseguir un “BUILD SUCCESS”.

Ahora accedemos mediante el navegador de paquetes al fichero com.fer.cam App y ejecuta la aplicación pulsando sobre el objeto App con el boton derecho y clickeamos ‘Run App‘ .

Fichero App donde definimos un SparkContext

Comienza la ejecución

La ejecucion debe acabar con Process finished with exit code 0

 

 

 

Referencia: Create a Spark Application with Scala using Maven on IntelliJ

 

Otros artículos que pueden ser de interés: