新聞中心
RDD就是 Resillient Distributed Dataset,即彈性分布式數(shù)據(jù)集。它是Spark提供的核心抽象。RDD在抽象上來講是一種抽象的分布式的數(shù)據(jù)集。它是被分區(qū)的,每個分區(qū)分布在集群中的不同的節(jié)點上。從而可以讓數(shù)據(jù)進(jìn)行并行的計算它主要特點就是彈性和容錯性。

1. RDD 的設(shè)計與運(yùn)行原理
Spark 的核心是建立在統(tǒng)一的抽象 RDD 之上,基于 RDD 的轉(zhuǎn)換和行動操作使得 Spark 的各個組件可以無縫進(jìn)行集成,從而在同一個應(yīng)用程序中完成大數(shù)據(jù)計算任務(wù)。
在實際應(yīng)用中,存在許多迭代式算法和交互式數(shù)據(jù)挖掘工具,這些應(yīng)用場景的共同之處在于不同計算階段之間會重用中間結(jié)果,即一個階段的輸出結(jié)果會作為下一個階段的輸入。而 Hadoop 中的 MapReduce 框架都是把中間結(jié)果寫入到 HDFS 中,帶來了大量的數(shù)據(jù)復(fù)制、磁盤 IO 和序列化開銷,并且通常只支持一些特定的計算模式。而 RDD 提供了一個抽象的數(shù)據(jù)架構(gòu),從而讓開發(fā)者不必?fù)?dān)心底層數(shù)據(jù)的分布式特性,只需將具體的應(yīng)用邏輯表達(dá)為一系列轉(zhuǎn)換處理,不同 RDD 之間的轉(zhuǎn)換操作形成依賴關(guān)系,可以實現(xiàn)管道化,從而避免了中間結(jié)果的存儲,大大降低了數(shù)據(jù)復(fù)制、磁盤 IO 和序列化開銷。
1.1. RDD 概念
一個 RDD 就是一個分布式對象集合,提供了一種高度受限的共享內(nèi)存模型,其本質(zhì)上是一個只讀的分區(qū)記錄集合,不能直接修改。每個 RDD 可以分成多個分區(qū),每個分區(qū)就是一個數(shù)據(jù)集片段,并且一個 RDD 的不同分區(qū)可以保存到集群中不同的節(jié)點上,從而可以在集群中的不同節(jié)點上進(jìn)行并行計算。
RDD 提供了一組豐富的操作以支持常見的數(shù)據(jù)運(yùn)算,分為“行動”(Action)和“轉(zhuǎn)換”(Transformation)兩種類型,前者用于執(zhí)行計算并指定輸出的形式,后者指定 RDD 之間的相互依賴關(guān)系。RDD 提供的轉(zhuǎn)換接口都非常簡單,都是類似 map 、filter 、groupBy 、join 等粗粒度的數(shù)據(jù)轉(zhuǎn)換操作,而不是針對某個數(shù)據(jù)項的細(xì)粒度修改。因此,RDD 比較適合對于數(shù)據(jù)集中元素執(zhí)行相同操作的批處理式應(yīng)用,而不適合用于需要異步、細(xì)粒度狀態(tài)的應(yīng)用,比如 Web 應(yīng)用系統(tǒng)、增量式的網(wǎng)頁爬蟲等。
RDD 的典型的執(zhí)行過程如下:
讀入外部的數(shù)據(jù)源(或者內(nèi)存中的集合)進(jìn)行 RDD 創(chuàng)建;RDD 經(jīng)過一系列的 “轉(zhuǎn)換” 操作,每一次都會產(chǎn)生不同的 RDD,供給下一個轉(zhuǎn)換使用;最后一個 RDD 經(jīng)過 “行動” 操作進(jìn)行處理,并輸出指定的數(shù)據(jù)類型和值。RDD 采用了惰性調(diào)用,即在 RDD 的執(zhí)行過程中,所有的轉(zhuǎn)換操作都不會執(zhí)行真正的操作,只會記錄依賴關(guān)系,而只有遇到了行動操作,才會觸發(fā)真正的計算,并根據(jù)之前的依賴關(guān)系得到最終的結(jié)果。
下面以一個實例來描述 RDD 的實際執(zhí)行過程,如下圖所示,開始從輸入中創(chuàng)建了兩個 RDD,分別是 A 和 C,然后經(jīng)過一系列的轉(zhuǎn)換操作,最終生成了一個 F,這也是一個 RDD。注意,這些轉(zhuǎn)換操作的執(zhí)行過程中并沒有執(zhí)行真正的計算,基于創(chuàng)建的過程也沒有執(zhí)行真正的計算,而只是記錄的數(shù)據(jù)流向軌跡。當(dāng) F 執(zhí)行了行為操作并生成輸出數(shù)據(jù)時,Spark 才會根據(jù) RDD 的依賴關(guān)系生成有向無環(huán)圖(DAG),并從起點開始執(zhí)行真正的計算。正是 RDD 的這種惰性調(diào)用機(jī)制,使得轉(zhuǎn)換操作得到的中間結(jié)果不需要保存,而是直接管道式的流入到下一個操作進(jìn)行處理。
1.2. RDD 特性
總體而言,Spark 采用 RDD 以后能夠?qū)崿F(xiàn)高效計算的主要原因如下:
高效的容錯性。在 RDD 的設(shè)計中,只能通過從父 RDD 轉(zhuǎn)換到子 RDD 的方式來修改數(shù)據(jù),這也就是說我們可以直接利用 RDD 之間的依賴關(guān)系來重新計算得到丟失的分區(qū),而不需要通過數(shù)據(jù)冗余的方式。而且也不需要記錄具體的數(shù)據(jù)和各種細(xì)粒度操作的日志,這大大降低了數(shù)據(jù)密集型應(yīng)用中的容錯開銷。
中間結(jié)果持久化到內(nèi)存。數(shù)據(jù)在內(nèi)存中的多個 RDD 操作之間進(jìn)行傳遞,不需要在磁盤上進(jìn)行存儲和讀取,避免了不必要的讀寫磁盤開銷;
存放的數(shù)據(jù)可以是 Java 對象,避免了不必要的對象序列化和反序列化開銷。
1.3. RDD 之間的依賴關(guān)系
RDD 中的不同的操作會使得不同 RDD 中的分區(qū)會產(chǎn)生不同的依賴關(guān)系,主要分為窄依賴(Narrow Dependency)與寬依賴(Wide Dependency)。其中,窄依賴表示的是父 RDD 和子 RDD 之間的一對一關(guān)系或者多對一關(guān)系,主要包括的操作有 map、filter、union 等;而寬依賴則表示父 RDD 與子 RDD 之間的一對多關(guān)系,即一個父 RDD 轉(zhuǎn)換成多個子 RDD,主要包括的操作有 groupByKey、sortByKey 等。
對于窄依賴的 RDD,可以以流水線的方式計算所有父分區(qū),不會造成網(wǎng)絡(luò)之間的數(shù)據(jù)混合。對于寬依賴的 RDD,則通常伴隨著 Shuffle 操作,即首先需要計算好所有父分區(qū)數(shù)據(jù),然后在節(jié)點之間進(jìn)行 Shuffle。因此,在進(jìn)行數(shù)據(jù)恢復(fù)時,窄依賴只需要根據(jù)父 RDD 分區(qū)重新計算丟失的分區(qū)即可,而且可以并行地在不同節(jié)點進(jìn)行重新計算。而對于寬依賴而言,單個節(jié)點失效通常意味著重新計算過程會涉及多個父 RDD 分區(qū),開銷較大。此外,Spark 還提供了數(shù)據(jù)檢查點和記錄日志,用于持久化中間 RDD,從而使得在進(jìn)行失敗恢復(fù)時不需要追溯到最開始的階段。在進(jìn)行故障恢復(fù)時,Spark 會對數(shù)據(jù)檢查點開銷和重新計算 RDD 分區(qū)的開銷進(jìn)行比較,從而自動選擇最優(yōu)的恢復(fù)策略。
1.4. 階段的劃分
Spark 通過分析各個 RDD 的依賴關(guān)系生成了 DAG ,再通過分析各個 RDD 中的分區(qū)之間的依賴關(guān)系來決定如何劃分階段,具體劃分方法是:在 DAG 中進(jìn)行反向解析,遇到寬依賴就斷開,遇到窄依賴就把當(dāng)前的 RDD 加入到當(dāng)前的階段中;將窄依賴盡量劃分在同一個階段中,可以實現(xiàn)流水線計算。例如在下圖中,首先根據(jù)數(shù)據(jù)的讀取、轉(zhuǎn)化和行為等操作生成 DAG。然后在執(zhí)行行為操作時,反向解析 DAG,由于從 A 到 B 的轉(zhuǎn)換和從 B、F 到 G 的轉(zhuǎn)換都屬于寬依賴,則需要從在寬依賴處進(jìn)行斷開,從而劃分為三個階段。把一個 DAG 圖劃分成多個 “階段” 以后,每個階段都代表了一組關(guān)聯(lián)的、相互之間沒有 Shuffle 依賴關(guān)系的任務(wù)組成的任務(wù)集合。每個任務(wù)集合會被提交給任務(wù)調(diào)度器(TaskScheduler)進(jìn)行處理,由任務(wù)調(diào)度器將任務(wù)分發(fā)給 Executor 運(yùn)行。
1.5. RDD 運(yùn)行過程
通過上述對 RDD 概念、依賴關(guān)系和階段劃分的介紹,結(jié)合之前介紹的 Spark 運(yùn)行基本流程,這里再總結(jié)一下 RDD 在 Spark 架構(gòu)中的運(yùn)行過程(如下圖所示):
創(chuàng)建 RDD 對象;SparkContext 負(fù)責(zé)計算 RDD 之間的依賴關(guān)系,構(gòu)建 DAG;DAGSchedule 負(fù)責(zé)把 DAG 圖反向解析成多個階段,每個階段中包含多個任務(wù),每個任務(wù)會被任務(wù)調(diào)度器分發(fā)給工作節(jié)點上的 Executor 上執(zhí)行。
本文題目:詳解RDD運(yùn)行機(jī)制
路徑分享:http://m.5511xx.com/article/cddgpip.html


咨詢
建站咨詢
