日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spark内核回顾思考 RDD

發布時間:2024/9/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。