Apache Spark

APACHE SPARK Definición Apache Spark es un framework de computación distribuida open source, es un motor para el procesa

Views 370 Downloads 0 File size 417KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

APACHE SPARK Definición Apache Spark es un framework de computación distribuida open source, es un motor para el procesamiento de grandes volúmenes datos y que gracias a su llamada "interactividad" hace que el paradigma MapReduce ya no se limite a las fases Map y Reduce y podamos realizar más operaciones (mappers, reducers, joins, groups by, filtros...). También proporciona API´s para Java,Scala & Python. Es preferible que se programe en Scala ya que el código se verá reducido y todo parecerá más limpio.

Actualmente, Apache Spark está siendo adoptada por Amazon, eBay y Yahoo. Muchas organizaciones trabajan con Apache Spark en grupos con miles de nodos. Según sitio web de Apache Spark, el cluster más grande conocido tiene más de 8000 nodos. Otras funciones clave de Spark incluyen: • En la actualidad proporciona APIs en Scala, Java y Python, con soporte para otros lenguajes (como R). • Se integra bien con sistemas Hadoop y otras fuentes de datos (HDFS, Amazon S3, Hive, HBase, Cassandra, etc.) • Se puede ejecutar en clústeres gestionados por Hadoop YARN o Apache Mesos, y también puede funcionar independiente.

Ventajas La principal ventaja de Apache Spark es que guarda todas las operaciones sobre los datos en memoria. Esta es la clave del buen rendimiento que tiene Apache Spark. La siguiente figura muestra algunas de sus principales características:

Figura 1 Caracteristicas de Apache Spark

 

 





Baja latencia computacional mediante la carga cache de los datos en memoria en un dataset.



Algoritmos iterativos eficientes debido a que las sucesivas operaciones comparten los datos en memoria, o accediendo de manera repetida al mismo dataset.

Principales pilares Apache Spark mantiene la escalabilidad lineal y la tolerancia a fallos de MapReduce, pero amplía sus bondades gracias a varias funcionalidades: DAG y RDD. DAG (Directed Acyclic Graph)

Figura 2 DAG DAG (Grafo Acíclico Dirigido) es un grafo dirigido que no tiene ciclos, es decir, para cada nodo del grafo no hay un camino directo que comience y finalice en dicho nodo. Un vértice se conecta a otro, pero nunca a sí mismo. Apache Spark soporta el flujo de datos acíclico. Cada tarea de Spark crea un DAG de etapas de trabajo para que se ejecuten en un determinado cluster. En comparación con MapReduce, el cual crea un DAG con dos estados predefinidos (Map y Reduce), los grafos DAG creados por Spark pueden tener cualquier número de etapas. Spark con DAG es más rápido que MapReduce por el hecho de que no tiene que escribir en disco los resultados obtenidos en las etapas intermedias del grafo. MapReduce, sin embargo, debe escribir en disco los resultados entre las etapas Map y Reduce. Gracias a una completa API, es posible programar complejos hilos de ejecución paralelos en unas pocas líneas de código. RDD (Resilient Distributed Dataset) Apache Spark mejora con respecto a los demás sistemas en cuanto a la computación en memoria. RDD permite a los programadores realizar operaciones sobre grandes cantidades de datos en

 

 



clusters de una manera rápida y tolerante a fallos. Surge debido a que las herramientas existentes tienen problemas que hacen que se manejen los datos ineficientemente a la hora de ejecutar algoritmos iterativos y procesos de minería de datos. En ambos casos, mantener los datos en memoria puede mejorar el rendimiento considerablemente. Una vez que los datos han sido leídos como objetos RDD en Spark, pueden realizarse diversas operaciones mediante sus APIs. Los dos tipos de operaciones que se pueden realizar son: 

Transformaciones: tras aplicar una transformación, obtenemos un nuevo y modificado RDD basado en el original.



Acciones: una acción consiste simplemente en aplicar una operación sobre un RDD y obtener un valor como resultado, que dependerá del tipo de operación.

Dado que las tareas de Spark pueden necesitar realizar diversas acciones o transformaciones sobre un conjunto de datos en particular, es altamente recomendable y beneficioso en cuanto a eficiencia el almacenar RDDs en memoria para un rápido acceso a los mismos. Mediante la función cache() se almacenan los datos en memoria para que no sea necesario acceder a ellos en disco. El almacenamiento de los datos en memoria caché hace que los algoritmos de machine learning ejecutados que realizan varias iteraciones sobre el conjunto de datos de entrenamiento sea más eficiente. Además, se pueden almacenar versiones transformadas de dichos datos.

Figura 3 Operaciones con RDD

Arquitectura de Apache Spark El nucleo de Apache Spark se complementa con un conjunto de librerías de alto nivel, que se puede utilizar sin problemas en la misma aplicación. Estas librerías actualmente incluyen a SparkSQL, Spark Streaming, MLlib (para machine learning), y GraphX.

 

 



Figura 4 Arquitectura Apache Spark Spark Core es el motor base para el procesamiento paralelo y distribuido de grandes volúmenes de datos. Es responsable de: • Gestión de la memoria y la recuperación de fallos • Programación, distribución y supervisión de las tareas en un clúster • Interactuar con los sistemas de almacenamiento

SparkSQL Es un componente que da soporte para consulta a datos, ya sea a través de SQL o mediante el lenguaje de consulta de Hive. Además proporciona soporte a diversas fuentes de datos, que hace posible hacer consultas SQL, lo que se traduce en una herramienta muy poderosa. Spark Streaming Soporta el procesamiento en tiempo real de data steaming, tales como archivos de registro de servidores web (por ejemplo Apache Flume y HDFS/S3), medios sociales como Twitter, y varias herramientas de mensajería. Spark streaming recibe los flujos de datos de entrada y divide los datos en lotes, posteriormente, se procesan por el Spark Engine y se generan el flujo de resultados.

 

 



Figura 5 Componentes de un cluster MLlib Es una librería de machine learning que ofrece diversos algoritmos diseñados para escalar en un clúster para clasificación, regresión, clustering, filtrado colaborativo. GraphX GraphX es una librería para la manipulación de gráficos y la realización de operaciones con gráficos en paralelo. Proporciona una herramienta uniforme para análisis exploratorio y cálculos iterativos de gráficos.

Componentes de un Clúster Spark 1. Las aplicaciones de Spark se ejecutan en sets de procesos independientes en el cluster y que a su vez son coordinados por el objecto SparkContext del programa principal (llamado driver program). 2. El SparkContext puede conectarse a muchos tipos de clúster managers (tanto Spark StandAlone como los administrador por Apache Mesos/YARN), el cual asigna recursos a través de las aplicaciones. Una vez conectado, Spark toma los executors en los nodos del cluster, los cuales son "worker processess" que ejecutan operaciones y almacenan los datos de la aplicación. 3. Después se envía el código de tu aplicación (definido por el archivo JAR o Python que hemos enviado al SparkContext) a los executors. 4. Por último, el SparkContext envía las tareas a los executors para ejecutarlas.

 

 



Figura 6 Componentes de un cluster Hay algunas cosas útiles que debemos tener en cuenta:

1. Cada aplicación obtiene su propio proceso executor, el cual está levantado durante toda la ejecución y que además ejecutará tareas en múltiples threads. De esta manera las aplicaciones se encuentran aisladas unas de las otras, tanto del lado del scheduler (cada driver maneja sus propias tareas) como del lado del executor (las tareas de las diferentes aplicaciones se ejecutan en diferentes JVMs). Sin embargo, esto también significa que los datos no pueden ser compartidos entre diferentes aplicaciones de Spark (instancias del SparkContext) sin que estas tengan que escribir en sistemas de almacenamiento externo. 2. Spark es indiferente al tipo de administrador de cluster que hayamos elegido. Puede soportar tanto MESOS como YARN. 3. Dado que el driver administra y prioriza las tareas del cluster, este debería ser ejecutado cerca de los workers (nodos), preferiblemente en la misma red local (por temas de latencia).

Modelo de programación Un programa típico se organiza de la siguiente manera: 1. A partir de una variable de entorno llamada context se crea un objeto RDD leyendo datos de fichero, bases de datos o cualquier otra fuente de información. 2. Una vez creado el RDD inicial se realizan transformaciones para crear más objetos RDD a partir del primero. Dichas transformaciones se expresan en términos de programación funcional y no eliminan el RDD original, sino que crean uno nuevo. 3. Tras realizar las acciones y transformaciones necesarias sobre los datos, los objetos RDD deben converger para crear el RDD final. Este RDD puede ser almacenado. Un pequeño ejemplo de código en Python que cuenta el número de palabras que contiene un archivo sería el siguiente:

 

 



Figura 7 Ejemplo de una instrucción Cuando el programa comienza su ejecución crea un grafo similar al de la figura siguiente en el que los nodos son objetos RDD y las uniones entre ellos son operaciones de transformación. El grafo de la ejecución es un DAG y, cada grafo es una unidad atómica de ejecución. En la figura siguiente, las líneas rojas representan transformación y las verdes operación.

Figura 8 Ejecución de un programa Tipos de transformaciones Es muy posible que los datos con los que se necesite tratar estén en diferentes objetos RDD, por lo que Spark define dos tipos de operaciones de transformación: narrow transformation y wide transformation. 

Narrow transformation (Transformación reducida): se utiliza cuando los datos que se necesitan tratar están en la misma partición del RDD y no es necesario realizar una mezcla de dichos datos para obtenerlos todos. Algunos ejemplos son las funciones filter(), sample(), map() o flatMap().

 

 





Wide transformation (Transformación extensa): se utiliza cuando la lógica de la aplicación necesita datos que se encuentran en diferentes particiones de un RDD y es necesario mezclar dichas particiones para agrupar los datos necesarios en un RDD determinado. Ejemplos de wide transformation son: groupByKey() o reduceByKey().

Una representación gráfica de ambos tipos de transformaciones es la que se puede apreciar en la figura siguiente:

Figura 9 Tipos de transformación Ejemplo Dados dos objetos RDD (RDD1 y RDD2), con variables ’a’ y ’b’, se va a realizar una operación de JOIN entre ambos conjuntos de datos para los casos en los que ’a’ sea mayor que 5 y ’b’ sea menor que 10: SELECT a, b FROM RDD1 JOIN RDD2 WHERE a>5 AND b