¿Qué es Apache Spark?
Contenido
Apache Spark es un motor de procesamiento de datos distribuidos en memoria que se utiliza para procesar y analizar 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 debe depender de los sistemas de almacenamiento para el procesamiento de datos. Puede ejecutarse en HDFS o sistemas de archivos basados en la nube como Amazon S3 y Azure BLOB.
Además de los sistemas de archivos basados en la nube, también se puede ejecutar 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, procesamiento de gráficos, transmisión y procesamiento de datos tipo SQL. 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.
Te puede interesar:Codificación de contraseña con Spring SecurityNecesidad de Spark
La forma tradicional de procesar datos en Hadoop está 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 volvió más común, los creadores sintieron la necesidad de acelerar el procesamiento reduciendo la utilización del disco durante la ejecución de trabajos.
Apache Spark aborda este problema al realizar el cálculo en la memoria principal (RAM) de los nodes de trabajo y no almacena los resultados del cálculo a mitad de paso en el disco.
En segundo lugar, en realidad no carga los datos hasta que se requieren para el cálculo. Convierte el conjunto de comandos dado 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 de Hadoop MapReduce. Como resultado, Spark afirma procesar datos en 100X más rápido que un trabajo correspondiente utilizando MapReduce para trabajos de cálculo en memoria.
Arquitectura Spark
Crédito: https://spark.apache.org/
Te puede interesar:Java: leer un archivo en una ArrayListSpark Core utiliza una arquitectura maestro-esclavo. El programa Driver se ejecuta en el node maestro y distribuye las tareas a un Ejecutor que se ejecuta en varios nodes esclavos. El Ejecutor se ejecuta en sus propias JVM independientes, 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 del node trabajador. Los Ejecutores ejecutan las tareas y envían el resultado al Conductor.
El controlador se comunica con los nodes de los clústeres mediante un administrador de clústeres como el administrador de clústeres integrado, Mesos, HILO, etc. Los programas por lotes que escribimos se ejecutan en el node del controlador.
Trabajo de Spark simple usando Java
Hemos hablado mucho sobre Spark y su arquitectura, así que ahora echemos un vistazo a un trabajo simple de Spark que cuenta la suma de números separados por espacios de un archivo de texto dado:
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:
Te puede interesar:Serializar y deserializar XML en Java con Jackson<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>2.2.3</version>
</dependency>
Con la configuración principal, ¡procedamos a escribir nuestro lote de Spark!
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:
Final sum is: 687
los JavaSparkContext
El objeto que hemos creado actúa como una conexión con el 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 son las siglas de Resilient Distributed Datasets. Es resistente y está distribuido, ya que los datos se replican en todo el clúster y se pueden recuperar si alguno de los nodes falla.
Otro beneficio de distribuir datos es que se pueden procesar en paralelo, promoviendo así 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.
Te puede interesar:Concurrencia en Java: el marco de ejecuciónEn este ejemplo, hemos leído las palabras del archivo de entrada como RDD
sy convertirlos en números. Entonces hemos aplicado el reduce
funcionan en ellos para sumar los valores de cada uno de los RDD antes de mostrarlos en la consola.
Introducción a las bibliotecas Spark
Spark nos proporciona una serie de bibliotecas integradas que se ejecutan sobre Spark Core.
Spark SQL
Spark SQL proporciona una interfaz similar a SQL para realizar el procesamiento de datos estructurados. Cuando el usuario ejecuta una consulta SQL, Spark SQL inicia un trabajo por lotes internamente y manipula los RDD según la consulta.
El beneficio de esta API es que aquellos familiarizados con las consultas de estilo RDBMS encuentran fácil la transición a Spark y escribir trabajos en Spark.
Spark Streaming
Spark Streaming es adecuado para aplicaciones que se ocupan del flujo de datos en tiempo real, como el procesamiento de feeds de Twitter.
Te puede interesar:Programación dinámica en JavaSpark puede integrarse con Apache Kafka y otras herramientas de transmisión para proporcionar capacidades de procesamiento de alto rendimiento y tolerantes a fallas para la transmisión de datos.
Spark MLlib
MLlib es la abreviatura de Machine Learning Library que proporciona Spark. Incluye los algoritmos de aprendizaje comunes como clasificación, recomendación, modelado, etc. que se utilizan en el Machine Learning.
Estos algoritmos se pueden utilizar para entrenar el modelo según los datos subyacentes. Debido al procesamiento de datos extremadamente rápido que admite Spark, los modelos de Machine Learning se pueden entrenar en un período de tiempo relativamente más corto.
GraphX
Como su nombre lo indica, GraphX es la API de Spark para procesar gráficos y realizar cálculos en paralelo 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 de gráficos integrados para rango de página, recuento de triángulos y más.
Te puede interesar:La declaración try-with-resources en JavaConclusión
Apache Spark es la plataforma elegida debido a su increíble velocidad de procesamiento de datos, facilidad de uso y características de tolerancia 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 populares bibliotecas Spark y sus características.