為何spark中需要設計RDD這個一個概念

先來看一篇分享:

什么是Spark中的RDD以及我們?yōu)槭裁葱枰?/p>

Spark一般已經(jīng)過度使用Hadoop(MapReduce),因為它在迭代處理算法中更快地執(zhí)行方面提供了好處。

Apache Spark已經(jīng)過度采用了Hadoop(MapReduce),因為它在迭代處理算法(如機器學習)中的更快執(zhí)行方面提供了多種好處。

在這篇文章中,我們將嘗試理解是什么讓Spark RDD在批量分析中如此有用。

為何選擇RDD?

當涉及迭代分布式計算,即在諸如Logistic回歸,K均值聚類,頁面排名算法的計算中處理多個作業(yè)上的數(shù)據(jù)時,在多個作業(yè)之間重用或共享數(shù)據(jù)是相當常見的,或者您可能想要多個對共享數(shù)據(jù)集的即席查詢。

在現(xiàn)有的分布式計算系統(tǒng)(例如MapReduce)中存在數(shù)據(jù)重用或數(shù)據(jù)共享的潛在問題,也就是說,您需要將數(shù)據(jù)存儲在某些中間穩(wěn)定的分布式存儲(如HDFS或Amazon S3)中。這使得作業(yè)的整體計算變慢,因為它涉及過程中的多個IO操作,復制和序列化。

MapReduce中的迭代處理

RDD嘗試通過啟用容錯分布式內(nèi)存計算來解決這些問題。

Spark中的迭代處理

現(xiàn)在,讓我們了解RDD究竟是什么以及它如何實現(xiàn)容錯 -

RDD - 彈性分布式數(shù)據(jù)集

RDD是不可變和分區(qū)的記錄集合,只能通過粗粒度操作(如map,filter,group by等)創(chuàng)建。通過粗粒度操作,這意味著操作應用于數(shù)據(jù)集中的所有元素。RDD只能通過從穩(wěn)定存儲(如HDFS)讀取數(shù)據(jù)或通過現(xiàn)有RDD上的轉(zhuǎn)換來創(chuàng)建。

現(xiàn)在,如何幫助容錯?

由于RDD是通過一組轉(zhuǎn)換創(chuàng)建的,因此它會記錄這些轉(zhuǎn)換,而不是實際數(shù)據(jù)。生成一個RDD的轉(zhuǎn)換稱為Lineage Graph。


firstRDD = spark。textFile(“hdfs:// ...”)

secondRDD = firstRDD。filter(someFunction);

thirdRDD  =  secondRDD。map(someFunction);

例如 -

Spark RDD Lineage Graph

如果我們丟失了RDD的一些分區(qū),我們可以在lineage中重放該分區(qū)上的轉(zhuǎn)換來實現(xiàn)相同的計算,而不是跨多個節(jié)點進行數(shù)據(jù)復制。這個特性是RDD的最大好處,因為它節(jié)省了很多努力在數(shù)據(jù)管理和復制中,從而實現(xiàn)更快的計算。

上面的解釋總結有兩點:

1:重用和共享數(shù)據(jù)

2:容錯

第一點我并不同意:如果是在多個作業(yè)間共享數(shù)據(jù)的話,無論是MR還是spark都會用磁盤作為重用的介質(zhì)

第二點才是RDD出現(xiàn)的主要原因:第一如果你在MR中任務在某個地方出錯,只能是全部重頭算一遍,我們是想如果要避免每一次出錯重算的話,我們是不是要緩存出錯之前的數(shù)據(jù)集,另外還需要從出錯點重試的機制,那么這一點在MR計算模型中是沒有實現(xiàn),當然你可以自己重寫MR框架來實現(xiàn)這個模式,實現(xiàn)這個模式需要除了需要考慮之前的那兩點,還需要考慮到出錯之前的數(shù)據(jù)集如果數(shù)據(jù)緩存達到存儲瓶頸時的要落盤,緩存數(shù)據(jù)需要重新就算時要從該數(shù)據(jù)集的上游去重新計算,也就是需要存儲該數(shù)據(jù)集的上游信息,然后這個是分布式計算,是不是還要存儲該數(shù)據(jù)集的分區(qū)情況,等等這些,其實就是對應了spark里面的RDD的設計思想,所以說spark中之所以有RDD這個概念,主要原因是為了實現(xiàn)容錯的快速處理。

為了驗證上面的說的,我們看看RDD的內(nèi)部結構和出錯的時的處理機制

RDD內(nèi)部結構(RDD是一個抽象類,封裝了通用的屬性和方法)

比較重要的屬性:dependencies和partition,其中dependencies記錄的該RDD的依賴關系,partition記錄了RDD的分區(qū)信息

比較重要的方法:cache和persisit,這個兩個方法決定了RDD里面data緩存的級別,默認RDD是不緩存的,如果需要重用那么可以使用這個兩個方法緩存(內(nèi)存和磁盤可選)

預留問題:

1:沒有緩存的RDD的數(shù)據(jù)是在什么時候被回收的?

2:task失敗是如何使用血緣機制重新計算的?
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容