apache spark - started - Spark: ¿diferencia entre Shuffle Write, Shuffle spill(memoria), Shuffle spill(disco)?
spark todf (4)
Las llamadas persist
en su código se desperdician por completo si no accede al RDD varias veces. ¿De qué sirve almacenar algo si nunca accedes a él? El almacenamiento en caché no tiene ninguna relación con el comportamiento aleatorio, salvo que puede evitar volver a hacer mezclas manteniendo su salida en caché.
El derrame aleatorio se controla mediante los parámetros de configuración spark.shuffle.spill
y spark.shuffle.memoryFraction
. Si el spill
está habilitado (es por defecto), los archivos aleatorios se derramarán en el disco si comienzan a usar más de lo que da memoryFraction
(20% por defecto).
Las métricas son muy confusas. Mi lectura del código es que "Derrame aleatorio (memoria)" es la cantidad de memoria que se liberó cuando las cosas se derramaron en el disco. El código para "Derrame aleatorio (disco)" parece ser la cantidad realmente escrita en el disco. Por el código para "Shuffle write" creo que es la cantidad escrita directamente en el disco, no como un derrame de un clasificador.
Tengo el siguiente trabajo de chispa, tratando de mantener todo en la memoria:
val myOutRDD = myInRDD.flatMap { fp =>
val tuple2List: ListBuffer[(String, myClass)] = ListBuffer()
:
tuple2List
}.persist(StorageLevel.MEMORY_ONLY).reduceByKey { (p1, p2) =>
myMergeFunction(p1,p2)
}.persist(StorageLevel.MEMORY_ONLY)
Sin embargo, cuando miré en el rastreador de trabajos, todavía tengo un montón de Shuffle Write y Shuffle derrame en el disco ...
Total task time across all tasks: 49.1 h
Input Size / Records: 21.6 GB / 102123058
Shuffle write: 532.9 GB / 182440290
Shuffle spill (memory): 370.7 GB
Shuffle spill (disk): 15.4 GB
Luego, el trabajo falló porque "no space left on device"
... Me pregunto si la escritura aleatoria de 532,9 GB está aquí, ¿está escrita en el disco o en la memoria?
Además, ¿por qué todavía hay 15.4 G de datos derramados en el disco mientras específicamente les pido que los mantengan en la memoria?
¡Gracias!
La escritura aleatoria significa aquellos datos que se han escrito en su sistema de archivos local en la ubicación temporal de la memoria caché. En el modo de grupo de hilos, puede establecer esta propiedad con el atributo "yarn.nodemanager.local-dirs" en yarn-site.xml. Por lo tanto, la "escritura aleatoria" se refiere al tamaño de los datos que ha escrito en la ubicación temporal; "Shuffle spill" es más probable que sea el resultado de la etapa de mezcla. De todos modos, esa figura se acumula.
El derrame aleatorio (memoria) es el tamaño de la forma deserializada de los datos en la memoria en el momento en que lo derramamos, mientras que el derrame aleatorio (disco) es el tamaño de la forma serializada de los datos en el disco después de derramarlo. Es por eso que este último tiende a ser mucho más pequeño que el primero. Tenga en cuenta que ambas métricas se agregan a lo largo de toda la duración de la tarea (es decir, dentro de cada tarea puede derramarse varias veces).
Una nota más sobre cómo evitar el derrame aleatorio, ya que creo que es la parte más importante de la pregunta desde un aspecto de rendimiento (la escritura aleatoria, como se mencionó anteriormente, es una parte necesaria de la mezcla).
El desbordamiento ocurre cuando la lectura aleatoria, cualquier reductor no puede ajustarse a todos los registros asignados en la memoria en el espacio de mezcla de ese ejecutor. Si su reproducción aleatoria está desequilibrada (por ejemplo, algunas particiones de salida son mucho más grandes que algunas particiones de entrada), es posible que haya mezclado aleatoriamente aunque las particiones "quepan en la memoria" antes de la reproducción aleatoria. La mejor manera de controlar esto es A) equilibrando la reproducción aleatoria ... por ejemplo, cambiando el código para reducir antes de mezclar o arrastrando las teclas diferentes o B) cambiando la configuración de la memoria aleatoria como se sugiere más arriba Dado el alcance del derrame en el disco, probablemente necesite hacer A en lugar de B.