Scala 在持久化RDD上执行多个操作时缓存RDD的工作方式
这个案子怎么办?在以下代码的情况下Scala 在持久化RDD上执行多个操作时缓存RDD的工作方式,scala,apache-spark,caching,rdd,Scala,Apache Spark,Caching,Rdd,这个案子怎么办?在以下代码的情况下 val logList: RDD[String] = ... val errorLogs = logList.filter(_.contains("Error")).persist() //first action val first100 = errorLogs.take(100) //second action val count = errorLogs.count Spark不会扫描所有日志,因为Park知道我们只对100行日志感兴趣。但是当我
val logList: RDD[String] = ...
val errorLogs = logList.filter(_.contains("Error")).persist()
//first action
val first100 = errorLogs.take(100)
//second action
val count = errorLogs.count
Spark不会扫描所有日志,因为Park知道我们只对100行日志感兴趣。但是当我们缓存这个RDD并对其调用多个操作时会发生什么呢?第一个操作只需要很少的记录,而后面的操作则需要转换整个RDD
当调用第一个操作时,它会缓存记录吗?或者,在调用第一个操作时,它是否只缓存第一个操作所需的部分记录?在这种情况下,Spark将只缓存收集100条记录所需的最小分区数(由于采用了实现,实际数目可能会更高)
只有第二个保证缓存所有记录。如何
缓存
工作:
和cache
是惰性的-如果未对标记为缓存数据的persist
RDD调用任何操作,则不会持久化。类似地,如果未计算分区,则不会持久化数据
持久化整个分区。它不能保存单个记录或部分分区。若数据被标记为缓存,并且分区至少被部分计算,Spark将对其进行完全计算并尝试持久化李>缓存
- 第一个
计算第一个分区。如果可以从第一个分区收集limit所需的所有记录,则作业完成limit
- 如果不是,Spark会增加由
计算的分区数。如果limit所需的所有记录都可以从这些分区中收集,则作业完成。否则,重复此步骤李>Spark.rdd.limit.scaleUpFactor
将至少缓存第一个分区。如果第一个分区不包含100条记录,它将计算并缓存后续分区,直到得到100条记录或计算完整的数据集val first100=errorLogs.take(100)
将评估所有分区,并尽可能缓存其余分区val count=errorLogs.count
的工作原理与val errorLogs=logList.filter(u.contains(“Error”)).take(100)
几乎完全相同。errorLogs.take(100)
的唯一影响是filter
可能需要评估更多数据。如果所有行都包含limit
,则结果与第一步相同 如果在前两个步骤之后运行,并且数据已完全缓存且未被逐出,则它将使用缓存中的数据错误
val errorLogs = logList.filter(_.contains("Error")).take(100)