[英]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.