Spark分散式運算的演進:RDD、Spark DataFrame、SparkSQL

在大數據時代,為了應付大量資料所帶來的龐大運算需求,單一電腦的運算能量不足,必須靠多台電腦組成分散式運算群集。

Apache Spark是開放原始碼的叢集運算框架,由加州大學柏克萊分校的AMPLab開發。Spark是一個彈性的運算框架,適合做Spark Streaming資料流處理、Spark SQL互動分析、ML Lib機器學習等應用,因此Spark可成為一個用途廣泛的大數據運算平台。

Spark從1.0至2.0分散式運算的演進,主要有3 種方式: RDD 、Spark DataFrame與Spark SQL。其目的是讓分散式運算更快速,使用更容易。

Spark的核心RDD

Spark的核心是RDD(Resilient Distributed Dataset)彈性分散式資料集,是由AMPLab實驗室所提出的概念,屬於一種分散式的記憶體。Spark主要優勢是來自RDD本身的特性。RDD能與其他系統相容,可以匯入外部儲存系統的資料集,例如:HDFS、HBase或其他Hadoop 資料來源。

Spark RDD分散式運算

Spark RDD分散式運算,架構如下圖,cluster群集中包含多台Worker Node電腦。 SparkContext是Spark應用程式入口,執行時會將資料儲存在RDD記憶體中,並透過Cluster Manager將RDD自動分為多個partition,分別在不同的Worker Node電腦中執行,執行結果再彙整回SparkContext。

Spark RDD分散式運算適合機器學習演算法

Spark允許用戶將資料載入至cluster叢集記憶體內儲存,並多次重覆運算,非常適合用於機器學習演算法。尤其需要反覆操作的次數越多,所需讀取的資料量越大,則越能看出Spark的效能。Spark在記憶體內執行程式,運算速度能比Hadoop MapReduce的運算速度快上100倍,即便是執行程式於硬碟時Spark也能快上10倍速度。特別適合需要反覆運算的機器學習演算法。

Spark RDD 的運算類型

RDD的運算可分為:
  • 「轉換」Transformation運算:RDD執行「轉換」運算會產生另外一個RDD。但是由於RDD的lazy load特性,不會立刻實際執行。 
  • 「動作」Action運算: RDD執行「動作」運算時,會立刻實際執行,並且連同之前的「轉換」運算一併執行。 
  • 持久化」Persistence:對於那些會重複使用的RDD,可以將RDD「持久化」在記憶體中做為後續使用,以加快執行效能。 

Spark RDD lazy load機制

如下圖:輸入資料執行「轉換1」運算產生RDD1,再執行「轉換2」運算產生RDD2,再執行「轉換3」運算產生RDD3,都不會馬上執行。一直到RDD3 執行「動作1」運算,此時才會實際執行:「轉換1」+「轉換2」+「轉換3」+「動作1」,產生輸出資料1。

lazy load的機制(懶惰就是聰明)

使用lazy load的機制的好處是,可以進行執行最佳化。例如:你要從一個很大的資料檔案,讀取資料並篩選欄位,但是最後只需要顯示前10筆資料。 
  • 如果沒有lazy load的機制,就必須讀取整個檔案,再篩選欄位,最後顯示前10筆資料,會花費很多運算時間與記憶體。 
  • 但是有了lazy load的機制,由於事先知道所有「轉換」+「動作」,系統知道只需要顯示10筆資料,所以只須讀取部分資料,篩選欄位後,就可以顯示10筆資料,節省很多運算時間與記憶體。
另外lazy load的機制的好處是,因為Spark必須在記憶體中執行運算,可是記憶體是寶貴資源,不能占用太久,透過lazy load機制可以一次在記憶體中執行所有運算。

Spark分散式運算容錯機制

Spark分散式運算,如有任何一台機器發生故障,要怎麼辦呢? 所謂「天下武功,唯快不破」。 由於RDD記憶體中運算速度很快,發生故障只需要全部重新運算即可。
如下圖:由於RDD本身Lineage機制,「轉換1」+「轉換2」+「轉換3」+「動作1」。它會記錄每個RDD與其父代RDD之間的關聯,他會紀錄透過什麼操作,才由父代RDD得到該RDD的資訊。
RDD本身immutable不可變的特性,再加上Lineage機制,使得Spark具備容錯的特性。如果某節點機器故障,儲存於節點上的RDD損毀,能重新執行一連串的「轉換」指令,產生新的輸出資料,如此就可以避免因為特定節點故障,造成整個系統無法運作的問題。

RDD的缺點: 使用上不夠友善

由以上介紹RDD這麼好,是否有甚麼缺點呢? 主要是使用上不夠友善。
以下是RDD 語法範例 以上程式碼功能很簡單,只是將使用者資料集,以性別欄位進行群組運算,分別男性與女性的數量。
  • RDD使用上必須要有Map/Reduce的概念: RDD進行分散式運算,必須要有Map/Reduce的概念,如上程式碼使用map配合reduceByKey。 
  • RDD沒有定義Schema(也就是未定義欄位名稱與資料型態): 我們只能使用位置來指定每一個欄位,例如以上程式碼,我們要統計性別,必須以map方法配合lambda語法,轉換為(x[2],1),x[2]就是性別欄位,然後使用reduceByKey加總資料。

Spark DataFrame具備Schema,更容易使用

為了解決RDD的問題,所以有了Spark DataFrame的產生。Spark DataFrame建立時必須定義Schema。定義每一個欄位名稱與資料型態。(在早期Spark 1.3 DataFrame稱為Schema RDD)。
以下是Spark DataFrame 語法範例:  
 我們可以用欄位名稱,例如gender性別進行統計。並且DataFrame API已經定義了很多類似SQL的方法,例如select()、groupby()、count(),你可以使用這些方法進行統計。比起RDD顯然容易使用多了。

Spark SQL更簡單

雖然DataFrame API很簡單,你還是必須有基礎程式設計能力,否可以更容易呢? 使用Spark SQL可以先建立DataFrame,然後透過登錄Spark SQL temp table,就可以使用Spark SQL語法。使用Spark SQL最簡單了,只需要使用SQL語法即可,即使非程式設計人員,只需要懂得SQL語法,就可以使用。
以下是Spark SQL法範例:



以上內容節錄自這本書,本書將詳細介紹Spark 2.0 安裝,並且所有Python範例程式都能在Spark 2.0 執行。並且特別介紹Spark 2.0 以DataFrame為基礎的Spark ML pipeline機器學習套件。很適合入門初學者:
  Python+Spark 2.0+Hadoop機器學習與大數據分析實戰 http://pythonsparkhadoop.blogspot.tw/2016/10/pythonspark-20hadoop.html

《購買本書 限時特價專區》
天瓏:https://www.tenlong.com.tw/items/9864341537?item_id=1023658
博客來:http://www.books.com.tw/products/0010730134?loc=P_007_090  

露天拍賣:http://goods.ruten.com.tw/item/show?21640846068139
蝦皮拍賣:https://goo.gl/IEx13P 



Share on Google Plus

About kevin

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 意見:

張貼留言