Una introducción a Apache Spark con Java

Apache Spark es un motor de procesamiento de datos distribuidos en memoria que se utiliza para el procesamiento y análisis de grandes conjuntos de datos. Spark presenta una interfaz simple...

¿Qué es Apache Spark?

chispa apache es un motor de procesamiento de datos distribuidos en memoria que se utiliza para el procesamiento y análisis de grandes conjuntos de datos. Spark presenta una interfaz simple para que el usuario realice computación distribuida en todos los clústeres.

Spark no tiene sus propios sistemas de archivos, por lo que tiene que depender de los sistemas de almacenamiento para el procesamiento de datos. Puede ejecutarse en HDFS o sistemas de archivos basados ​​en la nube como Amazonas S3 y [Azur BLOB](https://azure.microsoft.com/en-us/services/ almacenamiento/blobs/).

Además de los sistemas de archivos basados ​​en la nube, también puede ejecutarse con bases de datos NoSQL como casandra y MongoDB.

Los trabajos de Spark se pueden escribir en Java, Scala, Python, R y SQL. Proporciona bibliotecas listas para usar para Machine Learning, Graph Processing, Streaming y SQL como procesamiento de datos. Entraremos en detalles sobre cada una de estas bibliotecas más adelante en el artículo.

El motor fue desarrollado en la Universidad de California, AMPLab de Berkeley y fue donado a Apache Software Foundation en 2013.

Necesidad de Spark

La forma tradicional de procesar datos en Hadoop es usando su Marco MapReduce . MapReduce implica mucho uso del disco y, como tal, el procesamiento es más lento. A medida que el análisis de datos se generalizó, los creadores sintieron la necesidad de acelerar el procesamiento al reducir la utilización del disco durante la ejecución de los trabajos.

Apache Spark soluciona este problema realizando el cálculo en la memoria principal (RAM) de los nodos trabajadores y no almacena los resultados intermedios del cálculo en el disco.

En segundo lugar, en realidad no carga los datos hasta que se requieren para el cálculo. Convierte el conjunto dado de comandos en un Gráfico acíclico dirigido (TROZO DE CUERO) y luego lo ejecuta. Esto evita la necesidad de leer datos del disco y volver a escribir la salida de cada paso, como es el caso con Hadoop MapReduce. Como resultado, Spark afirma procesar datos 100X más rápido que un trabajo correspondiente usando MapReduce para trabajos de cómputo en memoria.

Arquitectura de chispa {#arquitectura de chispa}

Spark_Architecture
[Crédito: https://spark.apache.org/]{.pequeño}

Spark Core utiliza una arquitectura maestro-esclavo. El programa Driver se ejecuta en el nodo maestro y distribuye las tareas a un Ejecutor que se ejecuta en varios nodos esclavos. El Ejecutor se ejecuta en sus propias JVM separadas, que realizan las tareas que se les asignan en varios subprocesos.

Cada Ejecutor también tiene un caché asociado. Los cachés pueden estar en la memoria y también pueden escribirse en el disco en el Nodo trabajador. Los Ejecutores ejecutan las tareas y envían el resultado al Conductor.

El controlador se comunica con los nodos en los clústeres mediante un Administrador de clústeres como el administrador de clústeres integrado, mesos, [HILO](https://yarnpkg.com/en /), etc. Los programas por lotes que escribimos se ejecutan en el nodo del controlador.

Trabajo de Spark simple usando Java

Hemos discutido mucho sobre Spark y su arquitectura, así que ahora echemos un vistazo a un trabajo de Spark simple que cuenta la suma de números separados por espacios de un archivo de texto dado:

1
2
3
4
32 23 45 67 2 5 7 9
12 45 68 73 83 24 1
12 27 51 34 22 14 31
...

Comenzaremos importando las dependencias para Spark Core que contiene el motor de procesamiento de Spark. No tiene más requisitos, ya que puede usar el sistema de archivos local para leer el archivo de datos y escribir los resultados:

1
2
3
4
5
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.10</artifactId>
    <version>2.2.3</version>
</dependency>

Con la configuración básica, ¡procedamos a escribir nuestro lote de Spark!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public class CalculateFileSum {
    public static String SPACE_DELIMITER = " ";
    public static void main(String[] args) {

        SparkConf conf = new parkConf().setMaster("local[*]").setAppName("SparkFileSumApp");
        JavaSparkContext sc = new JavaSparkContext(conf);

        JavaRDD<String> input = sc.textFile("numbers.txt");
        JavaRDD<String> numberStrings = input.flatMap(s -> Arrays.asList(s.split(SPACE_DELIMITER)).iterator());
        JavaRDD<String> validNumberString = numberStrings.filter(string -> !string.isEmpty());
        JavaRDD<Integer> numbers = validNumberString.map(numberString -> Integer.valueOf(numberString));
        int finalSum = numbers.reduce((x,y) -> x+y);

        System.out.println("Final sum is: " + finalSum);

        sc.close();
    }
}

Ejecutar este fragmento de código debería producir:

1
Final sum is: 687

El objeto JavaSparkContext que hemos creado actúa como una conexión al clúster. Al Spark Context que hemos creado aquí se le han asignado todos los procesadores locales disponibles, de ahí el *.

La abstracción más básica en Spark es RDD, que significa Conjuntos de datos distribuidos resistentes. Es resistente y está distribuido, ya que los datos se replican en todo el clúster y se pueden recuperar si alguno de los nodos falla.

Otro beneficio de la distribución de datos es que se pueden procesar en paralelo, lo que promueve el escalado horizontal. Otra característica importante de los RDD es que son inmutables. Si aplicamos cualquier acción o transformación a un RDD dado, el resultado es otro conjunto de RDD.

En este ejemplo, hemos leído las palabras del archivo de entrada como RDDs y las hemos convertido en números. Luego les hemos aplicado la función reduce para sumar los valores de cada uno de los RDD antes de mostrarlos en la consola.

Introducción a las bibliotecas de Spark

Spark nos proporciona una serie de bibliotecas integradas que se ejecutan sobre Spark Core.

Spark SQL

Chispa SQL proporciona una interfaz similar a SQL para realizar el procesamiento de datos estructurados. Cuando el usuario ejecuta una consulta SQL, Spark SQL inicia internamente un trabajo por lotes que manipula los RDD según la consulta.

El beneficio de esta API es que aquellos familiarizados con consultas estilo RDBMS encuentran fácil la transición a Spark y escribir trabajos en Spark.

Spark Streaming

Transmisión de chispa es adecuado para aplicaciones que se ocupan del flujo de datos en tiempo real, como el procesamiento de feeds de Twitter.

Spark puede integrarse con apache kafka y otras herramientas de transmisión para proporcionar capacidades de procesamiento tolerantes a fallas y de alto rendimiento para los datos de transmisión.

Spark MLlib

MLlib es la abreviatura de Biblioteca de aprendizaje automático que proporciona Spark. Incluye los algoritmos de aprendizaje comunes como clasificación, recomendación, modelado, etc. que se utilizan en el aprendizaje automático.

Estos algoritmos se pueden usar para entrenar el modelo según los datos subyacentes. Debido al procesamiento de datos extremadamente rápido que admite Spark, los modelos de aprendizaje automático se pueden entrenar en un período de tiempo relativamente más corto.

GráficoX

Como su nombre lo indica, GráficoX es la API de Spark para procesar gráficos y realizar cálculos paralelos de gráficos.

El usuario puede crear gráficos y realizar operaciones como unir y transformar los gráficos. Al igual que con MLlib, Graphx viene con algoritmos gráficos incorporados para el rango de páginas, el conteo de triángulos y más.

Conclusión

Apache Spark es la plataforma elegida debido a su increíble velocidad de procesamiento de datos, facilidad de uso y funciones tolerantes a fallas.

En este artículo, echamos un vistazo a la arquitectura de Spark y cuál es el secreto de su velocidad de procesamiento ultrarrápida con la ayuda de un ejemplo. También echamos un vistazo a las bibliotecas populares de Spark y sus funciones.