Преобразования Spark + Scala, неизменность и потребление памяти
Я просмотрел несколько видео на Youtubeискра архитектура.
Несмотря на то, что ленивая оценка, устойчивость создания данных в случае сбоев, хорошие концепции функционального программирования являются причинами успеха распределенных наборов данных Resilenace, одним из факторов, вызывающих беспокойство, является нехватка памяти из-за множествапреобразования приводя к накладным расходам памяти из-за неизменности данных.
Если я правильно понимаю эту концепцию, Каждое преобразование создает новые наборы данных, и, следовательно, требования к памяти уйдут к этому много раз. Если я использую в своем коде 10 преобразований, будет создано 10 наборов данных, и потребление памяти увеличится в 10 раз.
например
val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")
Приведенный выше пример имеет три преобразования:flatMap, map and reduceByKey
, Означает ли это, что мне нужно 3X памяти данных для размера X данных?
Правильно ли мое понимание? Является ли кэширование RDD единственным решением для решения этой проблемы?
Как только я начинаю кешировать, он может перетекать на диск из-за большого размера, а производительность будет зависеть от операций ввода-вывода на диске. В таком случае производительность Hadoop и Spark сопоставима?
РЕДАКТИРОВАТЬ:
Из ответа и комментариев я понял ленивую инициализацию и процесс конвейера. Мое предположение о 3 X памяти, где X является исходным размером RDD, не является точным.
Но возможно ли кешировать 1 X RDD в памяти и обновлять его по пиплайну? Как работает cache ()?