1. 程式人生 > >1.3RDD的設計與執行原理

1.3RDD的設計與執行原理

提供一種通用的資料抽象

RDD典型的執行過程如下:

  1. RDD讀入外部資料來源(或者記憶體中的集合)進行建立;
  2. RDD經過一系列的“轉換”操作,每一次都會產生不同的RDD,供給下一個“轉換”使用;
  3. 最後一個RDD經“行動”操作進行處理,並輸出到外部資料來源(或者變成Scala集合或標量)。

例1:一個Spark的“Hello World”程式

這裡以一個“Hello World”入門級Spark程式來解釋RDD執行過程,這個程式的功能是讀取一個HDFS檔案,計算出包含字串“Hello World”的行數。

fileRDD = sc.textFile('hdfs://localhost:9000/test.txt')
def contains(line):
...     return 'hello world' in line
filterRDD = fileRDD.filter(contains)
filterRDD.cache()
filterRDD.count()

第1行程式碼從HDFS檔案中讀取資料建立一個RDD;第2、3行定義一個過濾函式;第4行程式碼對fileRDD進行轉換操作得到一個新的RDD,即filterRDD;第5行程式碼表示對filterRDD進行持久化,把它儲存在記憶體或磁碟中(這裡採用cache介面把資料集儲存在記憶體中),方便後續重複使用,當資料被反覆訪問時(比如查詢一些熱點資料,或者執行迭代演算法),這是非常有用的,而且通過cache()可以快取非常大的資料集,支援跨越幾十甚至上百個節點;第5行程式碼中的count()是一個行動操作,用於計算一個RDD集合中包含的元素個數。這個程式的執行過程如下:這個程式的執行過程如下: *  建立這個Spark程式的執行上下文,即建立SparkContext物件; *  從外部資料來源(即HDFS檔案)中讀取資料建立fileRDD物件; *  構建起fileRDD和filterRDD之間的依賴關係,形成DAG圖,這時候並沒有發生真正的計算,只是記錄轉換的軌跡; *  執行到第6行程式碼時,count()是一個行動型別的操作,觸發真正的計算,開始實際執行從fileRDD到filterRDD的轉換操作,並把結果持久化到記憶體中,最後計算出filterRDD中包含的元素個數。