Spark + Scala transformaciones, inmutabilidad y gastos generales de consumo de memoria

He revisado algunos videos en Youtube sobreChispa - chispear arquitectura.

Aunque la evaluación diferida, la capacidad de recuperación de la creación de datos en caso de fallas, los buenos conceptos de programación funcional son razones para el éxito de los conjuntos de datos distribuidos de Resilenace, un factor preocupante es la sobrecarga de memoria debido a múltiplestransformaciones resultando en gastos generales de memoria debido a la inmutabilidad de los datos.

Si entiendo el concepto correctamente, cada transformación está creando nuevos conjuntos de datos y, por lo tanto, los requisitos de memoria desaparecerán muchas veces. Si uso 10 transformaciones en mi código, se crearán 10 conjuntos de conjuntos de datos y mi consumo de memoria aumentará en 10 veces.

p.ej.

val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
                 .map(word => (word, 1))
                 .reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")

El ejemplo anterior tiene tres transformaciones:flatMap, map and reduceByKey. ¿Implica que necesito 3 veces la memoria de datos para un tamaño X de datos?

¿Es correcto mi entendimiento? ¿Caching RDD es la única solución para abordar este problema?

Una vez que empiezo a almacenar en caché, puede extenderse al disco debido a su gran tamaño y el rendimiento se vería afectado debido a las operaciones de disco IO. En ese caso, ¿el rendimiento de Hadoop y Spark es comparable?

EDITAR:

A partir de la respuesta y los comentarios, he entendido el proceso de inicialización y canalización diferida. Mi suposición de 3 X de memoria donde X es el tamaño inicial de RDD no es precisa.

Pero, ¿es posible almacenar en caché 1 X RDD en la memoria y actualizarlo sobre la línea de pipleline? ¿Cómo funciona cache ()?

Respuestas a la pregunta(2)

Su respuesta a la pregunta