加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 加速Spark MLLib中大型数据集的协同过滤

发布时间:2020-12-16 18:47:34 所属栏目:安全 来源:网络整理
导读:我正在使用MLlib的矩阵分解来向用户推荐项目.我有一个很大的隐式交互矩阵,M = 2000万用户和N = 50k项目.在训练模型之后,我想获得针对每个用户的推荐的简短列表(例如,200).我在MatrixFactorizationModel中尝试过recommendedProductsForUsers,但它非常慢(跑了9
我正在使用MLlib的矩阵分解来向用户推荐项目.我有一个很大的隐式交互矩阵,M = 2000万用户和N = 50k项目.在训练模型之后,我想获得针对每个用户的推荐的简短列表(例如,200).我在MatrixFactorizationModel中尝试过recommendedProductsForUsers,但它非常慢(跑了9个小时但距离完成还很远.我正在测试50个执行器,每个都有8g内存).这可能是预期的,因为recommendedProductsForUsers需要计算所有M * N个用户项交互并获得每个用户的顶部.

我会尝试使用更多的执行程序,但是从我在Spark UI上的应用程序细节中看到的,我怀疑它可以在几小时或一天内完成,即使我有1000个执行程序(在9小时之后它仍然在平面图中这里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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读