我已经开始在一个小型集群上使用Spark来制作推荐引擎。
目的是推荐用户可能依赖于他们已经购买该书的事实的书籍。
到目前为止,我有两个问题:
第一个是如果数据集包含超过5Mln的观察值,以下代码将生成OutOfMemory / StackOverFlow错误。
val rec_model: MatrixFactorizationModel = ALS.trainImplicit(ratings,RANK,ITERATIONS,LAMBDA,ALPHA)
val recs = rec_model.recommendProductsForUsers(N_ITEMS_TO_RECOMMEND)
作为一种解决方法,我在较小的数据集中拆分用户,现在推荐引擎似乎正常工作,但输出包含用户已购买的书籍的建议。如何避免这种情况?
更新1:
我在SparkContext中添加了checkpoint目录,现在我的ALS模型训练代码看起来像这样,现在应该阻止OOME:
val rec_model: MatrixFactorizationModel =
new ALS()
.setCheckpointInterval(5)
.setRank(RANK)
.setIterations(ITERATIONS)
.setLambda(LAMBDA)
.setAlpha(ALPHA)
.setImplicitPrefs(true)
.run(rdd)