1. 程式人生 > >Spark技術在京東智能供應鏈預測的應用——按照業務進行劃分,然後利用scikit learn進行單機訓練並預測

Spark技術在京東智能供應鏈預測的應用——按照業務進行劃分,然後利用scikit learn進行單機訓練並預測

rdd 解決 難點 新的 訓練 模型訓練 ati 情況 明顯

3.3 Spark在預測核心層的應用

我們使用Spark SQL和Spark RDD相結合的方式來編寫程序,對於一般的數據處理,我們使用Spark的方式與其他無異,但是對於模型訓練、預測這些需要調用算法接口的邏輯就需要考慮一下並行化的問題了。我們平均一個訓練任務在一天處理的數據量大約在500G左右,雖然數據規模不是特別的龐大,但是Python算法包提供的算法都是單進程執行。我們計算過,如果使用一臺機器訓練全部品類數據需要一個星期的時間,這是無法接收的,所以我們需要借助Spark這種分布式並行計算框架來將計算分攤到多個節點上實現並行化處理。

我們實現的方法很簡單,首先需要在集群的每個節點上安裝所需的全部Python包,然後在編寫Spark程序時考慮通過某種規則將數據分區,比如按品類維度,通過groupByKey操作將數據重新分區,每一個分區是一個樣本集合並進行獨立的訓練,以此達到並行化。

流程如下圖所示:

技術分享

偽碼如下:

技術分享

repartitionBy方法即設置一個重分區的邏輯返回(K,V)結構RDD,train方法是訓練數據,在train方法裏面會調用Python算法包接口。saveAsPickleFile是Spark Python獨有的一個Action操作,支持將RDD保存成序列化後的sequnceFile格式的文件,在序列化過程中會以10個一批的方式進行處理,保存模型文件非常適合。

雖然原理簡單,但存在著一個難點,即以什麽樣的規則進行分區,key應該如何設置。為了解決這個問題我們需要考慮幾個方面,第一就是哪些數據應該被聚合到一起進行訓練,第二就是如何避免數據傾斜。

針對第一個問題我們做了如下幾點考慮:

  • 被分在一個分區的數據要有一定的相似性,這樣訓練的效果才會更好,比如按品類分區就是個典型例子。
  • 分析商品的特性,根據特性的不同選擇不同的模型,例如高銷商品和低銷商品的預測模型是不一樣的,即使是同一模型使用的特征也可能不同,比如對促銷敏感的商品就需要更多與促銷相關特征,相同模型相同特征的商品應傾向於分在一個分區中。

針對第二個問題我們采用了如下的方式解決:

  • 對於數據量過大的分區進行隨機抽樣選取。
  • 對於數據量過大的分區還可以做二次拆分,比如圖書小說這個品類數據量明顯大於其他品類,於是就可以分析小說品類下的子品類數據量分布情況,並將子品類合並成新的幾個分區。
  • 對於數據量過小這種情況則需要考慮進行幾個分區數據的合並處理。

總之對於後兩種處理方式可以單獨通過一個Spark任務定期運行,並將這種分區規則保存。

摘自:http://www.infoq.com/cn/articles/application-of-spark--in-jingdong-supply-chain-forecasting

Spark技術在京東智能供應鏈預測的應用——按照業務進行劃分,然後利用scikit learn進行單機訓練並預測