Optimizar Spark

Broadcast Hash JoinSpark logo

Si se quiere unir una tabla grande con una pequeña, lo más eficiente es enviar la tabla pequeña por broadcast a la memoria de los Worker, así evitaremos que la grande ser esté enviando constantemente por red cada vez que se la necesita.

Si se quiere unir una tabla grande con una mediana es inevitable el problema y se va a tener que hacer un suffle y un spilling al disco, para paliar este problema en ocasiones es posible reducir la tabla mediana con campos que no sean necesarios u operaciones que puedan ejecutarse a priori, de manera que se quede lo más reducida posible.

 

ReduceByKey vs. GroupByKey

Ambas operaciones pueden dar lugar al mismo resultado, reduceByKeyes es más eficiente que groupByKey, y no causa problemas de espacio en disco.

El secreto de su eficiencia viene por ejemplo de que reduceByKey combina en el nodo y cada partición devuelve como mucho un valor por cada clave que se envía por la red.

Nota: Shuffle se produce cuando hay que transferir todos los datos con la misma clave al mismo nodo worker.

 

Uso de acumuladores

SparkContext.accumulator(v) crea acumuladores que solo permiten operaciones aditivas y que permite acerlo de forma paralela. Permiten implementar contadores o sumas.

Los Worked pueden modificar su valor pero solo el Driver puede leer el valor del acumulador, mediante el método value()

Otros artículos que pueden ser de interés:

Autor: Diego Calvo