Spark核心—RDD初探

本文目的 java

   

最近在使用Spark進行數據清理的相關工做,初次使用Spark時,遇到了一些挑(da)戰(ken)。感受須要記錄點什麼,纔對得起本身。下面的內容主要是關於Spark核心—RDD的相關的使用經驗和原理介紹,做爲我的備忘,也但願對讀者有用。 python

   

爲何選擇Spark 算法

   

緣由以下 apache

  1. 代碼複用:使用Scala高級語言操做Spark,靈活方便,面向對象,函數編程的語言特性能夠所有拿來。Scala基本上能夠無縫集成java及其相關庫。最重要的是,能夠封裝組件,沉澱工做,提升工做效率。以前用hive + python的方式處理數據,每一個處理單元是python文件,數據處理單元之間的交互是基於數據倉庫的表格,十分不靈活,很難沉澱常見的工做。
  2. 機器學習:Spark能夠實現迭代邏輯,能夠輕鬆實現一些常見的機器學習算法,並且spark自帶機器學習庫mllib和圖算法包graphyx,爲後面的數據挖掘應用提供了想象空間。

   

Spark計算性能雖然明顯比Hadoop高效,但並非咱們技術選型的主要緣由,由於現有基於Hadoop +hive的計算性能已經足夠了。 編程

   

   

基石哥—RDD 緩存

   

整個spark衍生出來的工具都是基於RDD(Resilient Distributed Datesets),如圖: 網絡

RDD是一個抽象的數據集,提供對數據並行容錯的處理。初次始使用RDD時,其接口有點相似Scala的Array,提供map,filter,reduce等操做。可是,不支持隨機訪問。剛開始不太習慣,可是逐漸熟悉函數編程和RDD 的原理後,發現隨機訪問數據的場景並不常見。 閉包

   

爲何RDD效率高 機器學習

   

Spark官方提供的數據是RDD在某些場景下,計算效率是Hadoop的20X。這個數據是否有水分,咱們先不追究,可是RDD效率高的由必定機制保證的: 函數

  1. RDD數據只讀,不可修改。若是須要修改數據,必須從父RDD轉換(transformation)到子RDD。因此,在容錯策略中,RDD沒有數據冗餘,而是經過RDD父子依賴(血緣)關係進行重算實現容錯。
  2. 多個RDD操做之間,數據不用落地到磁盤上,避免沒必要要的I/O操做。
  3. RDD中存放的數據能夠是java對象,因此避免的沒必要要的對象序列化和反序列化。

總而言之,RDD高效的主要因素是儘可能避免沒必要要的操做和犧牲數據的操做精度,用來提升計算效率。

   

閉包外部變量訪問原則

 

RDD相關操做都須要傳入自定義閉包函數(closure),若是這個函數須要訪問外部變量,那麼須要遵循必定的規則,不然可能會出現異常。閉包函數傳入到節點時,須要通過下面的步驟:

  1. 使用反射機制,找到全部須要訪問的變量,並封裝到對象中,而後序列化
  2. 將序列化後的對象經過網絡傳輸到其餘節點上
  3. 反序列化閉包對象
  4. 子指定節點執行閉包函數,外部變量在閉包內的修改不會被反饋到驅動程序。

簡而言之,就是經過網絡,傳遞函數,而後執行。因此,被傳遞的對象必須能夠序列化和反序列化,不然傳遞失敗。單機本地執行時,仍然會執行上面四步。

 

廣播機制也能夠作到這一點,可是頻繁的使用廣播會使代碼不夠簡潔,並且廣播設計的初衷是將較大數據緩存到節點上,避免屢次數據傳輸,提升計算效率,而不是用於進行外部變量訪問。

   

參考資料

相關文章
相關標籤/搜索