日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Spark中的核心概念RDD,我們了解多少?

RDD全稱(chēng)叫做彈性分布式數(shù)據(jù)集(Resilient Distributed Datasets),它是一種分布式的內(nèi)存抽象,表示一個(gè)只讀的記錄分區(qū)的集合,它只能通過(guò)其他RDD轉(zhuǎn)換而創(chuàng)建,為此,RDD支持豐富的轉(zhuǎn)換操作 ( 如:map, join, filter, groupBy等),通過(guò)這種轉(zhuǎn)換操作,新的RDD則包含了如何從其他RDDs衍生所必需的信息,所以說(shuō)RDDs之間是有依賴(lài)關(guān)系的。

成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供龍?zhí)毒W(wǎng)站建設(shè)、龍?zhí)蹲鼍W(wǎng)站、龍?zhí)毒W(wǎng)站設(shè)計(jì)、龍?zhí)毒W(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、龍?zhí)镀髽I(yè)網(wǎng)站模板建站服務(wù),10余年龍?zhí)蹲鼍W(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

基于RDDs之間的依賴(lài),RDDs會(huì)形成一個(gè)有向無(wú)環(huán)圖DAG,該DAG描述了整個(gè)流式計(jì)算的流程,實(shí)際執(zhí)行的時(shí)候,RDD是通過(guò)血緣關(guān)系(Lineage)一氣呵成的,即使出現(xiàn)數(shù)據(jù)分區(qū)丟失,也可以通過(guò)血緣關(guān)系重建分區(qū)。

總結(jié)起來(lái),基于RDD的流式計(jì)算任務(wù)可描述為:從穩(wěn)定的物理存儲(chǔ)(如分布式文件系統(tǒng))中加載記錄,記錄被傳入由一組確定性操作構(gòu)成的DAG,然后寫(xiě)回穩(wěn)定存儲(chǔ)。另外RDD還可以將數(shù)據(jù)集緩存到內(nèi)存中,使得在多個(gè)操作之間可以重用數(shù)據(jù)集,基于這個(gè)特點(diǎn)可以很方便地構(gòu)建迭代型應(yīng)用(圖計(jì)算、機(jī)器學(xué)習(xí)等)或者交互式數(shù)據(jù)分析應(yīng)用。

可以說(shuō)Spark最初也就是實(shí)現(xiàn)RDD的一個(gè)分布式系統(tǒng),后面通過(guò)不斷發(fā)展壯大成為現(xiàn)在較為完善的大數(shù)據(jù)生態(tài)系統(tǒng),簡(jiǎn)單來(lái)講,Spark-RDD的關(guān)系類(lèi)似于Hadoop-MapReduce關(guān)系。

RDD特點(diǎn)

RDD表示只讀的分區(qū)的數(shù)據(jù)集,對(duì)RDD進(jìn)行改動(dòng),只能通過(guò)RDD的轉(zhuǎn)換操作,由一個(gè)RDD得到一個(gè)新的RDD,新的RDD包含了從其他RDD衍生所必需的信息。

RDDs之間存在依賴(lài),RDD的執(zhí)行是按照血緣關(guān)系延時(shí)計(jì)算的。如果血緣關(guān)系較長(zhǎng),可以通過(guò)持久化RDD來(lái)切斷血緣關(guān)系。

分區(qū)

如下圖所示,RDD邏輯上是分區(qū)的,每個(gè)分區(qū)的數(shù)據(jù)是抽象存在的,計(jì)算的時(shí)候會(huì)通過(guò)一個(gè)compute函數(shù)得到每個(gè)分區(qū)的數(shù)據(jù)。

如果RDD是通過(guò)已有的文件系統(tǒng)構(gòu)建,則compute函數(shù)是讀取指定文件系統(tǒng)中的數(shù)據(jù),如果RDD是通過(guò)其他RDD轉(zhuǎn)換而來(lái),則compute函數(shù)是執(zhí)行轉(zhuǎn)換邏輯將其他RDD的數(shù)據(jù)進(jìn)行轉(zhuǎn)換。

只讀

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

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

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

依賴(lài)

RDDs通過(guò)操作算子進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換得到的新RDD包含了從其他RDDs衍生所必需的信息,RDDs之間維護(hù)著這種血緣關(guān)系,也稱(chēng)之為依賴(lài)。如下圖所示,依賴(lài)包括兩種,一種是窄依賴(lài),RDDs之間分區(qū)是一一對(duì)應(yīng)的,另一種是寬依賴(lài),下游RDD的每個(gè)分區(qū)與上游RDD(也稱(chēng)之為父RDD)的每個(gè)分區(qū)都有關(guān),是多對(duì)多的關(guān)系。

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

緩存

如果在應(yīng)用程序中多次使用同一個(gè)RDD,可以將該RDD緩存起來(lái),該RDD只有在***次計(jì)算的時(shí)候會(huì)根據(jù)血緣關(guān)系得到分區(qū)的數(shù)據(jù),在后續(xù)其他地方用到該RDD的時(shí)候,會(huì)直接從緩存處取而不用再根據(jù)血緣關(guān)系計(jì)算,這樣就加速后期的重用。

如下圖所示,RDD-1經(jīng)過(guò)一系列的轉(zhuǎn)換后得到RDD-n并保存到hdfs,RDD-1在這一過(guò)程中會(huì)有個(gè)中間結(jié)果,如果將其緩存到內(nèi)存,那么在隨后的RDD-1轉(zhuǎn)換到RDD-m這一過(guò)程中,就不會(huì)計(jì)算其之前的RDD-0了。

Checkpoint

雖然RDD的血緣關(guān)系天然地可以實(shí)現(xiàn)容錯(cuò),當(dāng)RDD的某個(gè)分區(qū)數(shù)據(jù)失敗或丟失,可以通過(guò)血緣關(guān)系重建。但是對(duì)于長(zhǎng)時(shí)間迭代型應(yīng)用來(lái)說(shuō),隨著迭代的進(jìn)行,RDDs之間的血緣關(guān)系會(huì)越來(lái)越長(zhǎng),一旦在后續(xù)迭代過(guò)程中出錯(cuò),則需要通過(guò)非常長(zhǎng)的血緣關(guān)系去重建,勢(shì)必影響性能。

為此,RDD支持checkpoint將數(shù)據(jù)保存到持久化的存儲(chǔ)中,這樣就可以切斷之前的血緣關(guān)系,因?yàn)閏heckpoint后的RDD不需要知道它的父RDDs了,它可以從checkpoint處拿到數(shù)據(jù)。

小結(jié)

總結(jié)起來(lái),給定一個(gè)RDD我們至少可以知道如下幾點(diǎn)信息:1、分區(qū)數(shù)以及分區(qū)方式;2、由父RDDs衍生而來(lái)的相關(guān)依賴(lài)信息;3、計(jì)算每個(gè)分區(qū)的數(shù)據(jù),計(jì)算步驟為:1)如果被緩存,則從緩存中取的分區(qū)的數(shù)據(jù);2)如果被Checkpoint,則從Checkpoint處恢復(fù)數(shù)據(jù);3)根據(jù)血緣關(guān)系計(jì)算分區(qū)的數(shù)據(jù)。

編程模型

在Spark中,RDD被表示為對(duì)象,通過(guò)對(duì)象上的方法調(diào)用來(lái)對(duì)RDD進(jìn)行轉(zhuǎn)換。經(jīng)過(guò)一系列的Transformations后,就可以調(diào)用Actions觸發(fā)RDD的計(jì)算,Action可以是向應(yīng)用程序返回結(jié)果( count, collect 等),或者是向存儲(chǔ)系統(tǒng)保存數(shù)據(jù)( saveAsTextFile 等)。在Spark中,只有遇到Action,才會(huì)執(zhí)行RDD的計(jì)算(即懶執(zhí)行),這樣在運(yùn)行時(shí)可以通過(guò)管道的方式傳輸多個(gè)轉(zhuǎn)換。

要使用Spark,開(kāi)發(fā)者需要編寫(xiě)一個(gè)Driver程序,它被提交到集群以調(diào)度運(yùn)行Worker,如下圖所示。Driver中定義了一個(gè)或多個(gè)RDD,并調(diào)用RDD上的action,Worker則執(zhí)行RDD分區(qū)計(jì)算任務(wù)。

應(yīng)用舉例

下面介紹一個(gè)簡(jiǎn)單的Spark應(yīng)用程序?qū)嵗齏ordCount,統(tǒng)計(jì)一個(gè)數(shù)據(jù)集中每個(gè)單詞出現(xiàn)的次數(shù),首先將從HDFS中加載數(shù)據(jù)得到原始RDD-0,其中每條記錄為數(shù)據(jù)中的一行句子,經(jīng)過(guò)一個(gè)flatMap操作,將一行句子切分為多個(gè)獨(dú)立的詞,得到RDD-1,再通過(guò)map操作將每個(gè)詞映射為key-value形式,其中key為詞本身,value為初始計(jì)數(shù)值1,得到RDD-2,將RDD-2中的所有記錄歸并,統(tǒng)計(jì)每個(gè)詞的計(jì)數(shù),得到RDD-3,***將其保存到HDFS。

 
 
 
 
  1. object WordCount {
  2. def main(args: Array[String]) {
  3. if (args.length < 2) {
  4. System.err.println("Usage: WordCount  ");
  5. System.exit(1);
  6. }
  7. val conf = new SparkConf().setAppName("WordCount")
  8. val sc = new SparkContext(conf)
  9. val result = sc.textFile(args(0))
  10. .flatMap(line => line.split(" "))
  11. .map(word => (word, 1))
  12. .reduceByKey(_ + _)
  13. result.saveAsTextFile(args(1))
  14. }
  15. }

結(jié)語(yǔ)

基于RDD實(shí)現(xiàn)的Spark相比于傳統(tǒng)的Hadoop MapReduce有什么優(yōu)勢(shì)呢?總結(jié)起來(lái)應(yīng)該至少有三點(diǎn):

1.RDD提供了豐富的操作算子,不再是只有map和reduce兩個(gè)操作了,對(duì)于描述應(yīng)用程序來(lái)說(shuō)更加方便;

2.通過(guò)RDDs之間的轉(zhuǎn)換構(gòu)建DAG,中間結(jié)果不用落地;

3.RDD支持緩存,可以在內(nèi)存中快速完成計(jì)算。


分享標(biāo)題:Spark中的核心概念RDD,我們了解多少?
當(dāng)前路徑:http://m.5511xx.com/article/dpdpgjd.html