最近,一位雇主问我一个问题,我们怎样才能防止Apache Spark变换的懒惰。我知道我们可以持久化并缓存RDD数据集但是如果发生故障,它会从父级重新计算。
任何人都可以解释一下,是否有任何功能可以阻止Spark转换的懒惰?
答案 0 :(得分:0)
按照设计,Spark 转换是懒惰的,您必须使用操作才能从中检索具体的值。
例如,以下转换将始终保持惰性:
JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(s -> s.length());
map
之类的功能会返回RDD,您只能通过执行reduce
等操作将这些RDD转换为实际值:
int totalLength = lineLengths.reduce((a, b) -> a + b);
没有标志会使map
返回具体值(例如,整数列表)。
最重要的是,您可以使用collect
或任何其他Spark动作来防止懒惰&#39;转型:
JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(s -> s.length());
List<Integer> collectedLengths = lineLengths.collect()
请记住,在大型数据集上使用collect
可能是一种非常糟糕的做法,使您的驱动程序内存不足。