La diferencia entre reparación por chispa y coalescencia
¿Deberíamos utilizar reparar o fusionar? Por tanto, debemos comprender las diferencias inherentes entre estos dos operadores.
Debe saber que para reparticionar operadores costosos, Spark ha desarrollado una versión optimizada de la reparación llamada coalesce, que puede evitar la migración de datos tanto como sea posible.
Pero solo puedes reducir la división de RDD.
Por ejemplo, existen los siguientes nodos de datos:
Al utilizar la fusión, las particiones se reducen a dos:
Tenga en cuenta que el Nodo1 y el Nodo3 no necesitan mover los datos originales.
El algoritmo de reparto realiza una mezcla completa y crea nuevas particiones con datos distribuidos uniformemente.
Creemos un marco de datos con números del 1 al 12.
El algoritmo de reparto realizará una mezcla completa y luego creará una nueva partición de manera uniforme. Creemos un marco de datos con los números del 1 al 12 para probarlo.
Inicialmente, los datos se distribuyen así:
Hagamos una mezcla completa y dividámoslos en dos.
Esta es la distribución de datos en mi máquina:
Partición A: 1, 3, 4, 6, 7, 9, 10, 12
Partición B : 2, 5, 8, 11
El método de reparticionamiento crea nuevas particiones y distribuye uniformemente los datos en las nuevas particiones (para conjuntos de datos más grandes, los datos se distribuyen de manera más uniforme).
El método de reparticionamiento distribuye los datos uniformemente entre nuevas particiones (más incluso si los datos son grandes)
Coalesce utiliza particiones existentes para minimizar el desorden de datos.
La repartición crea una nueva partición y utiliza aleatorización completa.
Coalesce distribuirá cada partición con una cantidad diferente de datos (a veces cada partición tendrá un tamaño diferente)
Sin embargo, el reparticionamiento hará que el tamaño de los datos de cada partición sea aproximadamente igual.
La diferencia entre fusionar y repartir (la fusión se menciona a continuación por defecto cuando el parámetro de reproducción aleatoria es falso)
Repartición (núm de particiones: int): RDD [t] y unión( num particiones: int, shuffle: Boolean = false): el reparticionamiento RDD[t] es solo una implementación de la interfaz de unión donde shuffle es verdadero.
Hay 1w archivos pequeños y los recursos también son -executor-memory 2g-executor-cores 2-num-executors 5.
Repartición (4): Genera barajado. En este momento, se iniciarán 5 programas de ejecución para leer los archivos de 1w particiones en secuencia como se describió anteriormente, y luego escribir 4 archivos de acuerdo con ciertas reglas%4. De esta manera, los 4 archivos en la partición son básicamente irregulares y relativamente. uniforme. .
Unión (4): Esta unión no provocará barajado. Entonces, ¿cómo puedes generar cuatro archivos si inicias cinco ejecutores sin mezclarlos? De hecho, habrá uno, dos, tres o incluso más ejecutores corriendo en el aire (específicamente, el número de ejecutores corriendo en el aire está relacionado con la programación de chispas, la localidad de los datos y la carga del grupo de chispas. No lo ha leído). . Cualquier dato!
1. Si la cantidad de archivos generados por el resultado es menor que la partición RDD de origen, no se puede lograr mediante la fusión. Por ejemplo, si hay cuatro archivos pequeños (cuatro particiones) y desea generar cinco archivos, no puede usar la fusión. En otras palabras, no puede aumentar la cantidad de archivos sin generar una mezcla.
2. Si solo tiene 1 ejecutor (1 núcleo) y 5 particiones RDD de origen, debe usar coalesce para generar 2 archivos. Luego realice una partición previa del ejecutor, por ejemplo, ejecute la partición 0-2 para el ejecutor anterior y ejecute la partición 3-4 nuevamente para el mismo ejecutor. De hecho, todos son el mismo ejecutor, pero necesitan leer datos diferentes en serie. Es muy diferente de reparticion(2) en términos de lectura de particiones (manejando lecturas consecutivas de números de partición 0-4 para %2).
La tabla tiene 10G de datos, 100 recursos de partición y también es -executor-memory 2g-executor-cores 2-num-executors 5. Todo lo que necesitamos es un archivo de resultados.