『 Spark 』4. spark 之 RDD

『 Spark 』4. spark 之 RDD - 簡(jiǎn)書
http://www.reibang.com/p/0d2b2503993f

原文鏈接
寫在前面
本系列是綜合了自己在學(xué)習(xí)spark過(guò)程中的理解記錄 + 對(duì)參考文章中的一些理解 + 個(gè)人實(shí)踐spark過(guò)程中的一些心得而來(lái)。寫這樣一個(gè)系列僅僅是為了梳理個(gè)人學(xué)習(xí)spark的筆記記錄,所以一切以能夠理解為主,沒(méi)有必要的細(xì)節(jié)就不會(huì)記錄了坯辩,而且文中有時(shí)候會(huì)出現(xiàn)英文原版文檔,只要不影響理解蹋盆,都不翻譯了费薄。若想深入了解,最好閱讀參考文章和官方文檔栖雾。
其次楞抡,本系列是基于目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快析藕,記錄一下版本好還是必要的召廷。最后,如果各位覺(jué)得內(nèi)容有誤账胧,歡迎留言備注竞慢,所有留言 24 小時(shí)內(nèi)必定回復(fù),非常感謝治泥。Tips: 如果插圖看起來(lái)不明顯筹煮,可以:1. 放大網(wǎng)頁(yè);2. 新標(biāo)簽中打開圖片居夹,查看原圖哦败潦。

  1. 什么是RDD
    先看下源碼里是怎么描述RDD的。
    Internally, each RDD is characterized by five main properties: A list of partitions A function for computing each split A list of dependencies on other RDDs Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned) Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

可以知道准脂,每個(gè) RDD 有以下5個(gè)主要的屬性:
一組分片(partition)变屁,即數(shù)據(jù)集的基本組成單位
一個(gè)計(jì)算每個(gè)分片的函數(shù)
對(duì)parent RDD的依賴,這個(gè)依賴描述了RDD之間的lineage

對(duì)于key-value的RDD意狠,一個(gè)Partitioner,這是可選擇的
一個(gè)列表疮胖,存儲(chǔ)存取每個(gè)partition的preferred位置环戈。對(duì)于一個(gè)HDFS文件來(lái)說(shuō),存儲(chǔ)每個(gè)partition所在的塊的位置澎灸。這也是可選擇的

把上面這5個(gè)主要的屬性總結(jié)一下院塞,可以得出RDD的大致概念:
首先,RDD 大概是這樣一種表示數(shù)據(jù)集的東西性昭,它具有以上列出的一些屬性拦止。是設(shè)計(jì)用來(lái)表示數(shù)據(jù)集的一種數(shù)據(jù)結(jié)構(gòu)。為了讓 RDD 能 handle 更多的問(wèn)題糜颠,規(guī)定 RDD 應(yīng)該是只讀的汹族,分區(qū)記錄的一種數(shù)據(jù)集合∑湫耍可以通過(guò)兩種方式來(lái)創(chuàng)建 RDD:一種是基于物理存儲(chǔ)中的數(shù)據(jù)顶瞒,比如說(shuō)磁盤上的文件;另一種元旬,也是大多數(shù)創(chuàng)建 RDD 的方式榴徐,即通過(guò)其他 RDD 來(lái)創(chuàng)建【以后叫做轉(zhuǎn)換】而成守问。而正因?yàn)?RDD 滿足了這么多特性,所以 spark 把 RDD 叫做Resilient Distributed Datasets
坑资,中文叫做彈性分布式數(shù)據(jù)集耗帕。很多文章都是先講 RDD 的定義,概念袱贮,再來(lái)說(shuō) RDD 的特性仿便。我覺(jué)得其實(shí)也可以倒過(guò)來(lái),通過(guò) RDD 的特性反過(guò)來(lái)理解 RDD 的定義和概念字柠,通過(guò)這種由果溯因的方式來(lái)理解 RDD 也未嘗不可探越,至少對(duì)我個(gè)人而言這種方式是挺好的。

  1. 理解RDD的幾個(gè)關(guān)鍵概念
    本來(lái)我是想?yún)⒖?RDD 的論文和自己的理解來(lái)整理這篇文章的窑业,可是后來(lái)想想這樣是不是有點(diǎn)過(guò)于細(xì)致了钦幔。我想,認(rèn)識(shí)一個(gè)新事物常柄,在時(shí)間鲤氢、資源有限的情況下,不必錙銖必較西潘,可以先 focus on 幾個(gè)關(guān)鍵點(diǎn)卷玉,到后期應(yīng)用的時(shí)候再步步深入。
    所以喷市,按照我個(gè)人的理解相种,我認(rèn)為想用好 spark,必須要理解 RDD 品姓,而為了理解 RDD 寝并,我認(rèn)為只要了解下面幾個(gè) RDD 的幾個(gè)關(guān)鍵點(diǎn)就能 handle 很多情況下的問(wèn)題了。所以腹备,下面所有列到的點(diǎn)衬潦,都是在我個(gè)人看來(lái)很重要的,但也許有所欠缺植酥,大家如果想繼續(xù)深入镀岛,可以看第三部分列出的參考資料,或者直接聯(lián)系我友驮,互相交流漂羊。
    2.1 RDD的背景及解決的痛點(diǎn)問(wèn)題
    RDD 的設(shè)計(jì)是為了充分利用分布式系統(tǒng)中的內(nèi)存資源,使得提升一些特定的應(yīng)用的效率卸留。這里所謂的特定的應(yīng)用沒(méi)有明確定義拨与,但可以理解為一類應(yīng)用到迭代算法,圖算法等需要重復(fù)利用數(shù)據(jù)的應(yīng)用類型艾猜;除此之外买喧,RDD 還可以應(yīng)用在交互式大數(shù)據(jù)處理方面捻悯。所以,我們這里需要明確一下:RDD并不是萬(wàn)能的淤毛,也不是什么帶著紗巾的少女那樣神奇今缚。簡(jiǎn)單的理解,就是一群大牛為了解決一個(gè)問(wèn)題而設(shè)計(jì)的一個(gè)特定的數(shù)據(jù)結(jié)構(gòu)低淡,that's all
    姓言。
    2.2 What is DAG - 趣說(shuō)有向無(wú)環(huán)圖
    DAG - Direct Acyclic Graph,有向無(wú)環(huán)圖蔗蹋,好久沒(méi)看圖片了何荚,先發(fā)個(gè)圖片來(lái)理解理解吧。


    DAG

要理解DAG猪杭,只需弄明白三個(gè)概念就可以畢業(yè)了餐塘,首先,我們假設(shè)上圖圖二中的A,B,C,D,E都代表spark里不同的RDD:
圖:圖是表達(dá)RDD Lineage
信息的一個(gè)結(jié)構(gòu)皂吮,在 spark 中戒傻,大部分 RDD 都是通過(guò)其他 RDD 進(jìn)行轉(zhuǎn)換而來(lái)的,比如說(shuō)上圖圖二中蜂筹,B和D都是通過(guò)A轉(zhuǎn)換而來(lái)的需纳,而C是通過(guò)B轉(zhuǎn)換而來(lái),E的話是通過(guò)B和D一起轉(zhuǎn)換來(lái)的艺挪。
有向:有向就更容易理解了不翩,簡(jiǎn)單來(lái)說(shuō)就是 linage 是一個(gè) top-down 的結(jié)構(gòu),而且是時(shí)間序列上的 top-down 結(jié)構(gòu)麻裳,這里如果沒(méi)有理解的話慌盯,我們?cè)谙旅嬷v“無(wú)環(huán)”這個(gè)概念時(shí)一起說(shuō)明。
無(wú)環(huán):這里就是重點(diǎn)要理解的地方了掂器,spark 的優(yōu)化器在這里也發(fā)揮了很大的作用。首先俱箱,我們先理解一下無(wú)環(huán)的概念国瓮,假設(shè)有圖三中左下 B,D,E 這樣一個(gè) RDD 轉(zhuǎn)換圖,那當(dāng)我們的需要執(zhí)行 D.collect 操作的時(shí)候狞谱,就會(huì)引發(fā)一個(gè)死循環(huán)了乃摹。不過(guò),仔細(xì)想過(guò)的話跟衅,就會(huì)知道孵睬,“無(wú)環(huán)”這個(gè)問(wèn)題其實(shí)已經(jīng)在“有向”這個(gè)概念中提現(xiàn)了,上面說(shuō)的“有向”伶跷,其實(shí)更詳細(xì)的說(shuō)是一個(gè)時(shí)間上的先來(lái)后到掰读,即祖先與子孫的關(guān)系秘狞,是不可逆的。

2.3 What is Data Locality - RDD的位置可見(jiàn)性
這個(gè)問(wèn)題就不重復(fù)造輪子了蹈集,直接引用Quora上的一個(gè)問(wèn)答了:
RDD is a dataset which isdistributed
, that is, it is divided into"partitions"
. Each of these partitions can be present in the memory or disk of different machines. If you want Spark to process the RDD, then Spark needs tolaunch one task per partition of the RDD
. It's best that each task be sent to the machine have the partition that task is supposed to process. In that case, the task will be able to read the data of the partition from the local machine. Otherwise, the task would have to pull the partition data over the network from a different machine, which is less efficient. This scheduling of tasks (that is, allocation of tasks to machines) such that the tasks can read data "locally" is known as "locality aware scheduling
".
2.4 What is Lazy Evaluation - 神馬叫惰性求值
本來(lái)不想叫“惰性求值”的烁试,看到“惰”這個(gè)字實(shí)在是各種不爽,實(shí)際上拢肆,我覺(jué)得應(yīng)該叫"后續(xù)求值"减响,"按需計(jì)算","晚點(diǎn)搞"這類似的郭怪,哈哈支示。這幾天一直在想應(yīng)該怎么簡(jiǎn)單易懂地來(lái)表達(dá)Lazy Evaluation這個(gè)概念,本來(lái)打算引用MongoDB的Cursor來(lái)類比一下的鄙才,可總覺(jué)得還是小題大做了颂鸿。這個(gè)概念就懶得解釋了,主要是覺(jué)得太簡(jiǎn)單了咒循,沒(méi)有必要把事情搞得這么復(fù)雜据途,哈哈。
2.5 What is Narrow/Wide Dependency - RDD的寬依賴和窄依賴
首先叙甸,先從原文看看寬依賴和窄依賴各自的定義颖医。
narrow dependencies
: where each partition of the parent RDD is used by at most one partition of the child RDD,wide dependencis
, where multiple child partitions may depend on it.
按照這篇RDD論文中文譯文的解釋,窄依賴是指子RDD的每個(gè)分區(qū)依賴于常數(shù)個(gè)父分區(qū)(即與數(shù)據(jù)規(guī)模無(wú)關(guān))裆蒸;寬依賴指子RDD的每個(gè)分區(qū)依賴于所有父RDD分區(qū)熔萧。暫且不說(shuō)這樣理解是否有偏差,我們先來(lái)從兩個(gè)方面了解下計(jì)算一個(gè)窄依賴的子RDD和一個(gè)寬依賴的RDD時(shí)具體都有什么區(qū)別僚祷,然后再回顧這個(gè)定義佛致。
計(jì)算方面:
計(jì)算窄依賴的子RDD:可以在某一個(gè)計(jì)算節(jié)點(diǎn)上直接通過(guò)父RDD的某幾塊數(shù)據(jù)(通常是一塊)計(jì)算得到子RDD某一塊的數(shù)據(jù);
計(jì)算寬依賴的子RDD:子RDD某一塊數(shù)據(jù)的計(jì)算必須等到它的父RDD所有數(shù)據(jù)都計(jì)算完成之后才可以進(jìn)行辙谜,而且需要對(duì)父RDD的計(jì)算結(jié)果進(jìn)行hash并傳遞到對(duì)應(yīng)的節(jié)點(diǎn)之上俺榆;

容錯(cuò)恢復(fù)方面:
窄依賴:當(dāng)父RDD的某分片丟失時(shí),只有丟失的那一塊數(shù)據(jù)需要被重新計(jì)算装哆;
寬依賴:當(dāng)父RDD的某分片丟失時(shí)罐脊,需要把父RDD的所有分區(qū)數(shù)據(jù)重新計(jì)算一次,計(jì)算量明顯比窄依賴情況下大很多蜕琴;

spark-rdd-dependency.png

  1. 尚未提到的一些重要概念
    還有一些基本概念上面沒(méi)有提到萍桌,一些是因?yàn)樽约哼€沒(méi)怎么弄清楚,一些是覺(jué)得重要但是容易理解的凌简,所以就先不記錄下來(lái)了上炎。比如說(shuō):粗粒度、細(xì)粒度雏搂;序列化和反序列化等藕施。
  2. Next
    基礎(chǔ)的概念和理論都講得差不多了寇损,該小試牛刀了,哈哈铅碍。
    下幾篇的安排:
    列一些學(xué)習(xí) spark 比較好的資源

詳細(xì)從 job润绵,stage,task 的定義來(lái)談?wù)?spark 的運(yùn)行原理
準(zhǔn)備幾個(gè)稍稍復(fù)雜一點(diǎn)的例子
, 例子個(gè)數(shù)根據(jù)時(shí)間安排發(fā)布spark 在金融領(lǐng)域的應(yīng)用之 指數(shù)相似度計(jì)算
spark 在搜索領(lǐng)域的應(yīng)用之 pagerank
spark 在社交領(lǐng)域的應(yīng)用之 評(píng)分計(jì)算

開始講dataframe 和 datasets

  1. 打開微信胞谈,掃一掃尘盼,點(diǎn)一點(diǎn),棒棒的烦绳,_
    wechat_pay.png

參考文章
Spark技術(shù)內(nèi)幕:究竟什么是RDD
Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
RDD 論文中文版

本系列文章鏈接
『 Spark 』1. spark 簡(jiǎn)介
『 Spark 』2. spark 基本概念解析
『 Spark 』3. spark 編程模式
『 Spark 』4. spark 之 RDD
『 Spark 』5. 這些年卿捎,你不能錯(cuò)過(guò)的 spark 學(xué)習(xí)資源
『 Spark 』6. 深入研究 spark 運(yùn)行原理之 job, stage, task
『 Spark 』7. 使用 Spark DataFrame 進(jìn)行大數(shù)據(jù)分析
『 Spark 』8. 實(shí)戰(zhàn)案例 | Spark 在金融領(lǐng)域的應(yīng)用 | 日內(nèi)走勢(shì)預(yù)測(cè)
『 Spark 』9. 搭建 IPython + Notebook + Spark 開發(fā)環(huán)境

文/litaotao(簡(jiǎn)書作者)原文鏈接:http://www.reibang.com/p/0d2b2503993f著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)径密,并標(biāo)注“簡(jiǎn)書作者”午阵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市享扔,隨后出現(xiàn)的幾起案子底桂,更是在濱河造成了極大的恐慌,老刑警劉巖惧眠,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件籽懦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡氛魁,警方通過(guò)查閱死者的電腦和手機(jī)暮顺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秀存,“玉大人捶码,你說(shuō)我怎么就攤上這事』蛄矗” “怎么了惫恼?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)澳盐。 經(jīng)常有香客問(wèn)我祈纯,道長(zhǎng),這世上最難降的妖魔是什么洞就? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮掀淘,結(jié)果婚禮上旬蟋,老公的妹妹穿的比我還像新娘。我一直安慰自己革娄,他們只是感情好倾贰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布冕碟。 她就那樣靜靜地躺著,像睡著了一般匆浙。 火紅的嫁衣襯著肌膚如雪安寺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天首尼,我揣著相機(jī)與錄音挑庶,去河邊找鬼。 笑死软能,一個(gè)胖子當(dāng)著我的面吹牛迎捺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播查排,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼凳枝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跋核?” 一聲冷哼從身側(cè)響起岖瑰,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砂代,沒(méi)想到半個(gè)月后蹋订,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泊藕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年辅辩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃圆。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玫锋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讼呢,到底是詐尸還是另有隱情撩鹿,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布悦屏,位于F島的核電站节沦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏础爬。R本人自食惡果不足惜甫贯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望看蚜。 院中可真熱鬧叫搁,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惨奕,卻和暖如春雪位,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梨撞。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工雹洗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聋袋。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓队伟,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幽勒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗜侮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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