spark内核回顾思考 RDD
2019獨角獸企業重金招聘Python工程師標準>>>
Spark core思考
Spark上的子框架,都是后來加上去的。都是在Spark core之上完成的,所有框架一切的實現最終還是由Spark core來做的,比如streaming的實現,具體來說是streaming的代碼是如何翻譯成spark core的。只是他們有各自領域和針對性的優化而已。拋開任何具體的東西,現在考慮下Spark core是個什么東西。
解析rdd
程序就是數據+代碼。所以首先,我們需要考慮spark core由什么數據結構構成,一共就三種:rdd,broadcast,accumulator,最重要、最核心的是rdd。
rdd可以簡單的認為是一個數組,只不過是一個分布式的數組。具備彈性、分布式的特性。我們一般傳統的數據結構list、array等都是在一臺機器,而spark的內核提供的最基礎、最核心、最重要的數據結構是rdd,rdd是平鋪在分布式的機器。
我們看這里發生了什么變化。實質上我們想,數據平鋪在不同的機器,也就是數據的不同部分分布在不同的機器上,為了獲得不同部分的數據,也要獲得指針(地址)。指針會包含具體在什么機器上,范圍是什么,和數據的下標相比只不過是加上了一個機器的維度。這個和在一臺機器有沒有本質的區別。因為都是地址的定位,只不過rdd有一套自己的定位機制。所以我們不應該認為rdd學習比數組學習更復雜。
上升一個維度來看,數據依然在磁盤或內存中。只是從原先的一臺機器的磁盤或內存中,上升到了多臺機器的磁盤或內存中而已。也就是說,原先數據(array)的尋址可能只有一個路徑,現在升維后,多了機器的維度,比如協議,ip,端口等代表機器維度的信息,而已。
而 broadcast是全局Executor只讀的。
而 accumulator是全局Executor只寫的。
這在平常的程序中也是很常見的。
rdd的調度
基于rdd的編程和調度,我們也同樣拿數組的編程調度來類比。傳統的數組操作是在一個進程中,但是因為spark需要面對的是海量的分布在多臺機器上的數據,因此這里有個權衡,是將數據復制到程序所在節點來計算呢,還是將程序放到數據所在節點計算?顯然,面對海量的數據,網絡傳輸是更大的瓶頸。因此在rdd中,需要將程序發送到數據所在的不同的機器上操作,就構成了數據不同代碼動的理念。如果要操作數據,比如map,要找到數據所在的機器上,這個是rdd的perferedLocation來告訴你的。原先單機計算的時候,也需要知道數據在哪里,現在知道數據在哪里后,需要把代碼傳到那里(通過Http等方式),但是也只是把代碼傳過去而已。所以說分布式計算和單機計算也沒有本質區別。
由于要跑到其他機器上,就有了管理的過程,怎么進行管理,就是driver負責的事情。普通數組的操作不需要怎么管理,因為沒有到那么多機器上去。
RDD管理主要是管理計算,這里延伸出了一些東西:
第一個層面就是要知道怎么確定到不同的機器上,這個就是任務調度。
第二個層面,由于你是在不同的機器上,計算的時候出現錯誤,怎么進行容錯。
容錯
對數組操作出錯,如果業務很復雜,也肯定會有容錯的方式,至于rdd的操作也會更加慎重的考慮容錯,因為分布式一旦出錯的話,位于不同的機器上,代價比一臺機器上更大。
業界容錯的經典方式進行加檢查點(加快照)并放在其他機器上,顯然在海量數據量下,將某一步的計算結果保存下來,這種方式比較消耗時間,因為有網絡通信等操作。因此,在不是特別重要的時候,不建議使用checkpoint。
rdd的方式是每次操作都會產生新的rdd,它記住的是算子之間的依賴關系,而不是從數據角度考慮容錯。算子之間的關系進行記錄是從數據產生的角度考慮容錯。算子只是表達數據怎么產生這件事,rdd強大之處在于,既能夠表達算子之間的依賴關系,還包涵了數據在哪里。
從容錯角度看,由于rdd包涵了數據在哪里,在容錯時再次獲得數據的時候,它包含了數據本身和計算過程,所以可以部分的恢復數據,而不是全部的。同時,無論是數據的元數據還是計算關系都是在rdd中,這是個非常輕量級的過程,可以避免直接操作海量的數據本身。這是一個非常強悍的地方。
shuffle
在分布式計算的時候會有一些自己規則,比較典型的就是機器間要傳數據的時候,搞了一個shuffle。
因為分布式的時候進行計算,計算時候有個很大的問題,就是不同的機器之間,需要通過數據級別的通訊。比如數組的計算,可能有全局級別的計算,比如各個item出現的次數。從分布式角度,group、reduce這種就是全局級別。
考慮全局級別就是整個分布式的關鍵之所在,這個時候就像我們對一個數組進行整體的操作,對rdd全局級別的操作,由于數據分布在不同的機器上,這個時候全局級別的操作,要加上ip、端口和具體數據存在什么地方,而且要在機器之間傳數據。
機器之間傳數據,代價比較大,所以當發生時,spark會把計算結果先保存在本地磁盤上,免得進行全局級別操作出現故障時,重新計算代碼太大,這是一種用空間換時間的方式。計算成果放在本地磁盤上,整個驅動的調動程序會知道,方便告訴后面的計算數據到底在哪里。在下一個階段計算時,會問driver數據在哪里,driver告訴之后,就會去上個階段保存的地方去拿自己想要而數據,由于是分布式的,有自己的一套規則,對數據進行分門別類。
shuffle的過程就是對全局數據進行分類整理的過程,因為任何一臺機器都有可能包含想要的數據,所以會依賴所有的數據來源。整理抓到我們想要的數據之后,就繼續進行計算,而由于進行網絡的傳輸,都會有一些調用邏輯,從spark角度講就變成了stage。
小結
rdd就是個大大的分布式數組,計算時有時是自己單純的計算,有時是全局的計算,和對數組操作沒有任何區別。
不同語言都有一套語法規則,但是核心是思考如何處理數據。spark是運行在jvm上的,jvm并不知道spark這個東西,所以一個事實是,jvm只有一些基本的數據結構和語法的支持,spark只不過是在jvm基礎上,構造了rdd這個數據結構而已。所以精通spark和精通其他java程序沒有區別。因為jvm本身就屏蔽掉了不同機器之間的區別,只需要進行地址定位就可以,這就是jvm的偉大之處,分布式和單機處理沒有本質區別。
?
數據分布在多臺機器,數據依然通過地址定位后。唯一的不同,是因為數據量特別大,移動特別耗時,只能將程序發送到數據端計算。然后又多了一些調度的工作。而已。
?
忘掉分布式,會接觸更加本質的東西。
?
?
借鑒
欲知后事如何,且聽下回分解!
?
轉載于:https://my.oschina.net/corleone/blog/713748
總結
以上是生活随笔為你收集整理的spark内核回顾思考 RDD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: json 和 table控件
- 下一篇: H5网页App和纯原生的App差距在哪?