无法更改RDD的存储级别

时间:2016-06-10 14:16:47

标签: scala apache-spark machine-learning recommendation-engine

以下Spark代码:

val model = ALS.trainImplicit(ratings = ratingsRDD,
                              rank = rank,
                              iterations = numIterations,
                              lambda = lambda,
                              alpha = alpha)  

model.productFeatures.cache()

val modelSubsetRDD = new MatrixFactorizationModel(
  rank = rank,
  userFeatures = model.productFeatures,
  productFeatures = model.productFeatures)

提出以下例外:

  

在分配了RDD后,无法更改RDD的存储级别   水平

StorageLevel.MEMORY_ONLY引发了同样的异常。

另一方面,以下代码正常运行:

    val model = ALS.trainImplicit(ratings = ratingsRDD,
                              rank = rank,
                              iterations = numIterations,
                              lambda = lambda,
                              alpha = alpha)  
    val modelSubsetRDD = new MatrixFactorizationModel(
      rank = rank,
      userFeatures = model.userFeatures,
      productFeatures = model.productFeatures)

    model.userFeatures.persist(StorageLevel.MEMORY_ONLY)
    model.productFeatures.persist(StorageLevel.MEMORY_ONLY)

注意到此时userFeaturesproductFeatures设置为两个不同的模型成员。但是,我不确定为什么会这样。

1 个答案:

答案 0 :(得分:1)

您可能会从代码中的其他位置获得一些持久性?在返回模型之前,不确定ALS.trainImplicit正在做什么。

调用cache()会将RDD存储在MEMORY_ONLY中,而调用persist则允许您更改缓存类型。所以我猜这个RDD已经在其他地方持久化了,你试图用cache()重新保存它,这就是问题所在。但是,使用persist更改持久性类型是完全可以接受的。

编辑:

请尝试以下代码:

val model = ALS.trainImplicit(ratings = ratingsRDD,
                              rank = rank,
                              iterations = numIterations,
                              lambda = lambda,
                              alpha = alpha)  
if(model.productFeatures.getStorageLevel() == StorageLevel.NONE)
    model.productFeatures.cache()

val modelSubsetRDD = new MatrixFactorizationModel(
  rank = rank,
  userFeatures = model.productFeatures,
  productFeatures = model.productFeatures)

这应避免您尝试缓存已缓存的内容(在内存或磁盘中)。