91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Spark中的核心概念RDD

發布時間:2021-11-29 10:30:51 來源:億速云 閱讀:147 作者:柒染 欄目:數據庫

如何理解Spark中的核心概念RDD,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

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

基于RDDs之間的依賴,RDDs會形成一個有向無環圖DAG,該DAG描述了整個流式計算的流程,實際執行的時候,RDD是通過血緣關系(Lineage)一氣呵成的,即使出現數據分區丟失,也可以通過血緣關系重建分區。

總結起來,基于RDD的流式計算任務可描述為:從穩定的物理存儲(如分布式文件系統)中加載記錄,記錄被傳入由一組確定性操作構成的DAG,然后寫回穩定存儲。另外RDD還可以將數據集緩存到內存中,使得在多個操作之間可以重用數據集,基于這個特點可以很方便地構建迭代型應用(圖計算、機器學習等)或者交互式數據分析應用。

可以說Spark最初也就是實現RDD的一個分布式系統,后面通過不斷發展壯大成為現在較為完善的大數據生態系統,簡單來講,Spark-RDD的關系類似于Hadoop-MapReduce關系。

RDD特點

RDD表示只讀的分區的數據集,對RDD進行改動,只能通過RDD的轉換操作,由一個RDD得到一個新的RDD,新的RDD包含了從其他RDD衍生所必需的信息。

RDDs之間存在依賴,RDD的執行是按照血緣關系延時計算的。如果血緣關系較長,可以通過持久化RDD來切斷血緣關系。

分區

如下圖所示,RDD邏輯上是分區的,每個分區的數據是抽象存在的,計算的時候會通過一個compute函數得到每個分區的數據。

如果RDD是通過已有的文件系統構建,則compute函數是讀取指定文件系統中的數據,如果RDD是通過其他RDD轉換而來,則compute函數是執行轉換邏輯將其他RDD的數據進行轉換。

如何理解Spark中的核心概念RDD

只讀

如下圖所示,RDD是只讀的,要想改變RDD中的數據,只能在現有的RDD基礎上創建新的RDD。

如何理解Spark中的核心概念RDD

由一個RDD轉換到另一個RDD,可以通過豐富的操作算子實現,不再像MapReduce那樣只能寫map和reduce了,如下圖所示。

如何理解Spark中的核心概念RDD

RDD的操作算子包括兩類,一類叫做transformations,它是用來將RDD進行轉化,構建RDD的血緣關系;另一類叫做actions,它是用來觸發RDD的計算,得到RDD的相關計算結果或者將RDD保存的文件系統中。下圖是RDD所支持的操作算子列表。

如何理解Spark中的核心概念RDD

依賴

RDDs通過操作算子進行轉換,轉換得到的新RDD包含了從其他RDDs衍生所必需的信息,RDDs之間維護著這種血緣關系,也稱之為依賴。如下圖所示,依賴包括兩種,一種是窄依賴,RDDs之間分區是一一對應的,另一種是寬依賴,下游RDD的每個分區與上游RDD(也稱之為父RDD)的每個分區都有關,是多對多的關系。

如何理解Spark中的核心概念RDD

通過RDDs之間的這種依賴關系,一個任務流可以描述為DAG(有向無環圖),如下圖所示,在實際執行過程中寬依賴對應于Shuffle(圖中的reduceByKey和join),窄依賴中的所有轉換操作可以通過類似于管道的方式一氣呵成執行(圖中map和union可以一起執行)。

如何理解Spark中的核心概念RDD

緩存

如果在應用程序中多次使用同一個RDD,可以將該RDD緩存起來,該RDD只有在***次計算的時候會根據血緣關系得到分區的數據,在后續其他地方用到該RDD的時候,會直接從緩存處取而不用再根據血緣關系計算,這樣就加速后期的重用。

如下圖所示,RDD-1經過一系列的轉換后得到RDD-n并保存到hdfs,RDD-1在這一過程中會有個中間結果,如果將其緩存到內存,那么在隨后的RDD-1轉換到RDD-m這一過程中,就不會計算其之前的RDD-0了。

如何理解Spark中的核心概念RDD

Checkpoint

雖然RDD的血緣關系天然地可以實現容錯,當RDD的某個分區數據失敗或丟失,可以通過血緣關系重建。但是對于長時間迭代型應用來說,隨著迭代的進行,RDDs之間的血緣關系會越來越長,一旦在后續迭代過程中出錯,則需要通過非常長的血緣關系去重建,勢必影響性能。

為此,RDD支持checkpoint將數據保存到持久化的存儲中,這樣就可以切斷之前的血緣關系,因為checkpoint后的RDD不需要知道它的父RDDs了,它可以從checkpoint處拿到數據。

如何理解Spark中的核心概念RDD

小結

總結起來,給定一個RDD我們至少可以知道如下幾點信息:1、分區數以及分區方式;2、由父RDDs衍生而來的相關依賴信息;3、計算每個分區的數據,計算步驟為:1)如果被緩存,則從緩存中取的分區的數據;2)如果被Checkpoint,則從Checkpoint處恢復數據;3)根據血緣關系計算分區的數據。

編程模型

在Spark中,RDD被表示為對象,通過對象上的方法調用來對RDD進行轉換。經過一系列的Transformations后,就可以調用Actions觸發RDD的計算,Action可以是向應用程序返回結果( count, collect 等),或者是向存儲系統保存數據( saveAsTextFile 等)。在Spark中,只有遇到Action,才會執行RDD的計算(即懶執行),這樣在運行時可以通過管道的方式傳輸多個轉換。

要使用Spark,開發者需要編寫一個Driver程序,它被提交到集群以調度運行Worker,如下圖所示。Driver中定義了一個或多個RDD,并調用RDD上的action,Worker則執行RDD分區計算任務。

如何理解Spark中的核心概念RDD

應用舉例

下面介紹一個簡單的Spark應用程序實例WordCount,統計一個數據集中每個單詞出現的次數,首先將從HDFS中加載數據得到原始RDD-0,其中每條記錄為數據中的一行句子,經過一個flatMap操作,將一行句子切分為多個獨立的詞,得到RDD-1,再通過map操作將每個詞映射為key-value形式,其中key為詞本身,value為初始計數值1,得到RDD-2,將RDD-2中的所有記錄歸并,統計每個詞的計數,得到RDD-3,***將其保存到HDFS。

object WordCount { def main(args: Array[String]) { if (args.length < 2) { System.err.println("Usage: WordCount <inputfile> <outputfile>"); System.exit(1); } val conf = new SparkConf().setAppName("WordCount") val sc = new SparkContext(conf) val result = sc.textFile(args(0)) .flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _)  result.saveAsTextFile(args(1)) } }

結語

基于RDD實現的Spark相比于傳統的Hadoop MapReduce有什么優勢呢?總結起來應該至少有三點:

1.RDD提供了豐富的操作算子,不再是只有map和reduce兩個操作了,對于描述應用程序來說更加方便;

2.通過RDDs之間的轉換構建DAG,中間結果不用落地;

3.RDD支持緩存,可以在內存中快速完成計算。

看完上述內容,你們掌握如何理解Spark中的核心概念RDD的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洛隆县| 锡林浩特市| 堆龙德庆县| 五寨县| 新余市| 伊川县| 任丘市| 天镇县| 中西区| 大悟县| 徐汇区| 喀什市| 瓦房店市| 岑巩县| 保山市| 石城县| 合山市| 通化县| 昌邑市| 金山区| 黄山市| 平阴县| 滨州市| 新郑市| 浙江省| 高清| 青河县| 安康市| 剑河县| 惠州市| 安陆市| 松潘县| 苍溪县| 蕲春县| 肥西县| 民丰县| 汉川市| 潞城市| 祁阳县| 明星| 襄城县|