一、前述
Spark是基於記憶體的計算框架,效能要優於Mapreduce,可以實現hadoop生態圈中的多個元件,是一個非常優秀的大資料框架,是Apache的頂級專案。One stack rule them all 霸氣。
但不同於MapReduce的是Job中間輸出結果可以儲存在記憶體中,從而不再需要讀寫HDFS,因此Spark能更好地適用於資料探勘與機器學習等需要迭代的MapReduce的演算法
二、具體細節
1、Spark與MapReduce的區別
都是分散式計算框架,Spark基於記憶體,MR基於HDFS。Spark處理資料的能力一般是MR的十倍以上,Spark中除了基於記憶體計算外,還有DAG有向無環圖來切分任務的執行先後順序。
2、Spark執行模式
- Local
多用於本地測試,如在eclipse,idea中寫程式測試等。
- Standalone
Standalone是Spark自帶的一個資源排程框架,它支援完全分散式。
- Yarn
Hadoop生態圈裡面的一個資源排程框架,Spark也是可以基於Yarn來計算的。
- Mesos
資源排程框架。
注意:要基於Yarn來進行資源排程,必須實現AppalicationMaster介面,Spark實現了這個介面,所以可以基於Yarn。
3、SparkCore
概念
RDD(Resilient Distributed Dateset),彈性分散式資料集。
RDD的五大特性:(比較重要)
- RDD是由一系列的partition組成的。
- 函式是作用在每一個partition(split)上的。
- RDD之間有一系列的依賴關係。
- 分割槽器是作用在K,V格式的RDD上。
- RDD提供一系列最佳的計算位置。Partiotion對外提供資料處理的本地化,計算移動,資料不移動。
備註:
1、textFile方法底層封裝的是讀取MR讀取檔案的方式,讀取檔案之前先split,預設split大小是一個block大小。每個split對應一個partition。
2、RDD實際上不儲存資料,儲存的是計算邏輯,這裡方便理解,暫時理解為儲存資料。
3、什麼是K,V格式的RDD?
- 如果RDD裡面儲存的資料都是二元組物件,那麼這個RDD我們就叫做K,V格式的RDD。
4、 哪裡體現RDD的彈性(容錯)?
- partition數量,大小沒有限制,體現了RDD的彈性。Partiotion個數可以控制。可以提高並行度。
- RDD之間依賴關係,可以基於上一個RDD重新計算出RDD。
5、哪裡體現RDD的分散式?
- RDD是由Partition組成,partition是分佈在不同節點上的。 RDD提供計算最佳位置,體現了資料本地化。體現了大資料中“計算移動資料不移動”的理念。
4、Spark任務執行原理
以上圖中有四個機器節點,Driver和Worker是啟動在節點上的程式,執行在JVM中的程式。
- Driver與叢集節點之間有頻繁的通訊。
- Driver負責任務(tasks)的分發和結果的回收。任務的排程。如果task的計算結果非常大就不要回收了。會造成oom。
- Worker是Standalone資源排程框架裡面資源管理的從節點。也是JVM程式。
- Master是Standalone資源排程框架裡面資源管理的主節點。也是JVM程式。
5、Spark程式碼流程
1、建立SparkConf物件
SparkConf conf = new SparkConf().setMaster("local").setAppName("xxx")
- 1.設定執行模式
- 2.設定application name
- 3.設定spark執行引數
2、建立SparkContext物件
叢集的唯一入口
3、基於Spark的上下文建立一個RDD,對RDD進行處理。
由SparkContext建立RDD
4、應用程式中要有Action類運算元來觸發Transformation類運算元執行。
5、關閉Spark上下文物件SparkContext。