Transformações Spark + Scala, sobrecarga de imutabilidade e consumo de memória

Passei por alguns vídeos no Youtube sobreFaísca arquitetura.

Embora a avaliação preguiçosa, a resiliência da criação de dados em caso de falhas, bons conceitos de programação funcional sejam razões para o sucesso dos conjuntos de dados distribuídos Resilenace, um fator preocupante é a sobrecarga de memória devido a váriostransformações resultando em sobrecarga de memória devido à imutabilidade dos dados.

Se eu entendo o conceito corretamente, todas as transformações estão criando novos conjuntos de dados e, portanto, os requisitos de memória passam por isso muitas vezes. Se eu usar 10 transformações no meu código, 10 conjuntos de conjuntos de dados serão criados e meu consumo de memória aumentará 10 vezes.

por exemplo.

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

O exemplo acima tem três transformações:flatMap, map and reduceByKey. Isso implica que eu preciso de memória 3X de dados para tamanho X de dados?

Meu entendimento está correto? O cache do RDD é a única solução para solucionar esse problema?

Quando eu inicio o cache, ele pode se espalhar para o disco devido ao tamanho grande e o desempenho seria afetado devido às operações de E / S do disco. Nesse caso, o desempenho do Hadoop e Spark são comparáveis?

EDITAR:

A partir da resposta e dos comentários, entendi o processo lento de inicialização e pipeline. Minha suposição de 3 X de memória em que X é o tamanho inicial do RDD não é precisa.

Mas é possível armazenar em cache 1 X RDD na memória e atualizá-lo através do pipleline? Como funciona o cache ()?

questionAnswers(2)

yourAnswerToTheQuestion