apache spark - examples - Trabajo interno de Spark
apache spark wikipedia (1)
Ahora un día Spark está en progreso. Spark usó el lenguaje scala para cargar y ejecutar el programa y también python y java. RDD se usa para almacenar los datos. Pero no puedo entender la arquitectura de Spark, cómo funciona internamente.
Por favor, dime Spark Architecture, así como ¿Cómo funciona internamente?
Incluso he estado buscando en la web para aprender sobre los aspectos internos de Spark, a continuación se muestra lo que pude aprender y pensé compartir aquí.
Spark gira en torno al concepto de un conjunto de datos distribuidos (RDD) resistente, que es una colección tolerante a fallas de elementos que pueden operarse en paralelo. Los RDD admiten dos tipos de operaciones: las transformaciones, que crean un nuevo conjunto de datos a partir de uno existente, y las acciones, que devuelven un valor al programa del controlador después de ejecutar un cálculo en el conjunto de datos.
Spark traduce las transformaciones de RDD en algo llamado DAG (Gráfico acíclico dirigido) e inicia la ejecución,
En el nivel alto, cuando se realiza una acción en el RDD, Spark crea el DAG y lo envía al programador de DAG.
El programador DAG divide operadores en etapas de tareas. Una etapa se compone de tareas basadas en particiones de los datos de entrada. El programador DAG canaliza operadores juntos. Por ejemplo, muchos operadores de mapas se pueden programar en una sola etapa. El resultado final de un programador DAG es un conjunto de etapas.
Las etapas se pasan al Programador de tareas. El planificador de tareas inicia tareas a través del administrador de clúster. (Spark independiente / Hilo / Mesos). El programador de tareas no conoce las dependencias de las etapas.
El trabajador ejecuta las tareas en el esclavo.
Veamos cómo Spark construye el DAG.
A alto nivel, hay dos transformaciones que se pueden aplicar a los RDD, a saber, la transformación estrecha y la transformación amplia . Las grandes transformaciones básicamente resultan en límites de etapa.
Transformación estrecha : no requiere que los datos se mezclen en las particiones. por ejemplo, Mapa, filtro y etc.
transformación amplia : requiere que los datos se mezclen, por ejemplo, reduceByKey y etc.
Tomemos un ejemplo de cómo contar cuántos mensajes de registro aparecen en cada nivel de gravedad,
Lo siguiente es el archivo de registro que comienza con el nivel de gravedad,
INFO I''m Info message
WARN I''m a Warn message
INFO I''m another Info message
y crea el siguiente código scala para extraer el mismo,
val input = sc.textFile("log.txt")
val splitedLines = input.map(line => line.split(" "))
.map(words => (words(0), 1))
.reduceByKey{(a,b) => a + b}
Esta secuencia de comandos define implícitamente un DAG de objetos RDD (linaje RDD) que se utilizará más adelante cuando se llame a una acción. Cada RDD mantiene un puntero a uno o más padres junto con los metadatos sobre qué tipo de relación tiene con el padre. Por ejemplo, cuando llamamos a val b = a.map () en un RDD, el RDD b mantiene una referencia a su padre a, que es un linaje.
Para mostrar el linaje de un RDD, Spark proporciona un método de depuración para el método DebugString () . Por ejemplo, ejecutar toDebugString () en splitedLines RDD, generará lo siguiente,
(2) ShuffledRDD[6] at reduceByKey at <console>:25 []
+-(2) MapPartitionsRDD[5] at map at <console>:24 []
| MapPartitionsRDD[4] at map at <console>:23 []
| log.txt MapPartitionsRDD[1] at textFile at <console>:21 []
| log.txt HadoopRDD[0] at textFile at <console>:21 []
La primera línea (desde abajo) muestra el RDD de entrada. Creamos este RDD llamando a sc.textFile (). Vea a continuación más vista diagramática del gráfico DAG creado a partir del RDD proporcionado.
Una vez que se construye el DAG, el planificador Spark crea un plan de ejecución físico. Como se mencionó anteriormente, el programador DAG divide el gráfico en varias etapas, las etapas se crean en función de las transformaciones. Las transformaciones estrechas se agruparán (revestirán con tuberías) juntas en una sola etapa. Entonces, para nuestro ejemplo, Spark creará dos etapas de ejecución de la siguiente manera:
El planificador DAG luego envía las etapas al planificador de tareas. El número de tareas enviadas depende del número de particiones presentes en el archivo de texto. El ejemplo de Fox considera que tenemos 4 particiones en este ejemplo, luego habrá 4 conjuntos de tareas creadas y enviadas en paralelo, siempre que haya suficientes esclavos / núcleos. El siguiente diagrama ilustra esto con un poco más de detalle,
Para obtener información más detallada, le sugiero que revise los siguientes videos de Youtube, donde los creadores de Spark brindan información detallada sobre el DAG y el plan de ejecución y duración.