Python 火花ALS模型广播

Python 火花ALS模型广播,python,apache-spark,pyspark,recommendation-engine,Python,Apache Spark,Pyspark,Recommendation Engine,我对Spark的推荐有问题。我想使用以下代码预测系统中的每个用户的产品 users = ... # RDD definition here als_model = ... # trained ALS model recommendations = [als_model.recommendProducts(u, 5) for u in users.collect()] 这段代码的问题是,它没有真正并行化。 我想要像这样的东西 recommendations = users.map(lambda

我对Spark的推荐有问题。我想使用以下代码预测系统中的每个用户的产品

users = ... # RDD definition here
als_model = ... # trained ALS model
recommendations = [als_model.recommendProducts(u, 5) for u in users.collect()]
这段代码的问题是,它没有真正并行化。 我想要像这样的东西

recommendations = users.map(lambda u: als_model.recommendProducts(u, 5))
不幸的是,这是不可能的,因为我不能在Spark动作中使用als_模型

我的另一个选择是执行

als_model.recommendProductsForUsers(1000)
这将为所有用户返回前1000个产品(这就是我试图实现的;) 但是这个方法消耗了大量内存,最后由于堆空间溢出,我得到了一个GC错误

有人知道如何尽可能有效地解决这个问题吗?

摘自《Spark中的高级分析》,该书主要基于Spark 1.3(第56页):

然而,目前Spark MLlib的ALS实现还没有实现 支持向所有用户推荐的方法。有可能 一次向一个用户推荐,尽管每个用户都会启动 只需几秒钟的短期分布式作业

还有一个例子,它使用了100个用户,并且使用了与您尝试实现的相同的循环,因此目前没有更好的方法来实现

还要注意的是,
recommendProducts(…)
仍然以分布式方式运行,因此从理论上讲,您在这里损失的性能是因为作业非常短,提交和收集非常频繁。因此,一项大型工作所需的协调比小型工作所需的协调要少。

摘自《Spark中的高级分析》一书,该书主要基于Spark 1.3(第56页):

然而,目前Spark MLlib的ALS实现还没有实现 支持向所有用户推荐的方法。有可能 一次向一个用户推荐,尽管每个用户都会启动 只需几秒钟的短期分布式作业

还有一个例子,它使用了100个用户,并且使用了与您尝试实现的相同的循环,因此目前没有更好的方法来实现


还要注意的是,
recommendProducts(…)
仍然以分布式方式运行,因此从理论上讲,您在这里损失的性能是因为作业非常短,提交和收集非常频繁。因此,一项大的工作需要的协调性比更多的小工作要少。

我的问题是,这太慢了。我有50万用户,将来还会有更多。你知道为什么推荐产品的方法会导致GC错误吗?这种方法看起来并行性更强,速度更快。由于您的模型已经准备好了,这种方法仍然可以正常工作。现在要多少钱?你确定你使用了缓存吗?它现在需要8GB的RAM,并且会崩溃。我没有更多的内存在我的本地机器上测试它。但这应该足够了,因为它没有那么多的数据(50万用户,1000种产品,2.500万评级)。缓存意味着什么?使用
persist()
cache()
。我的问题是,这太慢了。我有50万用户,将来还会有更多。你知道为什么推荐产品的方法会导致GC错误吗?这种方法看起来并行性更强,速度更快。由于您的模型已经准备好了,这种方法仍然可以正常工作。现在要多少钱?你确定你使用了缓存吗?它现在需要8GB的RAM,并且会崩溃。我没有更多的内存在我的本地机器上测试它。但这应该足够了,因为它没有那么多的数据(500.000用户,1000种产品,2.500.000评级)。缓存意味着什么?使用
persist()
cache()
。您使用的是哪个spark版本?您使用的是哪个spark版本?