1. 程式人生 > 其它 >可擴充套件機器學習——Spark分散式處理

可擴充套件機器學習——Spark分散式處理

注:這是一份學習筆記,記錄的是參考文獻中的可擴充套件機器學習的一些內容,英文的PPT可見參考文獻的連結。這個只是自己的學習筆記,對原來教程中的內容進行了梳理,有些圖也是引用的原來的教程,若內容上有任何錯誤,希望與我聯絡,若內容有侵權,同樣也希望告知,我會盡快刪除。

可擴充套件機器學習系列主要包括以下幾個部分:

  • 概述
  • Spark分散式處理
  • 線性迴歸(linear Regression)
  • 梯度下降(Gradient Descent)
  • 分類——點選率預測(Click-through Rate Prediction)
  • 神經科學

二、Spark分散式處理

Spark圖示:

1、大資料問題

在傳統的資料處理問題中,通常是使用單機處理,隨著時代的發展,資訊科技也在不斷髮展,但是資料的增長速度已經遠遠超過了計算機計算速度。資料的增長如下圖所示:

在這樣的情況下,單機的環境就很難處理和儲存如此龐大的資料,唯一的解決方法就是利用龐大的叢集,分散式的儲存和處理這些資料。

2、分散式處理概述

下面以統計一篇文章中出現的單詞的次數為例,來介紹如何使用分散式的計算方法處理大資料。對於如下的一篇文章的單詞統計:

其中,一種方法是使用Hash表,在Hash表中,key為每一個單詞,Value為每個單詞出現的次數,如:

在上述的方法中,若資料集較好,則可以在單機的條件下很容易的得到處理,但是當資料量變得很大的時候,單機環境下不能處理所有的資料,此時,可以使用不同的機器對不同的文章進行統計,使用的依舊是Hash表的儲存形式,最後使用一臺機器對最終的結果進行彙總,具體過程如下圖所示:

在這樣的情況下也會存在問題,即最終的結果需要在一臺機器上完成,要是資料量很大,那麼第一需要的計算量比較大,第二,儲存空間會受到限制。為了解決第一個問題,可以在中間再增加一些計算層,如下圖所示:

但是依舊在最後需要在一臺機器上進行彙總,為了徹底解決上述的兩個問題,可以使用下述的分散式的計算方法:

其中,第一階段稱為Map,第二階段稱為Reduce,如下圖所示:

3、Map-Reduce的工作原理

上述的分散式計算便是Google的Map-Reduce的基本原理,這樣的基於叢集的計算模式需要解決兩個問題:

  • 如何在不同的機器上劃分工作。
  • 如何處理失敗的問題。

對於第一個問題,通常考慮網路,資料所在的位置,因為在不同的機器之間移動資料是一個很昂貴的工作。對於第二個問題,通常是重啟一個新的任務,如下圖所示:

對於比較慢的工作,通常也是重啟一個新的任務,如下圖所示:

綜上,可以看到分散式計算中的兩階段模式,即Map階段和Reduce階段,具體的處理流程如下圖所示:

如果任務較為複雜或者是需要迭代的過程,可以通過組合多個Map和Reduce過程來處理,如下圖:

但是Map-Reduce在處理資料的過程中時,需要大量的I/O操作,I/O操作需要佔據大量的處理時間。

4、Spark工作原理

隨著記憶體價格的下降,同時為了解決Map-Reduce在計算過程中的大量I/O操作,Spark的原則是將資料儘可能儲存在記憶體中(in-memory),因為記憶體的操作速度要快於外存的I/O速度。

如在Map-Reduce過程中的操作為:

而在Spark中,操作的圖為:

在過程中,將中間過程的資料儲存在記憶體中,這樣便會大大降低了I/O的時間。

5、RDD

RDD(Resilient Distributed Dataset)稱為彈性分散式資料集,是Spark的核心概念。一個RDD代表一系列的“記錄”。這些記錄被分配或被分割槽到一個叢集的多個節點上。Spark中的RDD具有容錯性,即當某個節點或任務失敗時,RDD會在餘下的節點上自動重建,以便任務能最終完成。

6、Spark的工具

Spark的工具主要包括:

  • Spark SQL
  • Spark Streaming
  • MLlib
  • GraphX

7、Spark與MapReduce之間的差異

8、Spark實踐

Spark的安裝可見《Spark機器學習》,單機版的只需要下載與解壓縮即可。在課程中,使用的是Python的介面:pyspark

對於Spark的使用,可以參見Spark程式設計指南——Python版

若需要PDF版本,請關注我的新浪部落格@趙_志_勇,私信你的郵箱地址給我。

參考文獻

scalable-machine-learning