¿Cómo funciona DAG bajo las cubiertas en RDD?

El trabajo de investigación de Spark prescribió un nuevo modelo de progtwigción distribuida sobre el clásico Hadoop MapReduce, afirmando la simplificación y el gran aumento de rendimiento en muchos casos, especialmente en Machine Learning. Sin embargo, el material para descubrir la internal mechanics en Resilient Distributed Datasets con Directed Acyclic Graph parece que falta en este documento.

¿Debería aprenderse mejor investigando el código fuente?

Incluso he estado buscando en la web para aprender cómo la chispa calcula el DAG del RDD y luego ejecuta la tarea.

En el nivel alto, cuando se llama a cualquier acción en el RDD, Spark crea el DAG y lo envía al planificador DAG.

  • El progtwigdor DAG divide operadores en etapas de tareas. Una etapa se compone de tareas basadas en particiones de los datos de entrada. El progtwigdor DAG canaliza operadores juntos. Por ejemplo, muchos operadores de mapas se pueden progtwigr en una sola etapa. El resultado final de un progtwigdor DAG es un conjunto de etapas.

  • Las etapas se pasan al Progtwigdor de tareas. El planificador de tareas inicia tareas a través del administrador de clústeres (Spark independiente / Hilo / Mesos). El progtwigdor 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, etc.

transformación amplia : requiere que los datos se mezclen, por ejemplo, reduceByKey, 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 toDebugString() . Por ejemplo, ejecutar toDebugString() en el RDD splitedLines dará como resultado lo siguiente:

 (2) ShuffledRDD[6] at reduceByKey at :25 [] +-(2) MapPartitionsRDD[5] at map at :24 [] | MapPartitionsRDD[4] at map at :23 [] | log.txt MapPartitionsRDD[1] at textFile at :21 [] | log.txt HadoopRDD[0] at textFile at :21 [] 

La primera línea (desde abajo) muestra la entrada RDD. Creamos este RDD llamando a sc.textFile() . A continuación se muestra una vista más diagramática del gráfico DAG creado a partir del RDD proporcionado.

Gráfico RDD DAG

Una vez que se construye el DAG, el progtwigdor Spark crea un plan de ejecución físico. Como se mencionó anteriormente, el progtwigdor 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:

Etapas

El progtwigdor DAG luego enviará las etapas al progtwigdor 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 diagtwig ilustra esto con más detalle:

Ejecución de tareas

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.

  1. Apache Spark-Sameer Farooqui avanzado (Databricks)
  2. Una comprensión más profunda de las chispas internas: Aaron Davidson (Databricks)
  3. Introducción a AmpLab Spark Internals

Spark 1.4 visualización de datos de Beginning Spark 1.4 se ha agregado a través de los siguientes tres componentes, donde también proporciona una representación gráfica clara de DAG .

  • Vista de la línea de tiempo de los eventos de Spark

  • DAG de ejecución

  • Visualización de estadísticas de Spark Streaming

Consulte el enlace para más información.