溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

spark RDD有什么特點(diǎn)

發(fā)布時(shí)間:2021-12-10 11:51:46 來源:億速云 閱讀:924 作者:小新 欄目:云計(jì)算

這篇文章給大家分享的是有關(guān)spark RDD有什么特點(diǎn)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

概念

RDD具有以下一些特點(diǎn):

創(chuàng)建:只能通過轉(zhuǎn)換( transformation,如map/filter/groupBy/join等,區(qū)別于動(dòng)作action)從兩種數(shù)據(jù)源中創(chuàng)建RDD:1)穩(wěn)定存儲(chǔ)中的數(shù)據(jù);2)其他RDD。

只讀:狀態(tài)不可變,不能修改

分區(qū):支持使RDD中的元素根據(jù)那個(gè)key來分區(qū)( partitioning),保存到多個(gè)結(jié)點(diǎn)上。還原時(shí)只會(huì)重新計(jì)算丟失分區(qū)的數(shù)據(jù),而不會(huì)影響整個(gè)系統(tǒng)。

路徑:在RDD中叫世族或血統(tǒng)( lineage),即RDD有充足的信息關(guān)于它是如何從其他RDD產(chǎn)生而來的。

持久化:支持將會(huì)·被重用的RDD緩存(如in-memory或溢出到磁盤)

延遲計(jì)算:像DryadLINQ一樣,Spark也會(huì)延遲計(jì)算RDD,使其能夠?qū)⑥D(zhuǎn)換管道化(pipeline transformation)

操作:豐富的動(dòng)作( action),count/reduce/collect/save等。

關(guān)于轉(zhuǎn)換(transformation)與動(dòng)作(action)的區(qū)別,前者會(huì)生成新的RDD,而后者只是將RDD上某項(xiàng)操作的結(jié)果返回給程序,而不會(huì)生成新的RDD

RDD底層實(shí)現(xiàn)原理

RDD是一個(gè)分布式數(shù)據(jù)集,顧名思義,其數(shù)據(jù)應(yīng)該分部存儲(chǔ)于多臺(tái)機(jī)器上。事實(shí)上,每個(gè)RDD的數(shù)據(jù)都以Block的形式存儲(chǔ)于多臺(tái)機(jī)器上,下圖是Spark的RDD存儲(chǔ)架構(gòu)圖,其中每個(gè)Executor會(huì)啟動(dòng)一個(gè)BlockManagerSlave,并管理一部分Block;而Block的元數(shù)據(jù)由Driver節(jié)點(diǎn)的BlockManagerMaster保存。BlockManagerSlave生成Block后向BlockManagerMaster注冊(cè)該Block,BlockManagerMaster管理RDD與Block的關(guān)系,當(dāng)RDD不再需要存儲(chǔ)的時(shí)候,將向BlockManagerSlave發(fā)送指令刪除相應(yīng)的Block。

spark RDD有什么特點(diǎn)

RDD cache的原理

RDD的轉(zhuǎn)換過程中,并不是每個(gè)RDD都會(huì)存儲(chǔ),如果某個(gè)RDD會(huì)被重復(fù)使用,或者計(jì)算其代價(jià)很高,那么可以通過顯示調(diào)用RDD提供的cache()方法,把該RDD存儲(chǔ)下來。那RDD的cache是如何實(shí)現(xiàn)的呢?

RDD中提供的cache()方法只是簡(jiǎn)單的把該RDD放到cache列表中。當(dāng)RDD的iterator被調(diào)用時(shí),通過CacheManager把RDD計(jì)算出來,并存儲(chǔ)到BlockManager中,下次獲取該RDD的數(shù)據(jù)時(shí)便可直接通過CacheManager從BlockManager讀出。

RDD的容錯(cuò)機(jī)制實(shí)現(xiàn)分布式數(shù)據(jù)集容錯(cuò)方法

數(shù)據(jù)檢查點(diǎn)和記錄更新RDD采用記錄更新的方式:記錄所有更新點(diǎn)的成本很高。所以,RDD只支持粗顆粒變換,即只記錄單個(gè)塊上執(zhí)行的單個(gè)操作,然后創(chuàng)建某個(gè)RDD的變換序列(血統(tǒng))存儲(chǔ)下來;變換序列指,每個(gè)RDD都包含了他是如何由其他RDD變換過來的以及如何重建某一塊數(shù)據(jù)的信息。因此RDD的容錯(cuò)機(jī)制又稱“血統(tǒng)”容錯(cuò)。 要實(shí)現(xiàn)這種“血統(tǒng)”容錯(cuò)機(jī)制,最大的難題就是如何表達(dá)父RDD和子RDD之間的依賴關(guān)系。實(shí)際上依賴關(guān)系可以分兩種,窄依賴和寬依賴:窄依賴:子RDD中的每個(gè)數(shù)據(jù)塊只依賴于父RDD中對(duì)應(yīng)的有限個(gè)固定的數(shù)據(jù)塊;寬依賴:子RDD中的一個(gè)數(shù)據(jù)塊可以依賴于父RDD中的所有數(shù)據(jù)塊。例如:map變換,子RDD中的數(shù)據(jù)塊只依賴于父RDD中對(duì)應(yīng)的一個(gè)數(shù)據(jù)塊;groupByKey變換,子RDD中的數(shù)據(jù)塊會(huì)依賴于多有父RDD中的數(shù)據(jù)塊,因?yàn)橐粋€(gè)key可能錯(cuò)在于父RDD的任何一個(gè)數(shù)據(jù)塊中 將依賴關(guān)系分類的兩個(gè)特性:第一,窄依賴可以在某個(gè)計(jì)算節(jié)點(diǎn)上直接通過計(jì)算父RDD的某塊數(shù)據(jù)計(jì)算得到子RDD對(duì)應(yīng)的某塊數(shù)據(jù);寬依賴則要等到父RDD所有數(shù)據(jù)都計(jì)算完成之后,并且父RDD的計(jì)算結(jié)果進(jìn)行hash并傳到對(duì)應(yīng)節(jié)點(diǎn)上之后才能計(jì)算子RDD。第二,數(shù)據(jù)丟失時(shí),對(duì)于窄依賴只需要重新計(jì)算丟失的那一塊數(shù)據(jù)來恢復(fù);對(duì)于寬依賴則要將祖先RDD中的所有數(shù)據(jù)塊全部重新計(jì)算來恢復(fù)。所以在長(zhǎng)“血統(tǒng)”鏈特別是有寬依賴的時(shí)候,需要在適當(dāng)?shù)臅r(shí)機(jī)設(shè)置數(shù)據(jù)檢查點(diǎn)。也是這兩個(gè)特性要求對(duì)于不同依賴關(guān)系要采取不同的任務(wù)調(diào)度機(jī)制和容錯(cuò)恢復(fù)機(jī)制。

RDD內(nèi)部的設(shè)計(jì)

每個(gè)RDD有5個(gè)主要的屬性:

1)一組分片(Partition),即數(shù)據(jù)集的基本組成單位。對(duì)于RDD來說,每個(gè)分片都會(huì)被一個(gè)計(jì)算任務(wù)處理,并決定并行計(jì)算的粒度。用戶可以在創(chuàng)建RDD時(shí)指定RDD的分片個(gè)數(shù),如果沒有指定,那么就會(huì)采用默認(rèn)值。默認(rèn)值就是程序所分配到的CPU Core的數(shù)目。圖3-1描述了分區(qū)存儲(chǔ)的計(jì)算模型,每個(gè)分配的存儲(chǔ)是由BlockManager實(shí)現(xiàn)的。每個(gè)分區(qū)都會(huì)被邏輯映射成BlockManager的一個(gè)Block,而這個(gè)Block會(huì)被一個(gè)Task負(fù)責(zé)計(jì)算。

2)一個(gè)計(jì)算每個(gè)分區(qū)的函數(shù)。Spark中RDD的計(jì)算是以分片為單位的,每個(gè)RDD都會(huì)實(shí)現(xiàn)compute函數(shù)以達(dá)到這個(gè)目的。compute函數(shù)會(huì)對(duì)迭代器進(jìn)行復(fù)合,不需要保存每次計(jì)算的結(jié)果。

3)RDD之間的依賴關(guān)系。RDD的每次轉(zhuǎn)換都會(huì)生成一個(gè)新的RDD,所以RDD之間就會(huì)形成類似于流水線一樣的前后依賴關(guān)系。在部分分區(qū)數(shù)據(jù)丟失時(shí),Spark可以通過這個(gè)依賴關(guān)系重新計(jì)算丟失的分區(qū)數(shù)據(jù),而不是對(duì)RDD的所有分區(qū)進(jìn)行重新計(jì)算。

4)一個(gè)Partitioner,即RDD的分片函數(shù)。當(dāng)前Spark中實(shí)現(xiàn)了兩種類型的分片函數(shù),一個(gè)是基于哈希的HashPartitioner,另外一個(gè)是基于范圍的RangePartitioner。只有對(duì)于key-value的RDD,才會(huì)有Partitioner,非key-value的RDD的Parititioner的值是None。

Partitioner函數(shù)不但決定了RDD本身的分片數(shù)量,也決定了parent RDD Shuffle輸出時(shí)的分片數(shù)量。

5)一個(gè)列表,存儲(chǔ)存取每個(gè)Partition的優(yōu)先位置(preferred location)。對(duì)于一個(gè)HDFS文件來說,這個(gè)列表保存的就是每個(gè)Partition所在的塊的位置。按照“移動(dòng)數(shù)據(jù)不如移動(dòng)計(jì)算”的理念,Spark在進(jìn)行任務(wù)調(diào)度的時(shí)候,會(huì)盡可能地將計(jì)算任務(wù)分配到其所要處理數(shù)據(jù)塊的存儲(chǔ)位置。

spark RDD有什么特點(diǎn)

以Spark中內(nèi)建的幾個(gè)RDD舉例來說:

信息/RDD

HadoopRDD

FilteredRDD

JoinedRDD

Partitions

每個(gè)HDFS塊一個(gè)分區(qū),組成集合

與父RDD相同

每個(gè)Reduce任務(wù)一個(gè)分區(qū)

PreferredLoc

HDFS塊位置

無(或詢問父RDD)

Dependencies

無(父RDD)

與父RDD一對(duì)一

對(duì)每個(gè)RDD進(jìn)行混排

Iterator

讀取對(duì)應(yīng)的塊數(shù)據(jù)

過濾

聯(lián)接混排的數(shù)據(jù)

Partitioner

HashPartitioner

工作原理

主要分為三步:創(chuàng)建RDD對(duì)象,DAG調(diào)度器創(chuàng)建執(zhí)行計(jì)劃,Task調(diào)度器分配任務(wù)并調(diào)度Worker開始運(yùn)行。

spark RDD有什么特點(diǎn)

以下面一個(gè)按A-Z首字母分類,查找相同首字母下不同姓名總個(gè)數(shù)的例子來看一下RDD是如何運(yùn)行起來的。

spark RDD有什么特點(diǎn)

步驟1:創(chuàng)建RDD。上面的例子除去最后一個(gè)collect是個(gè)動(dòng)作,不會(huì)創(chuàng)建RDD之外,前面四個(gè)轉(zhuǎn)換都會(huì)創(chuàng)建出新的RDD。因此第一步就是創(chuàng)建好所有RDD(內(nèi)部的五項(xiàng)信息)。

步驟2:創(chuàng)建執(zhí)行計(jì)劃。Spark會(huì)盡可能地管道化,并基于是否要重新組織數(shù)據(jù)來劃分 階段(stage),例如本例中的groupBy()轉(zhuǎn)換就會(huì)將整個(gè)執(zhí)行計(jì)劃劃分成兩階段執(zhí)行。最終會(huì)產(chǎn)生一個(gè) DAG(directed acyclic graph,有向無環(huán)圖)作為邏輯執(zhí)行計(jì)劃。

spark RDD有什么特點(diǎn)

步驟3:調(diào)度任務(wù)。將各階段劃分成不同的 任務(wù)(task),每個(gè)任務(wù)都是數(shù)據(jù)和計(jì)算的合體。在進(jìn)行下一階段前,當(dāng)前階段的所有任務(wù)都要執(zhí)行完成。因?yàn)橄乱浑A段的第一個(gè)轉(zhuǎn)換一定是重新組織數(shù)據(jù)的,所以必須等當(dāng)前階段所有結(jié)果數(shù)據(jù)都計(jì)算出來了才能繼續(xù)。

感謝各位的閱讀!關(guān)于“spark RDD有什么特點(diǎn)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI