apache-spark - pueden - no me andan los hashtags en instagram
¿Cuál es la diferencia entre el punto de control de chispa y la persistencia en un disco? (4)
-
Persist (MEMORY_AND_DISK) almacenará el marco de datos en el disco y la memoria temporalmente sin romper el linaje del programa, es decir, df.rdd.toDebugString () devolvería la misma salida. Se recomienda utilizar persistir (*) en un cálculo, que se reutilizará para evitar el recálculo de resultados intermedios:
df = df.persist(StorageLevel.MEMORY_AND_DISK) calculation1(df) calculation2(df)
Tenga en cuenta que el almacenamiento en caché del marco de datos no garantiza que permanecerá en la memoria hasta que lo llame la próxima vez. Dependiendo del uso de la memoria, el caché puede descartarse.
-
checkpoint (), por otro lado, rompe el linaje y obliga al marco de datos a almacenarse en el disco. A diferencia del uso de caché () / persistir (), la comprobación frecuente puede ralentizar su programa. Se recomienda utilizar los puntos de control cuando a) trabaje en un entorno inestable para permitir una recuperación rápida de fallas b) almacene estados intermedios de cálculo cuando las nuevas entradas del RDD dependan de las entradas anteriores, es decir, para evitar recalcular una larga cadena de dependencia en caso de falla
¿Cuál es la diferencia entre el punto de control de chispa y persistir en un disco? ¿Ambas están almacenadas en el disco local?
Creo que puedes encontrar una respuesta muy detallada here
Si bien es muy difícil resumir todo en esa página, diré
Persistir
- La persistencia o el almacenamiento en caché con StorageLevel.DISK_ONLY hace que la generación de RDD se calcule y almacene en una ubicación tal que el uso posterior de ese RDD no vaya más allá de esos puntos al volver a calcular el linaje.
- Después de que se llama persistir, Spark aún recuerda el linaje del RDD aunque no lo llame.
- En segundo lugar, una vez que finaliza la aplicación, se borra la memoria caché o se destruye el archivo
Señalar
- Checkpointing almacena el rdd físicamente en hdfs y destruye el linaje que lo creó.
- El archivo de punto de control no se eliminará incluso después de que finalice la aplicación Spark.
- Los archivos de punto de control se pueden usar en la ejecución de trabajos posteriores o en el programa del controlador
- Señalar un RDD provoca un doble cómputo porque la operación primero llamará a un caché antes de hacer el trabajo real de calcular y escribir en el directorio del punto de control.
Es posible que desee leer el artículo para obtener más detalles o aspectos internos de las operaciones de caché o de puntos de control de Spark.
Hay pocas diferencias importantes, pero la fundamental es lo que sucede con el linaje.
Persist
/
cache
mantiene el linaje intacto mientras el
checkpoint
rompe el linaje.
Consideremos los siguientes ejemplos:
import org.apache.spark.storage.StorageLevel
val rdd = sc.parallelize(1 to 10).map(x => (x % 3, 1)).reduceByKey(_ + _)
-
cache
/persist
:val indCache = rdd.mapValues(_ > 4) indCache.persist(StorageLevel.DISK_ONLY) indCache.toDebugString // (8) MapPartitionsRDD[13] at mapValues at <console>:24 [Disk Serialized 1x Replicated] // | ShuffledRDD[3] at reduceByKey at <console>:21 [Disk Serialized 1x Replicated] // +-(8) MapPartitionsRDD[2] at map at <console>:21 [Disk Serialized 1x Replicated] // | ParallelCollectionRDD[1] at parallelize at <console>:21 [Disk Serialized 1x Replicated] indCache.count // 3 indCache.toDebugString // (8) MapPartitionsRDD[13] at mapValues at <console>:24 [Disk Serialized 1x Replicated] // | CachedPartitions: 8; MemorySize: 0.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 587.0 B // | ShuffledRDD[3] at reduceByKey at <console>:21 [Disk Serialized 1x Replicated] // +-(8) MapPartitionsRDD[2] at map at <console>:21 [Disk Serialized 1x Replicated] // | ParallelCollectionRDD[1] at parallelize at <console>:21 [Disk Serialized 1x Replicated]
-
checkpoint
:val indChk = rdd.mapValues(_ > 4) indChk.checkpoint // indChk.toDebugString // (8) MapPartitionsRDD[11] at mapValues at <console>:24 [] // | ShuffledRDD[3] at reduceByKey at <console>:21 [] // +-(8) MapPartitionsRDD[2] at map at <console>:21 [] // | ParallelCollectionRDD[1] at parallelize at <console>:21 [] indChk.count // 3 indChk.toDebugString // (8) MapPartitionsRDD[11] at mapValues at <console>:24 [] // | ReliableCheckpointRDD[12] at count at <console>:27 []
Como puede ver en el primer caso, el linaje se conserva incluso si los datos se obtienen del caché.
Significa que los datos se pueden volver a calcular desde cero si se pierden algunas particiones de
indCache
.
En el segundo caso, el linaje se pierde completamente después del punto de control e
indChk
ya no lleva la información necesaria para reconstruirlo.
checkpoint
, a diferencia de la
cache
/
persist
se calcula por separado de otros trabajos.
Es por eso que RDD marcado para la comprobación debe ser almacenado en caché:
Se recomienda encarecidamente que este RDD se conserve en la memoria, de lo contrario, guardarlo en un archivo requerirá una recalculación.
Finalmente, los datos
SparkContext
son persistentes y no se eliminan después de que se destruye
SparkContext
.
Con respecto al almacenamiento de datos,
SparkContext.setCheckpointDir
utilizado por
RDD.checkpoint
requiere la ruta
DFS
si se ejecuta en modo no local.
De lo contrario, también puede ser un sistema de archivos local.
localCheckpoint
y
persist
sin replicación debe utilizar el sistema de archivos local.
Nota :
La comprobación de puntos RDD es un concepto diferente al de un chekpointing en Spark Streaming. El primero está diseñado para abordar el problema del linaje, el último tiene que ver con la confiabilidad de la transmisión y la recuperación de fallas.
Si verifica la parte relevante de la documentación , se trata de escribir datos en un sistema confiable, por ejemplo, HDFS. Pero depende de usted decirle a Apache Spark dónde escribir su información de punto de control.
Por otro lado, persistir se trata de almacenar en caché los datos principalmente en la memoria, como lo indica claramente esta parte de la documentación .
Entonces, depende del directorio que le haya dado a Apache Spark.