假设我有一个包含10个执行程序的集群。我有一个如下代码:
val tokenized = sc.textFile(args(0)).flatMap(_.split(' ')).map((_, 1))
val wordCounts = tokenized.reduceByKey(_ + _)
文件非常大 - 比集群的总mem高。说,我设置了分区号100,所以每个分区都可以在exec中加载,我有100个任务在加载和flatmap。我的问题是存储了标记化的rdd / partition(存储的中间结果), - 我没有使用cache()
?我认为火花会将分区溢出到磁盘中。在这种情况下,具有缓存的代码有什么不同?
val tokenized = sc.textFile(args(0)).flatMap(_.split(' ')).map((_, 1)).cache()
val wordCounts = tokenized.reduceByKey(_ + _)
即使我缓存了这个标记化的rdd,火花仍然会洗牌吗?
答案 0 :(得分:0)
我认为spark会将分区溢出到磁盘中。
那是对的。如果需要,Spark会将数据存储在本地文件系统中。
缓存的不同(...)是什么?
不多。缓存不会影响第一次执行。它只会尝试存储数据,以便以后可以重复使用。
即使我缓存了这个标记化的rdd,火花仍然会洗牌吗?
是的,它会的。缓存不会替换混乱,虽然缓存可以在这里过时,因为shuffle会自动缓存临时文件。