大數(shù)據(jù)技術植锉,Spark之RDD辫樱,這些就夠了,RDD超詳細總結(一)

一俊庇、RDD為什么出現(xiàn)狮暑?

在實際開發(fā)應用中,存在許多迭代式計算暇赤,這些應用場景的共同之處是心例,不同計算階段之間會重用中間結果宵凌,即一個階段的輸出結果會作為下一個階段的輸入鞋囊。

以前常用的MapReduce框架是把中間結果寫入到HDFS中,帶來了大量的數(shù)據(jù)復制瞎惫、磁盤IO和序列化開銷溜腐。

如果有一種方法,能將結果保存在內存當中瓜喇,就可以大量減少IO消耗挺益。RDD一種彈性分布數(shù)據(jù)集,就是為了滿足這種需求而出現(xiàn)的乘寒,它提供了一個抽象的數(shù)據(jù)架構望众,我們不必擔心底層數(shù)據(jù)的分布式特性,只需將具體的應用邏輯表達為一系列轉換處理伞辛。

不同RDD之間的轉換操作形成依賴關系烂翰,可以實現(xiàn)管道化,從而避免了中間結果的落地存儲蚤氏,大大降低了數(shù)據(jù)復制甘耿、磁盤IO和序列化開銷。

二竿滨、RDD是什么佳恬?

一個RDD就是一個分布式對象集合,本質上是一個只讀的分區(qū)記錄集合于游,每個RDD可以分成多個分區(qū)毁葱,每個分區(qū)就是一個數(shù)據(jù)集片段(HDFS上的塊),并且一個RDD的不同分區(qū)可以被保存到集群中不同的節(jié)點上贰剥,從而可以在集群中的不同節(jié)點上進行并行計算倾剿。

RDD提供了一種高度受限的共享內存模型,即RDD是只讀的記錄分區(qū)的集合鸠澈,不能直接修改柱告,只能基于穩(wěn)定的物理存儲中的數(shù)據(jù)集來創(chuàng)建RDD截驮,或者通過在其他RDD上執(zhí)行確定的轉換操作(如map、join和groupBy)而創(chuàng)建得到新的RDD际度。

RDD提供了一組豐富的操作以支持常見的數(shù)據(jù)運算葵袭,分為“行動”(Action)和“轉換”(Transformation)兩種類型的算子,前者用于執(zhí)行計算并指定輸出的形式乖菱,后者指定RDD之間的相互依賴關系坡锡。

兩類操作的主要區(qū)別是,轉換操作(比如map窒所、filter鹉勒、groupBy、join等)接受RDD并返回RDD吵取,而行動操作(比如count禽额、collect等)接受RDD但是返回非RDD(即輸出一個值或結果)。

三皮官、RDD的執(zhí)行過程

RDD開發(fā)執(zhí)行

1脯倒、RDD讀入外部數(shù)據(jù)源(或者內存中的數(shù)據(jù)集)進行創(chuàng)建;注意:RDD讀取數(shù)據(jù)時捺氢,一般默認2個分區(qū)藻丢。

2、RDD經(jīng)過一系列的“轉換”操作摄乒,每一次都會產(chǎn)生不同的RDD悠反,供給下一個“轉換”使用;

3馍佑、最后一個RDD經(jīng)“行動”操作進行處理斋否,并輸出到外部數(shù)據(jù)源,或者變成Scala/JAVA集合或變量挤茄。

值得注意的是如叼,RDD采用了惰性調用,即在RDD的執(zhí)行過程中穷劈,真正的計算發(fā)生在RDD的“行動”操作笼恰,對于“行動”之前的所有“轉換”操作,Spark只是記錄下“轉換”操作應用的一些基礎數(shù)據(jù)集以及RDD生成的軌跡歇终,即相互之間的依賴關系社证,而不會觸發(fā)真正的計算。

RDD血緣依賴轉換流程

RDD血緣關系

從數(shù)據(jù)輸入评凝,到邏輯上生成A和C兩個RDD追葡,經(jīng)過一系列“轉換”操作,邏輯上生成了F,也是一個RDD宜肉。之所以說是邏輯上匀钧,是因為這時候計算并沒有發(fā)生,只是記錄了RDD之間的生成和依賴關系谬返。當F要進行輸出時之斯,也就是當F進行“行動”操作的時候,Spark才會根據(jù)RDD的依賴關系生成DAG遣铝,并從起點開始真正的計算佑刷。

這一處理過程:稱為一個“血緣關系(Lineage)”,即DAG拓撲排序的結果酿炸。

Spark采用惰性調用瘫絮,通過血緣關系連接起來的一系列RDD操作就可以實現(xiàn)管道化(pipeline),避免了多次轉換操作之間數(shù)據(jù)同步的等待填硕,而且不用擔心有過多的中間數(shù)據(jù)麦萤。

因為這些具有血緣關系的操作都管道化了,一個操作得到的結果不需要保存為中間數(shù)據(jù)廷支,而是直接管道式地流入到下一個操作進行處理频鉴。

同時,這種通過血緣關系就是把一系列操作進行管道化連接的設計方式恋拍,也使得管道中每次操作的計算變得相對簡單,保證了每個操作在處理邏輯上的單一性藕甩;相反施敢,在MapReduce的設計中,為了盡可能地減少MapReduce過程狭莱,在單個MapReduce中會寫入過多復雜的邏輯僵娃。

下面我們以具體代碼來講解RDD執(zhí)行過程:

object SparkTest {  
  def main(args: Array[String]): Unit = { 
    val conf = new SparkConf.setAppName("SparkTest").setMaster("local[*]")  
    val sparkContext = new SparkContext(conf)  
    val line :RDD = sparkContext.textFile("filepath")  
    val filt = line.filter(_.contains("spark"))  
    val data = filt.cache().count()  println(count)  
  }
}

從上可以看出,一個Spark應用程序腋妙,基本是基于RDD的一系列計算操作默怨。

第1行代碼用于創(chuàng)建SparkContext對象,執(zhí)行上下文環(huán)境骤素;

第2行代碼從文件中讀取數(shù)據(jù)創(chuàng)建一個RDD匙睹;

第3行代碼對讀取的數(shù)據(jù),返回的RDD進行轉換操作得到一個新的RDD济竹,即filterRDD痕檬;

filt.cache()表示對lines進行持久化,把它保存在內存或磁盤中送浊。這里采用cache接口把數(shù)據(jù)集保存在內存中梦谜,方便后續(xù)重復使用。

注意:當數(shù)據(jù)被反復訪問時,比如查詢一些熱點數(shù)據(jù)唁桩、或者運行迭代算法時闭树,把數(shù)據(jù)緩存到內存中這是非常有用的。****而且通過cache()可以緩存非常大的數(shù)據(jù)集荒澡,支持跨越幾十甚至上百個節(jié)點蔼啦;****filt.count()是一個行動操作,用于計算一個RDD集合中包含的元素個數(shù)仰猖。

這個程序的執(zhí)行過程如下:

  1. 創(chuàng)建這個Spark程序的執(zhí)行上下文捏肢,即創(chuàng)建SparkContext對象;
  2. 從外部數(shù)據(jù)源中讀取數(shù)據(jù)創(chuàng)建fileRDD對象饥侵;
  3. 構建起fileRDD和filterRDD之間的依賴關系鸵赫,形成DAG圖,這時候并沒有發(fā)生真正的計算躏升,只是記錄轉換的軌跡辩棒,也就是血緣依賴關系;
  4. 執(zhí)行action代碼時膨疏,count()是一個行動類型的RDD一睁,觸發(fā)真正的計算。開始執(zhí)行從fileRDD到filterRDD的轉換操作佃却,并把結果持久化到內存中者吁,最后計算出filterRDD中包含的元素個數(shù)。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末饲帅,一起剝皮案震驚了整個濱河市复凳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灶泵,老刑警劉巖育八,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赦邻,居然都是意外死亡髓棋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門惶洲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來按声,“玉大人,你說我怎么就攤上這事湃鹊∪搴埃” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵币呵,是天一觀的道長怀愧。 經(jīng)常有香客問我侨颈,道長,這世上最難降的妖魔是什么芯义? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任哈垢,我火速辦了婚禮,結果婚禮上扛拨,老公的妹妹穿的比我還像新娘耘分。我一直安慰自己,他們只是感情好绑警,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布求泰。 她就那樣靜靜地躺著,像睡著了一般计盒。 火紅的嫁衣襯著肌膚如雪渴频。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天北启,我揣著相機與錄音卜朗,去河邊找鬼。 笑死咕村,一個胖子當著我的面吹牛场钉,可吹牛的內容都是我干的。 我是一名探鬼主播懈涛,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逛万,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肩钠?” 一聲冷哼從身側響起泣港,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎价匠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呛每,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡踩窖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晨横。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洋腮。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖手形,靈堂內的尸體忽然破棺而出啥供,到底是詐尸還是另有隱情,我是刑警寧澤库糠,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布伙狐,位于F島的核電站涮毫,受9級特大地震影響,放射性物質發(fā)生泄漏贷屎。R本人自食惡果不足惜罢防,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唉侄。 院中可真熱鬧咒吐,春花似錦、人聲如沸属划。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同眯。三九已至绽昼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗽测,已是汗流浹背绪励。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唠粥,地道東北人疏魏。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像晤愧,于是被迫代替她去往敵國和親大莫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354