即使Lazy评估,在出现故障时数据创建的弹性,良好的函数式编程概念是Resilenace分布式数据集成功的原因,但令人担忧的一个因素是由于多次转换导致的内存开销导致数据不可变导致的内存开销.
如果我正确地理解了这个概念,那么每个转换都会创建新的数据集,因此内存需求将会多次消失.如果我在代码中使用10个转换,将创建10组数据集,并且我的内存消耗将增加10倍.
例如
val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")
Run Code Online (Sandbox Code Playgroud)
以上示例有三个转换:flatMap, map and reduceByKey
.这是否意味着对于X大小的数据我需要3X数据内存?
我的理解是否正确?缓存RDD只是解决此问题的解决方案吗?
一旦我开始缓存,它可能会溢出到磁盘,因为大尺寸和性能会因磁盘IO操作而受到影响.在这种情况下,Hadoop和Spark的性能是否相当?
编辑:
从答案和评论中,我已经理解了延迟初始化和管道流程.我假设3 X内存,其中X是初始RDD大小不准确.
但是有可能在内存中缓存1 X RDD并通过pipleline更新它吗?cache()如何工作?