apache-spark filter - Spark-repartition()vs coalesce()




rdd sbt (5)

De acuerdo con Learning Spark

Tenga en cuenta que reparticionar sus datos es una operación bastante costosa. Spark también tiene una versión optimizada de repartition () llamada coalesce () que permite evitar el movimiento de datos, pero solo si está disminuyendo el número de particiones RDD.

Una diferencia que obtengo es que con repartition () el número de particiones se puede aumentar / disminuir, pero con coalesce () el número de particiones solo se puede disminuir.

Si las particiones están distribuidas en varias máquinas y se ejecuta coalesce (), ¿cómo puede evitar el movimiento de datos?


Answers

Un punto adicional a tener en cuenta aquí es que, como el principio básico de Spark RDD es la inmutabilidad. El reparto o fusión creará un nuevo RDD. La base RDD continuará teniendo existencia con su número original de particiones. En caso de que el caso de uso exija la persistencia del RDD en la memoria caché, se debe hacer lo mismo con el RDD recién creado.

scala> pairMrkt.repartition(10)
res16: org.apache.spark.rdd.RDD[(String, Array[String])] =MapPartitionsRDD[11] at repartition at <console>:26

scala> res16.partitions.length
res17: Int = 10

scala>  pairMrkt.partitions.length
res20: Int = 2

Evita una mezcla completa . Si se sabe que el número está disminuyendo, entonces el ejecutor puede mantener los datos de forma segura en el número mínimo de particiones, solo moviendo los datos de los nodos adicionales, a los nodos que mantuvimos.

Entonces, sería algo como esto:

Node 1 = 1,2,3
Node 2 = 4,5,6
Node 3 = 7,8,9
Node 4 = 10,11,12

Luego coalesce a 2 particiones:

Node 1 = 1,2,3 + (10,11,12)
Node 3 = 7,8,9 + (4,5,6)

Tenga en cuenta que el nodo 1 y el nodo 3 no requieren que se muevan sus datos originales.


De una manera simple COALESCE: - es solo para disminuir el número de particiones, no se mezclan los datos simplemente comprime las particiones

REPARTICIÓN: - es tanto para aumentar como para disminuir el número de particiones, pero la mezcla se lleva a cabo

Ejemplo:-

val rdd = sc.textFile("path",7)
rdd.repartition(10)
rdd.repartition(2)

Ambos funcionan bien

Pero vamos generalmente por estas dos cosas cuando necesitamos ver resultados en un cluster, vamos con esto.


Todas las respuestas están agregando un gran conocimiento en esta pregunta tan frecuente.

Así que, siguiendo la tradición de la línea de tiempo de esta pregunta, aquí están mis 2 centavos.

Descubrí que la repartición es más rápida que la fusión , en un caso muy específico.

En mi aplicación, cuando el número de archivos que estimamos es inferior al umbral determinado, la repartición funciona más rápido.

Esto es lo que quiero decir

if(numFiles > 20)
    df.coalesce(numFiles).write.mode(SaveMode.Overwrite).parquet(dest)
else
    df.repartition(numFiles).write.mode(SaveMode.Overwrite).parquet(dest)

En el fragmento de arriba, si mis archivos eran menos de 20, la unión tardaba una eternidad en terminar, mientras que la repartición era mucho más rápida y, por lo tanto, el código anterior.

Por supuesto, este número (20) dependerá de la cantidad de trabajadores y la cantidad de datos.

Espero que ayude.


En mi entendimiento (no soy un gran usuario de 2PC ya que lo considero limitante):

  • Normalmente, 2PC es para transacciones inmediatas .
  • Típicamente, las sagas son para transacciones de larga duración .

Los casos de uso son obvios después:

  • 2PC puede permitirle comprometer la transacción completa en una solicitud o algo así, abarcando esta solicitud en todos los sistemas y redes. Suponiendo que cada sistema y red participantes sigan el protocolo, puede confirmar o deshacer la transacción completa sin problemas.
  • Saga le permite dividir la transacción en varios pasos, que abarcan largos períodos de tiempo (no necesariamente sistemas y redes).

Ejemplo:

  • 2PC: Guardar cliente para cada solicitud de factura recibida, mientras que ambos son administrados por 2 sistemas diferentes.
  • Sagas: reserve un itinerario de vuelo que consiste en varios vuelos de conexión, mientras que cada vuelo individual es operado por diferentes aerolíneas.

Personalmente considero que Saga es capaz de hacer lo que 2PC puede hacer. Lo opuesto no es exacto.

Creo que las sagas son universales, mientras que 2PC implica el bloqueo de la plataforma / proveedor.





apache-spark distributed-computing rdd