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 鈥嬧媏n la nube como Amazon S3 y Azure BLOB.

    Adem谩s de los sistemas de archivos basados 鈥嬧媏n 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 *