2016-02-15 110 views
1

我對Spark的ALS建議有問題。我想預測我的系統中的用戶使用以下代碼的產品Spark ALS Model廣播

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)) 

不幸的是這是不可能的,因爲我不能使用星火行動的內部als_model。

對我的另一種選擇是執行

als_model.recommendProductsForUsers(1000) 

這將返回前1000個產品爲所有用戶(這是我儘量做到;)) 但這種方法消耗的方式來過多內存,並在結束我得到一個GC錯誤,因爲堆空間溢出。

有沒有人有一個想法如何儘可能有效地解決這個問題?

+0

你正在使用哪種火花版本? – eliasah

回答

0

從書「高級分析中的星火」,這是主要基於星火1.3(第56頁):

目前,然而,星火MLlib的ALS執行不 支持推薦的方法給所有用戶。一次向一個用戶推薦 是可能的,儘管每個用戶都會啓動短暫分散的作業,需要幾秒鐘的時間。

還有一個例子,它有100個用戶,它使用相同的循環,你試圖實現,所以目前沒有更好的方法來做到這一點。

另請注意,recommendProducts(...)仍然以分佈式方式運行,因此理論上這裏丟失的性能是因爲作業非常短並且經常提交和收集。因此,一項大工作需要較少的協調。

+0

我的問題是,這太慢了。我有50萬用戶,未來還會有更多。你有什麼想法,爲什麼該方法推薦產品爲用戶導致GC錯誤?這種方法似乎並行工作,速度會更快。 – itsme

+0

因爲您的模型已經準備好了,所以應該仍然可以正常工作。現在需要多少錢?你確定你使用過緩存嗎? –

+0

現在需要8GB RAM,並且崩潰。我的本地機器上沒有更多的RAM來測試它。但它應該是足夠的,因爲它不是那麼多的數據(500.000用戶,1000產品,2.500.000評級) 你是什麼意思與緩存? – itsme