Spark調研筆記第5篇 - Spark API簡介

由於Spark是用Scala實現的,所以Spark天生支持Scala API,此外,還支持Java和Python API。以Spark 1.3版本的Python API爲例,其模塊層級關係如下圖所示:

從上圖可知,pyspark是Python API的頂層package,它包含了幾個重要的subpackages,其中:

1) pyspark.SparkContext
它抽象了指向spark集羣的一條連接,可用來創建RDD對象,它是API的主入口。

2) pyspark.SparkConf
通過它可在提交的應用代碼中動態創建spark app的配置並作爲conf參數傳給pyspark.SparkContext實例的構造函數。若未動態創建conf,則pyspark.SparkContext實例從conf/spark-defaults.conf讀取默認的全局配置。

3) pyspark.RDD
RDDs can be stored in memory between queries without requiring replication. Instead, they rebuild lost data on failure using lineage: each RDD remembers how it was built from other datasets (by transformations like map, join or groupBy) to rebuild itself.
RDD是Spark編程的核心抽象概念,它代表了一個抽象的彈性分佈式數據集,Spark支持對RDD進行兩類操作:transformations和actions,它們所包含的函數列表可以參考官方文檔的"Transformations"和"Actions"部分。
根據Spark Programming Guide文檔"RDD Operations"部分的說明,根據已經存在的數據集創建新數據集的操作被稱作transformation;對數據集做計算並將結果返回driver program的操作被稱作action
例如,map是根據傳入的函數參數對已有RDD做處理,其運行結果得到一個新的RDD,所以它是一個transformation操作;而reduce則是根據傳入的函數參數對已有RDD做計算,計算結果不再是個RDD,而是個具體的值(對reduce來說,計算結果是個具體的數字,而其它action(s)得到的可能是個list或其他數據結構),所以reduce是個action操作。
需要特別強調的是,Spark對所有的transformations操作都採用lazy evaluation的策略,也即spark在調度時並不是對遇到的每個transformation都立即求值以得到新的RDD,而是將針對某個RDD的一系列transformations操作記錄下來,只有最終遇到action操作時,Spark纔會計算先前記錄的每個transformations。
這種lazy evaluation的設計思路使得Spark得以更高效運行,因爲調度器可以對從初始RDD到最終action操作路徑上的transformations做合併或其它變換,且只有最終的action操作結果纔會返回給driver program,節省了transformations操作的中間結果在集羣worker node和driver program間的傳輸開銷。
默認情況下,調用action操作時,初始RDD經過的每個transformation操作均會被執行一次,在多個actions會經過一系列相同的transformations操作時,這種recompute顯得並不高效。因此,在實際開發Spark計算任務腳本時,會被多個actions共用的transformations結果最好調用persist或cache緩存起來,這樣會節省不少計算時間。

4) pyspark.Broadcast
通過Broadcast廣播的變量的作用域對應用所申請的每個節點上的executor進程都是可見的,而且廣播後,變量會一直存在於每個worker節點的executor進程中,直到任務結束,這樣可以避免RDD數據集在driver和worker節點的executor進程間頻繁傳輸帶來的開銷。
尤其是對於某些用到只讀共享變量的應用(如需要加載字典且所有計算節點均需訪問該字典),廣播可以高效地實現變量共享的目的。

5) pyspark.Accumulator
它是Spark支持的另一種變量共享的方式(第1種方式是上面介紹的Broadcast),worker節點上的進程可以通過add()操作更新變量,更新後的變量會自動傳播回driver program。

6) pyspark.SparkFiles
當應用通過SparkContext.addFile()向集羣提交任務用到的文件時,調用SparkFiles類的相關方法可以解析這些文件路徑並訪問文件。

7) pyspark.StorageLevel
它可以指定RDD的存儲級別,如只使用內存、只使用磁盤、內存爲主磁盤爲輔,等等。詳細的控制標識可以參考這裏的文檔。

【參考資料】
1. Spark Programming Guide - RDD Operations
2. pyspark package
3. Spark Programming Guide: RDD Transformations
4. Spark Programming Guide: RDD Actions
5. pyspark package: pyspark.StorageLevel

======================= EOF ====================


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章