2017-04-21 71 views
1

我在計算如何在現實生活環境中使用Spark的機器學習功能時遇到一些困難。Apache Spark和機器學習 - 在生產中使用

我想要做的是以下幾點:

  • 使用筆記本
  • 使用REST API服務於學習的模型開發新毫升模式(類似POST -/API/V1 /爲MyModel /預測)

咱們說毫升訓練過程由筆記本電腦來處理,一旦模型的要求得到滿足它保存到一個文件HDFS,通過火花應用程序加載後

我知道我可以編寫一個長時間運行的spark應用程序,它暴露了api並在我的spark集羣上運行它,但我不認爲這是一種可伸縮的方法,因爲即使數據轉換和ml函數在worker節點中,http/api相關的代碼仍然會在一個節點上運行,那麼spark-submit中的代碼將被調用(如果我錯了,請糾正我)。

另一種方法是使用相同的長時間運行的應用程序,但在本地獨立羣集中。我可以根據需要多次部署相同的應用程序,並將負載均衡器放在它前面。通過這種方法,http/api部分處理得很好,但是spark部分完全沒有使用集羣功能(由於事實上它應該只對每個請求執行一次預測,所以這不成問題)

還有第三種方法是使用SparkLauncher,它將火花作業包裝在單獨的jar中,但我不太喜歡飛行罐,並且很難檢索預測的結果(隊列可能或hdfs)

所以基本上問題是:通過rest api消耗Spark的ml模型的最佳方法是什麼?

謝謝

回答

1

你有三個選擇

通過火花API spark-jobserver
  1. 觸發批ML工作,根據客戶要求
  2. 通過調度 airflow
  3. 觸發批ML工作,輸出寫到DB,暴露DB通過休息到客戶端
  4. 保持structured-streaming/recursive function在掃描輸入數據源,更新/追加DB不斷,通過休息暴露DB客戶

如果你有single prediction per request,你的數據輸入是不斷更新的,我建議選擇3,這將在任何時候都變換near-real-time數據,和客戶端將有持續訪問到output,可以在新的數據是由經休息或sns發送notification完成通知client,你可以保持非常小spark集羣,將處理數據採集和規模rest serviceDB根據請求/數據量(負載均衡)

如果y ou預計數據源定期更新的罕見請求讓我們每天說一次,選項12將適用,因爲您可以啓動更大的羣集並在完成時將其關閉。

希望它有幫助。

+0

選項1和2都需要預測作業捆綁在一個自包含的jar中。這種方法帶回了舊的依賴性地獄,我想避免它,並且在部署和維護應用程序時引入了很多困難。 –

+0

選項2.你也可以通過'zeppelin.apache.org'啓動調度程序,雖然筆記本通常對於'production'不可靠,但是你仍然需要管理依賴關係:不管是否使用筆記本,建立你自己的集羣'dataproc如果你現在需要共享它,你總是可以到'databricks'來獲得可靠和易於管理的''google'雲'和'https:// github.com/InsightDataScience/pegasus'或'emr' noteboks,這將適用於您的公司調度程序 –

+0

我會使用筆記本電腦只用於模型開發,一旦模型已經過培訓並導出到hdfs筆記本電腦的工作完成 –