Introducción a Apache Spark con Java

    ¿Qué es Apache Spark?

    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.

    Necesidad 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/

    Spark 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:

    <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.

    En este ejemplo, hemos leído las palabras del archivo de entrada como RDDsy 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.

    Spark 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.

    Conclusió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.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *