spark RDD詳解

一、 RDD概念

1.1苍日、RDD為什么會產(chǎn)生惭聂?

RDD是Spark的基石,是實現(xiàn)Spark數(shù)據(jù)處理的核心抽象相恃。那么RDD為什么會產(chǎn)生呢辜纲?
Hadoop的MapReduce是一種基于數(shù)據(jù)集的工作模式,面向數(shù)據(jù)拦耐,這種工作模式一般是從存儲上加載數(shù)據(jù)集耕腾,然后操作數(shù)據(jù)集,最后寫入物理存儲設(shè)備杀糯。數(shù)據(jù)更多面臨的是一次性處理扫俺。
MR的這種方式對數(shù)據(jù)領(lǐng)域兩種常見的操作不是很高效。第一種是迭代式的算法固翰。比如機(jī)器學(xué)習(xí)中ALS狼纬、凸優(yōu)化梯度下降等。這些都需要基于數(shù)據(jù)集或者數(shù)據(jù)集的衍生數(shù)據(jù)反復(fù)查詢反復(fù)操作倦挂。MR這種模式不太合適畸颅,即使多MR串行處理,性能和時間也是一個問題方援。數(shù)據(jù)的共享依賴于磁盤没炒。另外一種是交互式數(shù)據(jù)挖掘,MR顯然不擅長。

MR中的迭代:


MR中的迭代.png

Spark中的迭代:


Spark中的迭代.png

我們需要一個效率非乘突穑快拳话,且能夠支持迭代計算和有效數(shù)據(jù)共享的模型,Spark應(yīng)運而生种吸。RDD是基于工作集的工作模式弃衍,更多的是面向工作流。但是無論是MR還是RDD都應(yīng)該具有類似位置感知坚俗、容錯和負(fù)載均衡等特性镜盯。

1.2、RDD概述

1.2.1猖败、什么是RDD

RDD(Resilient Distributed Dataset)叫做分布式數(shù)據(jù)集速缆,是Spark中最基本的數(shù)據(jù)抽象,它代表一個不可變恩闻、可分區(qū)艺糜、里面的元素可并行計算的集合。在 Spark 中幢尚,對數(shù)據(jù)的所有操作不外乎創(chuàng)建 RDD破停、轉(zhuǎn)化已有RDD 以及調(diào)用 RDD 操作進(jìn)行求值。每個 RDD 都被分為多個分區(qū)尉剩,這些分區(qū)運行在集群中的不同節(jié)點上真慢。RDD 可以包含 Python、Java边涕、Scala 中任意類型的對象晤碘, 甚至可以包含用戶自定義的對象。RDD具有數(shù)據(jù)流模型的特點:自動容錯功蜓、位置感知性調(diào)度和可伸縮性。RDD允許用戶在執(zhí)行多個查詢時顯式地將工作集緩存在內(nèi)存中宠蚂,后續(xù)的查詢能夠重用工作集式撼,這極大地提升了查詢速度。

RDD支持兩種操作:轉(zhuǎn)化操作和行動操作求厕。RDD 的轉(zhuǎn)化操作是返回一個新的RDD的操作著隆,比如 map()和 filter(),而行動操作則是向驅(qū)動器程序返回結(jié)果或把結(jié)果寫入外部系統(tǒng)的操作呀癣。比如 count() 和 first()美浦。

Spark采用惰性計算模式,RDD只有遇到action算子项栏,產(chǎn)生行動操作浦辨,才會真正計算。如果想在多個行動操作中重用同一個 RDD沼沈,可以使用 RDD.persist() 讓 Spark 把這個 RDD 緩存下來流酬。

緩存RDD.png

1.2.2币厕、RDD的屬性

RDD的屬性.png
  • 一組分片(Partition),即數(shù)據(jù)集的基本組成單位芽腾。對于RDD來說旦装,每個分片都會被一個計算任務(wù)處理,并決定并行計算的粒度摊滔。用戶可以在創(chuàng)建RDD時指定RDD的分片個數(shù)阴绢,如果沒有指定,那么就會采用默認(rèn)值艰躺。默認(rèn)值就是程序所分配到的CPU Core的數(shù)目旱函。

  • 一個計算每個分區(qū)的函數(shù)。Spark中RDD的計算是以分片為單位的描滔,我們在代碼中只要關(guān)注對RDD執(zhí)行算子棒妨,spark底層實現(xiàn)會將該算子應(yīng)用于不同結(jié)點當(dāng)中的各個分片。

  • RDD之間的依賴關(guān)系含长。RDD的每次轉(zhuǎn)換都會生成一個新的RDD券腔,所以RDD之間就會形成類似于流水線一樣的前后依賴關(guān)系。在部分分區(qū)數(shù)據(jù)丟失時拘泞,Spark可以通過這個依賴關(guān)系重新計算丟失的分區(qū)數(shù)據(jù)纷纫,而不是對RDD的所有分區(qū)進(jìn)行重新計算,這里其實也要分情況細(xì)說陪腌,spark有寬依賴和窄依賴辱魁,上述情況針對窄依賴是可以行的通的,因為窄依賴的定義是诗鸭,一個子RDD只有一個父RDD染簇,這樣修復(fù)數(shù)據(jù)是不會影響到其他RDD的,但是寬依賴一個子RDD可能對應(yīng)多個父RDD强岸,如果只重跑父RDD中部分分片锻弓,會造成其他RDD存在重復(fù)數(shù)據(jù)的現(xiàn)象,所以針對寬依賴的情況蝌箍,盡量在關(guān)鍵位置青灼,手動緩存RDD,避免一個RDD分區(qū)丟失 妓盲,造成全局重跑的現(xiàn)象杂拨。

  • 一個Partitioner,即RDD的分片函數(shù)悯衬。當(dāng)前Spark中實現(xiàn)了兩種類型的分片函數(shù)弹沽,一個是基于哈希的HashPartitioner,另外一個是基于范圍的RangePartitioner。只有對于于key-value的RDD贷币,才會有Partitioner击胜,非key-value的RDD的Parititioner的值是None。Partitioner函數(shù)不但決定了RDD本身的分片數(shù)量役纹,也決定了parent RDD Shuffle輸出時的分片數(shù)量偶摔。

  • 一個列表,存儲存取每個分片的優(yōu)先位置(preferred location)促脉。對于一個HDFS文件來說辰斋,這個列表保存的就是每個分片所在的塊的位置。按照“移動數(shù)據(jù)不如移動計算”的理念瘸味,Spark在進(jìn)行任務(wù)調(diào)度的時候宫仗,會盡可能地將計算任務(wù)分配到其所要處理數(shù)據(jù)塊的存儲位置。(其實也是mapreduce當(dāng)中的本地優(yōu)先化)

6)RDD是一個應(yīng)用層面的邏輯概念旁仿。一個RDD多個分片藕夫。RDD就是一個元數(shù)據(jù)記錄集,記錄了RDD內(nèi)存所有的關(guān)系數(shù)據(jù)枯冈。

RDD邏輯圖.png

1.2.3毅贮、RDD彈性

  • 自動進(jìn)行內(nèi)存和磁盤數(shù)據(jù)存儲的切換

Spark優(yōu)先把數(shù)據(jù)放到內(nèi)存中,如果內(nèi)存放不下尘奏,就會放到磁盤里面滩褥,程序進(jìn)行自動的存儲切換。

  • 基于血統(tǒng)的高效容錯機(jī)制

在RDD進(jìn)行轉(zhuǎn)換和動作的時候炫加,會形成RDD的Lineage依賴鏈瑰煎,當(dāng)某一個RDD失效的時候,可以通過重新計算上游的RDD來重新生成丟失的RDD數(shù)據(jù)俗孝。

  • Task如果失敗會自動進(jìn)行特定次數(shù)的重試

RDD的計算任務(wù)如果運行失敗酒甸,會自動進(jìn)行任務(wù)的重新計算,默認(rèn)次數(shù)是4次驹针。

  • Stage如果失敗會自動進(jìn)行特定次數(shù)的重試

如果Job的某個Stage階段計算失敗烘挫,框架也會自動進(jìn)行任務(wù)的重新計算,默認(rèn)次數(shù)也是4次柬甥。

  • Checkpoint和Persist可主動或被動觸發(fā)

RDD可以通過Persist或者通過cache持久化將RDD緩存到內(nèi)存或者磁盤,當(dāng)再次用到該RDD時直接讀取就行其垄。也可以將RDD進(jìn)行檢查點苛蒲,檢查點會將數(shù)據(jù)存儲在HDFS中,該RDD的所有父RDD依賴都會被移除绿满。

RDD持久化.png
  • 數(shù)據(jù)調(diào)度彈性
    Spark把這個job執(zhí)行模型抽象為通用的有向無環(huán)圖DAG臂外,可以將多Stage的任務(wù)串聯(lián)或并行執(zhí)行,調(diào)度引擎自動處理Stage的失敗以及Task的失敗。

  • 數(shù)據(jù)分片的高度彈性
    可以根據(jù)業(yè)務(wù)的特征漏健,動態(tài)調(diào)整數(shù)據(jù)分片的個數(shù)嚎货,提升整體的應(yīng)用執(zhí)行效率。

1.4蔫浆、RDD特點

RDD表示只讀的分區(qū)的數(shù)據(jù)集殖属,對RDD進(jìn)行改動,只能通過RDD的轉(zhuǎn)換操作瓦盛,由一個RDD得到一個新的RDD洗显,新的RDD包含了從其他RDD衍生所必需的信息。RDD之間存在依賴原环,RDD的執(zhí)行是按照血緣關(guān)系延時計算的挠唆。如果血緣關(guān)系較長,可以通過持久化RDD來切斷血緣關(guān)系嘱吗,就是上文描述的檢查點checkpoint玄组。

1.4.1、分區(qū)

分區(qū).png

1.4.2谒麦、只讀

如下圖所示俄讹,RDD是只讀的,要想改變RDD中的數(shù)據(jù)弄匕,只能在現(xiàn)有的RDD基礎(chǔ)上創(chuàng)建新的RDD颅悉。


只讀.png

由一個RDD轉(zhuǎn)換到另一個RDD,可以通過豐富的操作算子實現(xiàn)迁匠,不再像MapReduce那樣只能寫map和reduce了剩瓶,如下圖所示。

豐富的算子.png

RDD的操作算子包括兩類城丧,一類叫做transformations延曙,它是用來將RDD進(jìn)行轉(zhuǎn)化,構(gòu)建RDD的血緣關(guān)系亡哄;另一類叫做actions枝缔,它是用來觸發(fā)RDD的計算,得到RDD的相關(guān)計算結(jié)果或者將RDD保存的文件系統(tǒng)中蚊惯。下圖是RDD所支持的操作算子列表愿卸。

transformations和action.png

1.4.3、依賴

RDD通過操作算子進(jìn)行轉(zhuǎn)換截型,轉(zhuǎn)換得到的新RDD包含了從其他RDD衍生所必需的信息趴荸,RDD之間維護(hù)著這種血緣關(guān)系,也稱之為依賴宦焦。如下圖所示发钝,依賴包括兩種顿涣,一種是窄依賴,RDD之間分區(qū)是一一對應(yīng)的酝豪,另一種是寬依賴涛碑,下游RDD的每個分區(qū)與上游RDD(也稱之為父RDD)的每個分區(qū)都有關(guān),是多對多的關(guān)系孵淘。


RDD依賴.png

通過RDD之間的這種依賴關(guān)系蒲障,一個任務(wù)流可以描述為DAG(有向無環(huán)圖),如下圖所示夺英,在實際執(zhí)行過程中寬依賴對應(yīng)于Shuffle(圖中的reduceByKey和join)晌涕,窄依賴中的所有轉(zhuǎn)換操作可以通過類似于管道的方式一氣呵成執(zhí)行(圖中map和union可以一起執(zhí)行)。

DAG圖.png

1.4.4痛悯、緩存

如果在應(yīng)用程序中多次使用同一個RDD余黎,可以將該RDD緩存起來,該RDD只有在第一次計算的時候會根據(jù)血緣關(guān)系得到分區(qū)的數(shù)據(jù)载萌,在后續(xù)其他地方用到該RDD的時候惧财,會直接從緩存處取而不用再根據(jù)血緣關(guān)系計算,這樣就加速后期的重用扭仁。如下圖所示垮衷,RDD-1經(jīng)過一系列的轉(zhuǎn)換后得到RDD-n并保存到hdfs,RDD-1在這一過程中會有個中間結(jié)果乖坠,如果將其緩存到內(nèi)存搀突,那么在隨后的RDD-1轉(zhuǎn)換到RDD-m這一過程中,就不會計算其之前的RDD-0了熊泵。

緩存.png

1.4.5仰迁、checkpoint

雖然RDD的血緣關(guān)系天然地可以實現(xiàn)容錯,當(dāng)RDD的某個分區(qū)數(shù)據(jù)失敗或丟失顽分,可以通過血緣關(guān)系重建徐许。但是對于長時間迭代型應(yīng)用來說,隨著迭代的進(jìn)行卒蘸,RDD之間的血緣關(guān)系會越來越長雌隅,一旦在后續(xù)迭代過程中出錯,則需要通過非常長的血緣關(guān)系去重建缸沃,勢必影響性能恰起。為此,RDD支持checkpoint將數(shù)據(jù)保存到持久化的存儲中趾牧,這樣就可以切斷之前的血緣關(guān)系村缸,因為checkpoint后的RDD不需要知道它的父RDD了,它可以從checkpoint處拿到數(shù)據(jù)武氓。

給定一個RDD我們至少可以知道如下幾點信息:1梯皿、分區(qū)數(shù)以及分區(qū)方式;2县恕、由父RDD衍生而來的相關(guān)依賴信息东羹;3、計算每個分區(qū)的數(shù)據(jù)忠烛,計算步驟為:1)如果被緩存属提,則從緩存中取的分區(qū)的數(shù)據(jù);2)如果被checkpoint美尸,則從checkpoint處恢復(fù)數(shù)據(jù)冤议;3)根據(jù)血緣關(guān)系計算分區(qū)的數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末师坎,一起剝皮案震驚了整個濱河市恕酸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胯陋,老刑警劉巖蕊温,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遏乔,居然都是意外死亡义矛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門盟萨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凉翻,“玉大人,你說我怎么就攤上這事捻激≈坪洌” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵铺罢,是天一觀的道長艇挨。 經(jīng)常有香客問我,道長韭赘,這世上最難降的妖魔是什么缩滨? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮泉瞻,結(jié)果婚禮上脉漏,老公的妹妹穿的比我還像新娘。我一直安慰自己袖牙,他們只是感情好侧巨,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鞭达,像睡著了一般司忱。 火紅的嫁衣襯著肌膚如雪皇忿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天坦仍,我揣著相機(jī)與錄音鳍烁,去河邊找鬼。 笑死繁扎,一個胖子當(dāng)著我的面吹牛幔荒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梳玫,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼爹梁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了提澎?” 一聲冷哼從身側(cè)響起姚垃,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虱朵,沒想到半個月后莉炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡碴犬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年絮宁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片服协。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡绍昂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偿荷,到底是詐尸還是另有隱情窘游,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布跳纳,位于F島的核電站忍饰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寺庄。R本人自食惡果不足惜艾蓝,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斗塘。 院中可真熱鬧赢织,春花似錦、人聲如沸馍盟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贞岭。三九已至八毯,卻和暖如春搓侄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宪彩。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工休讳, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尿孔。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像筹麸,于是被迫代替她去往敵國和親活合。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容