陣列 spark 一文詳解Spark核心設計思想

2021-10-14 16:23:31 字數 3391 閱讀 3588

知乎裡很多人都問過類似的問題,

在hadoop 和spark之間如何取捨?​www.zhihu.com

spark的核心設計思想是什麼?​www.zhihu.com

我也在相應問題下面給出了自己的回答,於是我寫一篇文章做個總結。

spark是乙個提供大資料分布式平行計算的開源方案,提供了諸多高層次api的資料操作方法,可以用於處理不同資料結構大規模資料的處理、計算任務。

很多人拿它與hadoop進行比較,實際上它並不像hadoop一樣提供資料儲存的方案,僅僅是hadoop中mapreduce元件的一種替代和改進。與mapreduce相比,它做了很多效能的優化,例如將計算過程放入記憶體,不需要反覆讀寫硬碟。更重要的是,它比mapreduce的操作更簡單,支援的任務種類更多。

電腦科學的發展是不斷地將問題進行抽象,從而讓人能夠在更高的層次解決問題。spark也是對分布式大資料處理的一種抽象,讓工程師或者分析人員能夠不必像寫mapreduce一樣,太關注底層的實現邏輯,從而在處理層次上投入更多精力。

spark在大資料生態中的定位

spark的工作需要配合儲存層,例如hadoop中的hdfs這種分布式檔案儲存或者mongodb、cassandra這類資料庫,來完成。同時,它還需要乙個集群的管理器,比如yarn、mesos等用來管理相應的資料處理任務。當然spark自己也提供集群管理功能,這樣集群的每個節點都需要安裝spark,用於進行任務的編排。

spark發展至今也成為了一套完整的大資料處理生態,它包含了特別多的元件,可以用於不同的處理任務。例如spark ml、spark streaming等等。spark ml包含了很多內建的機器學習演算法,用來處理基於大量資料的機器學習任務,spark streaming用於處理小批量的流式資料。這一切都基於它的核心概念,rdd,resilient distributed datasets,即彈性分布式資料集。

正如上文所言,spark對mapreduce做了乙個抽象,從而讓資料處理任務更加高效簡潔。

這種抽象就是基於rdd完成的,對於資料應用的開發者來說,我們基於spark進行開發就像是開發單機程式一樣,只需要關注對rdd的操作,而不用關注資料具體是怎麼儲存,怎麼排程,即可完成相應的資料處理任務。不過我們仍然還是得好好的了解一下rdd究竟是什麼,它具備哪些特性。

之前的回答

請用通俗形象的語言解釋下:spark中的rdd到底是什麼意思?​www.zhihu.com

大致介紹過rdd,它具備三個特性:

實際上並行操作和分割槽是乙個意思,正因為不同的分割槽的資料處於不同節點,所以才能進行並行操作。整個rdd實際上是乙個類似陣列的結構,每乙個分割槽即乙個元素,在實際的物理儲存中,每乙個分割槽指向節點中存放在記憶體的資料塊,

rdd本身是不可變的,即唯讀的。如果想要改變rdd裡的資料,對於它的任何轉換操作,會產生乙個新的rdd作為結果,新的rdd會包含從其它rdd衍生而來的所有資訊。比如最經典的word count程式:

val textfile = spark.sparkcontext.textfile("readme.md")

val words = textfile.flatmap(line => line.split(" "))

val word_pairs = words.map(word => (word, 1))

val word_counts = reducebykey(_ + _)

整個過程可以用下圖表示,

首先我們讀入了乙個檔案,形成了第乙個rdd,rdd中的每乙個元素是檔案中的每一行。然後我們使用flatmap操作對每一行進行分詞,形成了第二個rdd,每乙個元素是每一行分詞後的結果。之後我們使用map對每一行每乙個單詞進行計數,形成第三個rdd。最後我們使用reducebykey對每乙個單詞在每一行出現的次數進行加和,得到最終的詞頻統計結果。

每一步的結果跟上一步都存在依賴關係,然而spark並不會將中間產生的結果寫入硬碟,而是只記錄這些rdd之間的依賴關係。如果說某一步出錯了,我們只需要從這一步之前的rdd出發,再次進行計算,而不需要從頭開始。這些特點造就了spark的優勢:

另外,我們需要知道,rdd的執行是以一種懶載入的方式進行的。這是什麼意思呢?rdd實際上定義了兩種操作,一種叫transformation,一種叫action。transformation用於對rdd定義轉換操作,action則用來觸發rdd的計算。

比如上圖,我們對某乙個rdd定義了一系列的變換過程,例如map、flatmap等,這些操作不會被立刻執行,只有在需要的時候才會被執行。spark維護的是整個資料的變換記錄,當我們需要真正對資料進行實際的操作時,比如儲存、計數等,才會觸發整個過程。這也是spark與mapreduce的區別之一,在spark中,我們不建立單個執行圖,而是將許多簡單的操作結合在一起。這種方式無疑維護性更強,速度也更快,同時降低了整個操作的複雜度。

依賴關係使得使用者能夠很方便的使用有向無環圖圖的方式來定義資料的任務流,雖然說使用者不需要關心依賴的具體實現方式,但是仍然有必要了解它的原理。我們從word count圖示可以看出,各個rdd的分割槽之間實際上是存在一對一以及多對多的關係。spark將這兩種關係分別稱之為窄依賴和寬依賴。

儘管依賴關係能夠讓程式在發生錯誤時候方便的進行回退,如果遇到依賴鏈比較長的rdd,恢復還是會比較耗時的。因此spark引入了checkpoint機制來處理長依賴的rdd。checkpoint會將資料直接儲存進儲存層中,並切斷此rdd之前的依賴關係,當需要回退時候,checkpoint rdd後面的rdd就不需要知道前面的依賴關係了,可以直接從儲存層直接讀取相應的資料,開始進行接下來的rdd變換操作。

同樣,對於某些經常使用的rdd也有相應的快取機制,如果我們對rdd呼叫乙個新的action操作都要從頭開始進行運算,會非常低效。因此spark提供了相應的介面persist()與cache(),支援將rdd的資料快取入記憶體或者儲存層中。當下次進行同樣的操作,可以直接讀取相應的結果,提高了效率。

本文主要介紹了rdd的基本設計思想與特性,

一文詳解TCP協議

osi層 功能tcp ip協議 應用層文字傳輸,電子郵件,檔案服務,虛擬終端 ftp,http,snmp,dns等 表示層 資料格式化,轉換,資料加密 沒有協議 會話層 解除或建立與其他節點的聯絡 沒有協議 傳輸層提供端對端的介面 tcp,udp 網路層為資料報選擇路由 ip,icmp,rip,os...

一文詳解 I O 優化

在沒有 dma 技術之前,i o過程是這樣的 cpu 發出對應的指令給磁碟控制器,飯後返回。磁碟控制器收到指令後,於是就開始準備資料,會把資料放入到磁碟控制器的內部緩衝區中,然後產生乙個中斷。cpu 收到中斷訊號後,停下手頭的工作,接著把磁碟控制器的緩衝區的資料一次乙個位元組地讀進自己的暫存器,然後...

一文詳解scp命令

加密的方式在本地主機和遠端主機之間複製檔案 scp命令用於在linux下進行遠端拷貝檔案的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨伺服器,而且scp傳輸是加密的。可能會稍微影響一下速度。當你伺服器硬碟變為唯讀read only system時,用scp可以幫你把檔案移出來。另外,...