Creo que la pregunta se formularía mejor como:
¿Cuándo necesitamos llamar al caché o persistir en un RDD?
Los procesos de chispa son flojos, es decir, no pasará nada hasta que se requiera. Para responder rápidamente a la pregunta, después de val textFile = sc.textFile("/user/emp.txt")
emitir, no sucede nada con los datos, solo HadoopRDD
se construye un, utilizando el archivo como fuente.
Digamos que transformamos esos datos un poco:
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
Nuevamente, nada le sucede a los datos. Ahora hay un nuevo RDD wordsRDD
que contiene una referencia testFile
y una función que se aplicará cuando sea necesario.
Solo cuando se ejecuta una acción sobre un RDD, como wordsRDD.count
, se ejecutará la cadena RDD, llamada linaje . Es decir, los datos, desglosados en particiones, serán cargados por los ejecutores del clúster Spark, flatMap
se aplicará la función y se calculará el resultado.
En un linaje lineal, como el de este ejemplo, cache()
no es necesario. Los datos se cargarán a los ejecutores, se aplicarán todas las transformaciones y finalmente count
se computarán, todo en la memoria, si los datos se ajustan en la memoria.
cache
es útil cuando el linaje del RDD se ramifica. Digamos que desea filtrar las palabras del ejemplo anterior en un recuento de palabras positivas y negativas. Podrías hacer esto así:
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Aquí, cada rama emite una recarga de los datos. Agregar una cache
declaración explícita asegurará que el procesamiento realizado previamente se conserve y reutilice. El trabajo se verá así:
val textFile = sc.textFile("/user/emp.txt")
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
wordsRDD.cache()
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Por esa razón, cache
se dice que 'rompe el linaje' ya que crea un punto de control que puede reutilizarse para su posterior procesamiento.
Regla de oro: se usa cache
cuando el linaje de su RDD se ramifica o cuando un RDD se usa varias veces como en un bucle.