大資料十一 Spark簡介
spark簡介
Spark 是專為大規模資料處理而設計的快速通用的計算引擎
Spark是UC Berkeley AMP lab (加州大學伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用並行框架,是一種“One Stack to rule them all”通用的大資料計算框架,期望使用一個技術棧就完美地解決大資料領域的各種計算任務
Spark 支援 scala,java,python 和 R 等開發語言,因為 spark 底層是使用scala語言實現,所以用 scala 和 java 來開發 spark 程式效率比較高,因為 java 和 scala 都是基於 JVM的程式語言
Spark 的速度比 MapReduce 快
–MR計算模型計算中間會產生很多 shuffle,shuffle 中間的過程都是基於磁碟來讀寫的,這是最耗效能的部分
–Spark 使用 DAG 有向無環圖,切割 job,劃分 stage,task 間是 pipeline 計算模式,減少磁碟落地
–Spark 支援基於記憶體迭代,當然,因為Spark是基於記憶體進行計算的,如果資料量太大,沒有調優的情況下,會出現OOM
–Spark 採用粗粒度的資源排程,實現資源複用
–Spark 可以根據不同情況選擇不同的 shuffle
Spark shuffle
spark 支援 HashShuffle 和 SortShuffle 兩種 shuffle
HashShuffle
spark 前期預設使用 HashShuffle,這裡我們看圖,假設每個 Executor 使用1個核,這樣同一時刻每個 Executor 就只能執行一個 task
在 stage 之間存在 shuffle 過程,首先是 shuffle write 階段,task 處理完的資料會按照 key 的 hash 值與 reduce task 的個數取模從而將其分割槽,不同分割槽的資料寫入不同的磁碟檔案,寫磁碟之前會先寫入buffer,buffer寫滿後溢寫到磁碟
然後是 shuffle read 階段:reduce task 拉取各個節點上同一分割槽的資料,先寫入 buffer 中,拉取資料的同時會對資料進行聚合操作,直到資料拉取完畢
此時我們會發現1個 task 會產生 reduce.num 個磁碟小檔案,總共會產生 m*r 個磁碟小檔案,m 指 map task 的個數,r 指 reduce task 的個數,真實情況中這會產生大量的磁碟小檔案,就會導致 shuffle 過程中建立大量的讀寫檔案的物件及進行很多次磁碟和網路IO