本文目的 java
最近在使用Spark進行數據清理的相關工做,初次使用Spark時,遇到了一些挑(da)戰(ken)。感受須要記錄點什麼,纔對得起本身。下面的內容主要是關於Spark核心—RDD的相關的使用經驗和原理介紹,做爲我的備忘,也但願對讀者有用。 python
爲何選擇Spark 算法
緣由以下 apache
Spark計算性能雖然明顯比Hadoop高效,但並非咱們技術選型的主要緣由,由於現有基於Hadoop +hive的計算性能已經足夠了。 編程
基石哥—RDD 緩存
整個spark衍生出來的工具都是基於RDD(Resilient Distributed Datesets),如圖: 網絡
RDD是一個抽象的數據集,提供對數據並行和容錯的處理。初次始使用RDD時,其接口有點相似Scala的Array,提供map,filter,reduce等操做。可是,不支持隨機訪問。剛開始不太習慣,可是逐漸熟悉函數編程和RDD 的原理後,發現隨機訪問數據的場景並不常見。 閉包
爲何RDD效率高 機器學習
Spark官方提供的數據是RDD在某些場景下,計算效率是Hadoop的20X。這個數據是否有水分,咱們先不追究,可是RDD效率高的由必定機制保證的: 函數
總而言之,RDD高效的主要因素是儘可能避免沒必要要的操做和犧牲數據的操做精度,用來提升計算效率。
閉包外部變量訪問原則
RDD相關操做都須要傳入自定義閉包函數(closure),若是這個函數須要訪問外部變量,那麼須要遵循必定的規則,不然可能會出現異常。閉包函數傳入到節點時,須要通過下面的步驟:
簡而言之,就是經過網絡,傳遞函數,而後執行。因此,被傳遞的對象必須能夠序列化和反序列化,不然傳遞失敗。單機本地執行時,仍然會執行上面四步。
廣播機制也能夠作到這一點,可是頻繁的使用廣播會使代碼不夠簡潔,並且廣播設計的初衷是將較大數據緩存到節點上,避免屢次數據傳輸,提升計算效率,而不是用於進行外部變量訪問。
參考資料