Spark:了解DAG并强制转换

时间:2016-12-09 09:34:57

标签: scala caching apache-spark

Hello stackoverflow社区。

我请求你的帮助,理解我的想法是否正确,或者我在Spark工作中缺少一些要点。

我目前有两个要减去的rdds。 两个rdd都在同一个父RDD上构建为不同的转换。

首先,父RDD在获得后被缓存:

val fatherRdd = grandFather.repartition(n).mapPartitions(mapping).cache

然后转换了两个rdds。 一个是(伪代码):

son1= rddFather.filter(filtering_logic).map(take_only_key).distinct

另一个是:

son2= rddFather.filter(filtering_logic2).map(take_only_key).distinct

然后减去两个儿子只获得son1中的键:

son1.subtract(son2)

我希望转换的顺序如下:

  1. mapPartitions
  2. 重新分区
  3. 缓存
  4. 然后,从缓存数据开始,在两个rdds上映射过滤器映射,然后减去。

    这没有发生,我看到的是并行运行的两个distinct操作,显然没有利用缓存的好处(没有跳过的任务),并且采用几乎相同的计算时间。 在从火花ui采取的dag的图象下面。 enter image description here

    你对我有什么建议吗?

1 个答案:

答案 0 :(得分:3)

你的观察是正确的。 RDD上的转换是惰性的,因此在第一次实际计算RDD之后会发生缓存。

如果您在父RDD上调用操作,则应计算并缓存该操作。然后,您的后续操作将对缓存的数据进行操作。