Spark computación paralela

 

Objetivo:

  1. Explicar cómo se distribuyen los RDD en clústeres SPARK.
  2. Analice cómo SPARK particiona los RDD basados ​​en archivos.
  3. Explicar cómo SPARK realiza operaciones RDD en paralelo
  4. Explicar cómo lograr el control paralelo a través de la partición.
  5. Analice cómo ver y monitorear tareas y etapas.

Primero, echemos un vistazo a cómo funciona la chispa en el modo de clúster.

grupo de chispas

El proceso de ejecución de un programa de chispa en modo nube se muestra a continuación.

Los usuarios pueden enviar trabajos de chispa a través de Spark-submit. Una vez que se envía el trabajo de chispa, se abrirá el controlador Sparkcontext y el programa se pasará al nodo de administración de la nube (Administrador de clúster: puede ser hilo, independiente, mesos, local, k8s, etc. Según tengo entendido, aquí solo se envía el controlador desencadenado por la tarea. En cuanto al programa spark real (la parte de cómo procesar los datos generalmente se carga en un formato empaquetado en una ubicación específica, que puede ser dfs o nfs, etc.) aquí Y no se envió) al nodo maestro del clúster.

El nodo maestro del clúster creará un contenedor en el nodo de trabajo de acuerdo con este programa (programa controlador). A continuación, los Ejecutores en el nodo de trabajo se crearán de acuerdo con el contenedor y luego interactuarán a través de sparkContext en el programa del controlador.

RDDs en SPARK CLUSTER

En RDD (Resilient Distributed DataSets), genere datos de particiones en los nodos de trabajo. También puede controlar el número de particiones creadas.

Tratemos de entender el concepto de partición de un solo archivo

Partición de archivo: archivo único

La partición se basará en el tamaño del archivo. También puede especificar el número mínimo de particiones (archivo, minParticiones) para el archivo de texto deseado. Por defecto, el archivo que se ejecuta en el grupo de chispas se divide en 2 partes. Cuantas más particiones, mayor será el grado de paralelismo.

Partición de archivo: múltiples archivos

Use el comando: sc.textFile ('mydir / *'), cada archivo es al menos una partición. Puede realizar operaciones basadas en archivos en cada partición, como analizar XML.

El siguiente comando: sc.wholeTextFiles ("mydir"). Este comando se usa para particionar muchos archivos pequeños, y también se puede usar para crear un par clave-valor RRD (la clave representa el nombre del archivo, el valor representa el contenido del archivo)

La mayoría de las operaciones RDD actuarán en cada elemento en el RDD, y un pequeño número actuará en cada partición. Algunos comandos que actúan en particiones son:

foreachPartition ---- se usa para llamar a una función para cada partición

mapPartitions --- se usa para crear un nuevo RDD ejecutando una función en cada partición del RDD actual

mapPartitionsWithIndex --- Este comando es similar a mapPartitions, excepto que este comando contiene el índice de la partición

Nota: La función de la operación de partición usa un iterador. Para una mejor comprensión, miramos un ejemplo de RDD.

Primero entienda la foreachPartition a través de ejemplos

foreachPartition

En el siguiente ejemplo, creamos una función printFirstLine para calcular la primera línea de cada partición.

Supongamos que hemos creado un RDD llamado myrdd. Pasamos la función creada printFirstLine a foreachPartition que necesita calcular la primera línea de una partición.

Ahora que comprende los comandos para la partición, el próximo capítulo intentará comprender los conceptos de HDFS y los datos locales a través de un ejemplo

HDFS y datos locales (localidad de datos)

En la figura, puede ver múltiples nodos de datos.

Ahora puede enviar archivos mydata a hdfs a través de hdfs dfs -put mydata. Suponga que el archivo está almacenado en el disco hdfs en forma de tres bloques.

Después de guardar los datos en el disco HDFS, puede programar en spark. Después de iniciar su programa, se obtendrá el contexto de Spark y el ejecutor comenzará en los nodos de datos. (Debe suponerse que el administrador de clúster que ejecuta el programa spark es yarn, y yarn copia el programador en los nodos de datos correspondientes para ejecutar)

Con el comando sc.textfile, puede insertar el archivo mydata en el ejecutor. Como este es solo un paso de conversión, el RDD seguirá vacío.

Ejecutado mediante disparadores de acción, las tareas en el ejecutor cargan datos de bloques en particiones. Luego, los datos se distribuirán entre los programas en ejecución hasta que la operación devuelva el valor al controlador.

Operaciones paralelas en particiones (Operaciones paralelas en particiones)

Las operaciones RDD se pueden realizar en paralelo en cada partición. La tarea se ejecutará en el nodo de trabajo de almacenamiento de datos.

Algunas operaciones conservarán la partición, como map, flatMap, filter, distinct, etc. Algunas operaciones han sido reparticionadas, como reduceByKey, sortByKey, join, groupByKey, etc.

Entonces entienda el funcionamiento de las etapas

Operaciones en etapas.

Las operaciones en etapas pueden ejecutarse en la misma partición (las operaciones que pueden ejecutarse en la misma partición se ejecutan en etapas). Las tareas en el mismo escenario están unidas por la tubería. Los desarrolladores deben conocer las etapas de operación para mejorar el rendimiento.

Aquí hay algunos términos de Spark:

Trabajo: es un conjunto de tareas de ejecución para un comportamiento (la comprensión personal es una colección de todas las tareas para un determinado propósito, que puede entenderse como un dag)

etapa: es un conjunto de tareas que se pueden ejecutar en paralelo en el trabajo (la comprensión personal es un conjunto de tareas ejecutadas desde una sola partición, que se puede entender como un DAG optimizado)

Tarea: Una sola unidad de ejecución de trabajo enviada a un ejecutor (entendida personalmente como una función).

Aplicación: es una colección de varios trabajos administrados por un solo controlador (puede entenderse como un solo script de programa)

A continuación, vea cómo la chispa calcula las etapas.

Cómo chispa calcula etapas

Spark construye un gráfico acíclico dirigido o DAG de dependencias RDD. Hay dos tipos de estas dependencias.

Dependencia estrecha

La dependencia estrecha significa que cada partición en el RDD secundario solo depende de una partición del RDD primario. No hay necesidad de barajar en diferentes ejecutores. El nodo que crea el RDD se puede dividir en una etapa, por ejemplo: mapa, filtro

Dependencia amplia o dependencia aleatoria

Dependencia amplia o dependencia aleatoria, muchas particiones RDD secundarias dependen de cada partición de RDD principal. La dependencia wide-k define una nueva etapa. Por ejemplo: reduceByKey, join, groupByKey. A continuación, observe el proceso de control de paralelismo.

Operaciones ampliamente dependientes como la partición RDD ReduceByKey resultados. Cuantas más particiones, más tareas paralelas. Si hay muy pocas particiones, el grupo de chispas no se utilizará por completo.

El número de particiones puede controlarse mediante la opción de parámetro numPartitions durante la llamada a la función. Puede ver la interfaz de usuario de la aplicación de chispa a través de localhost: 4040, y puede ver todos los trabajos de chispa en la interfaz de usuario.

Resumen:

RDDS se almacena en la memoria del ejecutor SPARK

La máquina virtual y los datos JVMS se dividen en zonas.

Cada partición en el Executor RDD separado realiza operaciones en paralelo

Las operaciones basadas en la misma partición están restringidas juntas en la tubería en la etapa

Las operaciones que dependen de particiones múltiples se realizan de manera separada en la etapa

 

Publicado 42 artículos originales · elogiado 4 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/wangyhwyh753/article/details/104040730
Recomendado
Clasificación