我对Spark的ALS推荐有问题。我想使用以下代码预测我系统中的foreach用户
Test,_id,bugseverity
Result1,987600234565ade,major
Result1,987600234565ade,major
Result1,987600234565ade,major
Result2,987600234465ade,minor
Result2,987600234465ade,minor
Result2,987600234465ade,minor
Result3,9876002399999de,minor
Result3,9876002399999de,minor
Result3,9876002399999de,minor
这段代码的问题在于,它并没有真正并行化。 我更喜欢像
这样的东西users = ... # RDD definition here
als_model = ... # trained ALS model
recommendations = [als_model.recommendProducts(u, 5) for u in users.collect()]
不幸的是,这是不可能的,因为我不能在Spark动作中使用als_model。
我的另一个选择是执行
recommendations = users.map(lambda u: als_model.recommendProducts(u, 5))
这将返回所有用户的前1000个产品(这是我试图实现的;)) 但是这种方法占用大量内存,最后由于堆空间溢出而导致GC错误。
有没有人知道如何尽可能高效地解决这个问题?
答案 0 :(得分:0)
来自“Spark中的高级分析”一书,主要基于Spark 1.3(第56页):
然而,目前,Spark MLlib的ALS实施并没有 支持向所有用户推荐的方法。有可能 一次向一个用户推荐,尽管每个用户都会推出一个 短暂的分布式作业需要几秒钟。
还有一个例子可以与100个用户一起使用,并且它使用你想要实现的相同循环,因此目前没有更好的方法来实现它。
另请注意,recommendProducts(...)
仍然以分布式方式运行,因此理论上您在此处失去的性能是因为作业非常短并且经常提交和收集。因此,与较小的工作相比,一项重要工作需要更少的协调。