在Spark中拆分之前或之后缓存RDD?

时间:2016-05-31 07:17:52

标签: scala caching apache-spark split

我正在一个相当大的RDD org.apache.spark.mllib.recommendation.ALS上训练rdd模型。我想选择一个体面的正则化超参数,以便我的模型不会过度(或不足)。为此,我将rdd(使用randomSplit)拆分为火车集和测试集,并使用一组已定义的超参数进行交叉验证。

由于我在交叉验证中多次使用火车并测试RDD,因此在某些时候cache()数据似乎很自然,以便加快计算速度。但是,我的Spark知识非常有限,我想知道这两个选项中哪一个更好(以及为什么):

  1. 在拆分之前缓存初始RDD rdd,即:

    val train_proportion = 0.75
    val seed = 42
    rdd.cache()
    val split = rdd.randomSplit(Array(train_proportion, 1 - train_proportion), seed)
    val train_set = split(0)
    val test_set = split(1)
    
  2. 在拆分初始RDD后缓存traintest RDD:

    val train_proportion = 0.75
    val seed = 42
    val split = rdd.randomSplit(Array(train_proportion, 1 - train_proportion), seed)
    val train_set = split(0).cache()
    val test_set = split(1).cache()
    
  3. 我的推测是选项1更好,因为randomSplit也会受益于rdd被缓存的事实,但我不确定它是否会对(多个)产生负面影响关于选项2,将来访问train_settest_setThis answer似乎证实了我的直觉,但没有得到任何反馈,所以我想通过在这里询问来确定。

    你怎么看?更重要的是:为什么?

    请注意我已在Spark群集上运行实验,但这些天它经常很忙,所以我的结论可能是错误的。我还检查了Spark文档,但没有找到我的问题的答案。

1 个答案:

答案 0 :(得分:0)

如果在拆分之前对RDD进行计算,那么最好先将其缓存,因为(根据我的经验),所有转换只运行一次并由缓存触发( )行动 我想split()cache()cache()是3个动作vs cache()split()2。 编辑:缓存不是动作。 事实上,我在其他similar questions around the web中找到了确认 编辑:澄清我的第一句话:DAG将对RDD执行所有转换,然后对其进行缓存,因此之后所做的所有事情都不需要再计算,尽管将再次计算分割部分。 总之,如果您在分割部分上操作比原始RDD本身更重的变换,您可能希望缓存它们。 (我希望有人能支持我)