簡體   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