我在Youtube上观看了一些有关Spark架构的视频。
尽管惰性求值、数据容错性以及良好的函数式编程概念是Resilience Distributed Datasets成功的原因,但一个令人担忧的因素是由于多个转换导致的内存开销,因为数据不可变性会导致内存开销。
如果我正确理解了这个概念,每个转换都会创建新的数据集,因此内存需求将增加相应的倍数。如果我的代码中使用了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和reduceByKey
。这是否意味着对于X大小的数据,我需要3倍的数据内存?我的理解正确吗?缓存RDD是唯一解决此问题的方法吗?
一旦我开始缓存,由于数据量大,可能会溢出到磁盘,因此性能会受到磁盘IO操作的影响。在这种情况下,Hadoop和Spark的性能可比吗?
编辑:
从答案和评论中,我已经了解了延迟初始化和管道过程。我的假设是X为初始RDD大小时需要3倍的内存不准确。
但是,是否可以将1个X RDD缓存在内存中并在管道中更新它?cache()如何工作?