繁体   English   中英

加快Spark MLLib中大型数据集的协同过滤

[英]Speed up collaborative filtering for large dataset in Spark MLLib

我正在使用MLlib的矩阵分解来向用户推荐项目。 我有一个很大的隐式交互矩阵,M = 2000万用户和N = 50k项目。 在训练模型之后,我想获得每个用户的推荐列表(例如200)。 我在MatrixFactorizationModel尝试过recommendProductsForUsers ,但它非常慢(跑了9个小时,但距离完成还很远。我正在测试50个执行器,每个都有8g内存)。 这可能是预期的,因为recommendProductsForUsers需要计算所有M*N用户项交互并获得每个用户的顶部。

我会尝试使用更多的执行程序但是从我在Spark UI上的应用程序细节中看到的,我怀疑它可以在几小时或一天内完成,即使我有1000个执行程序(在9小时之后它仍然在这里的flatmap https:// github .com / apache / spark / blob / master / mllib / src / main / scala / org / apache / spark / mllib / recommendation / MatrixFactorizationModel.scala#L279-L289,10000个总任务,只有~200个完成)还有其他 ?除了增加执行者数量之外,我可以调整哪些内容以加快推荐流程?

这是示例代码:

val data = input.map(r => Rating(r.getString(0).toInt, r.getString(1).toInt, r.getLong(2))).cache
val rank = 20
val alpha = 40
val maxIter = 10
val lambda = 0.05
val checkpointIterval = 5
val als = new ALS()
    .setImplicitPrefs(true)
    .setCheckpointInterval(checkpointIterval)
    .setRank(rank)
    .setAlpha(alpha)
    .setIterations(maxIter)
    .setLambda(lambda)
val model = als.run(ratings)
val recommendations = model.recommendProductsForUsers(200)
recommendations.saveAsTextFile(outdir)

@Jack Lei:你找到了答案吗? 我自己尝试了一些东西,但只是帮了一点。

例如:我试过了

javaSparkContext.setCheckpointDir("checkpoint/");

这有助于避免它之间的重复计算。

还尝试为每个Executor和开销火花存储器添加更多内存

--conf spark.driver.maxResultSize=5g --conf spark.yarn.executor.memoryOverhead=4000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM