2021年大数据Spark(十二):Spark Core的RDD详解
目錄
RDD詳解
為什么需要RDD?
什么是RDD?
RDD的5大特性
第一個(gè):A list of partitions
第二個(gè):A function for computing each split?
第三個(gè):A list of dependencies on other RDDs
?第四個(gè):Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
第五個(gè):Optionally, a list of preferred locations to compute each split on?(e.g. block locations for an HDFS file)
WordCount中RDD
RDD詳解
為什么需要RDD?
沒(méi)有RDD之前,
1.MR:只提供了map和reduce的API,而且編寫(xiě)麻煩,運(yùn)行效率低!---早就淘汰了!
2.使用Scala/Java的本地集合:但是只能完成本地單機(jī)版的,如果要實(shí)現(xiàn)分布式的,很困難!
所以需要有一個(gè)分布式的數(shù)據(jù)抽象,也就是用該抽象,可以表示分布式的集合,那么基于這個(gè)分布式集合進(jìn)行操作,就可以很方便的完成分布式的WordCount!(該分布式集合底層應(yīng)該將實(shí)現(xiàn)的細(xì)節(jié)封裝好,提供簡(jiǎn)單易用的API!)---在此背景之下,RDD就誕生了!
AMP實(shí)驗(yàn)室發(fā)表的一篇關(guān)于RDD的論文:《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》就是為了解決這些問(wèn)題的
RDD提供了一個(gè)抽象的數(shù)據(jù)模型,不必?fù)?dān)心底層數(shù)據(jù)的分布式特性,只需將具體的應(yīng)用邏輯表達(dá)為一系列轉(zhuǎn)換操作(函數(shù)),不同RDD之間的轉(zhuǎn)換操作之間還可以形成依賴(lài)關(guān)系,進(jìn)而實(shí)現(xiàn)管道化,從而避免了中間結(jié)果的存儲(chǔ),大大降低了數(shù)據(jù)復(fù)制、磁盤(pán)IO和序列化開(kāi)銷(xiāo),并且還提供了更多的API(map/reduec/filter/groupBy...)。
?
什么是RDD?
在Spark開(kāi)山之作Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing這篇paper中(以下簡(jiǎn)稱(chēng) RDD Paper),Matei等人提出了RDD這種數(shù)據(jù)結(jié)構(gòu),文中開(kāi)頭對(duì)RDD的定義是:
?
?
A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable, partitioned collection of elements that can be operated on in parallel.
RDD(Resilient Distributed Dataset)彈性分布式數(shù)據(jù)集,是Spark中最基本的數(shù)據(jù)抽象,代表一個(gè)不可變、可分區(qū)、里面的元素可并行計(jì)算的集合。
?
所有的運(yùn)算以及操作都建立在 RDD 數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)之上。
?
RDD設(shè)計(jì)的核心點(diǎn)為:
?
拆分核心要點(diǎn)三個(gè)方面:
?
可以認(rèn)為RDD是分布式的列表List或數(shù)組Array,抽象的數(shù)據(jù)結(jié)構(gòu),RDD是一個(gè)抽象類(lèi)Abstract Class和泛型Generic Type:
?
RDD彈性分布式數(shù)據(jù)集核心點(diǎn)示意圖如下:
本地List集合 | 單機(jī)硬盤(pán)存儲(chǔ)
RDD分布式集合 | HDFS分布式存儲(chǔ)
分布式的List
?
RDD的5大特性
RDD 數(shù)據(jù)結(jié)構(gòu)內(nèi)部有五個(gè)特性(摘錄RDD 源碼):
前三個(gè)特征每個(gè)RDD都具備的,后兩個(gè)特征可選的。
第一個(gè):A list of partitions
- 一組分片(Partition)/一個(gè)分區(qū)(Partition)列表,即數(shù)據(jù)集的基本組成單位;
- 對(duì)于RDD來(lái)說(shuō),每個(gè)分片都會(huì)被一個(gè)計(jì)算任務(wù)處理,分片數(shù)決定并行度;
- 用戶(hù)可以在創(chuàng)建RDD時(shí)指定RDD的分片個(gè)數(shù),如果沒(méi)有指定,那么就會(huì)采用默認(rèn)值;
第二個(gè):A function for computing each split?
- 一個(gè)函數(shù)會(huì)被作用在每一個(gè)分區(qū);
- Spark中RDD的計(jì)算是以分片為單位的,compute函數(shù)會(huì)被作用到每個(gè)分區(qū)上;
第三個(gè):A list of dependencies on other RDDs
- 一個(gè)RDD會(huì)依賴(lài)于其他多個(gè)RDD;
- RDD的每次轉(zhuǎn)換都會(huì)生成一個(gè)新的RDD,所以RDD之間就會(huì)形成類(lèi)似于流水線一樣的前后依賴(lài)關(guān)系。在部分分區(qū)數(shù)據(jù)丟失時(shí),Spark可以通過(guò)這個(gè)依賴(lài)關(guān)系重新計(jì)算丟失的分區(qū)數(shù)據(jù),而不是對(duì)RDD的所有分區(qū)進(jìn)行重新計(jì)算(Spark的容錯(cuò)機(jī)制);
?第四個(gè):Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
- 可選項(xiàng),對(duì)于KeyValue類(lèi)型的RDD會(huì)有一個(gè)Partitioner,即RDD的分區(qū)函數(shù);
- 當(dāng)前Spark中實(shí)現(xiàn)了兩種類(lèi)型的分區(qū)函數(shù),一個(gè)是基于哈希的HashPartitioner,另外一個(gè)是基于范圍的RangePartitioner。
- 只有對(duì)于于key-value的RDD,才會(huì)有Partitioner,非key-value的RDD的Parititioner的值是None。
- Partitioner函數(shù)不但決定了RDD本身的分片數(shù)量,也決定了parent RDD Shuffle輸出時(shí)的分片數(shù)量。
第五個(gè):Optionally, a list of preferred locations to compute each split on?(e.g. block locations for an HDFS file)
- 可選項(xiàng),一個(gè)列表,存儲(chǔ)存取每個(gè)Partition的優(yōu)先位置(preferred location);
- 對(duì)于一個(gè)HDFS文件來(lái)說(shuō),這個(gè)列表保存的就是每個(gè)Partition所在的塊的位置。
- 按照"移動(dòng)數(shù)據(jù)不如移動(dòng)計(jì)算"的理念,Spark在進(jìn)行任務(wù)調(diào)度的時(shí)候,會(huì)盡可能選擇那些存有數(shù)據(jù)的worker節(jié)點(diǎn)來(lái)進(jìn)行任務(wù)計(jì)算。(數(shù)據(jù)本地性)
?
RDD 是一個(gè)數(shù)據(jù)集的表示,不僅表示了數(shù)據(jù)集,還表示了這個(gè)數(shù)據(jù)集從哪來(lái)、如何計(jì)算,主要屬性包括五個(gè)方面(必須牢記,通過(guò)編碼加深理解,面試常問(wèn)):
RDD將Spark的底層的細(xì)節(jié)都隱藏起來(lái)(自動(dòng)容錯(cuò)、位置感知、任務(wù)調(diào)度執(zhí)行,失敗重試等),讓開(kāi)發(fā)者可以像操作本地集合一樣以函數(shù)式編程的方式操作RDD這個(gè)分布式數(shù)據(jù)集,進(jìn)行各種并行計(jì)算,RDD中很多處理數(shù)據(jù)函數(shù)與列表List中相同與類(lèi)似。
?
WordCount中RDD
在內(nèi)部,每個(gè)RDD都有五個(gè)主要特性:
1.-分區(qū)列表:每個(gè)RDD都有會(huì)分區(qū)的概念,類(lèi)似與HDFS的分塊, 分區(qū)的目的:提高并行度!
2.-用于計(jì)算每個(gè)分區(qū)的函數(shù):用函數(shù)來(lái)操作各個(gè)分區(qū)中的數(shù)據(jù)
3.-對(duì)其他RDD的依賴(lài)列表:后面的RDD需要依賴(lài)前面的RDD
4.-可選地,鍵值RDDs的分區(qū)器(例如,reduceByKey中的默認(rèn)的Hash分區(qū)器)
5.-可選地,計(jì)算每個(gè)分區(qū)的首選位置列表/最佳位置(例如HDFS文件)--移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更劃算!
以詞頻統(tǒng)計(jì)WordCount程序?yàn)槔?#xff0c;查看整個(gè)Job中各個(gè)RDD類(lèi)型及依賴(lài)關(guān)系
運(yùn)行程序結(jié)束后,查看WEB UI監(jiān)控頁(yè)面,此Job(RDD調(diào)用foreach觸發(fā))執(zhí)行DAG圖:
上圖中相關(guān)說(shuō)明如下:
?第一點(diǎn)、黑色圓圈表示一個(gè)RDD
- 上圖中有5個(gè)黑色圓圈,說(shuō)明整個(gè)Job中有個(gè)5個(gè)RDD
- 【1號(hào)】RDD類(lèi)型:HadoopRDD,從HDFS或LocalFS讀取文件數(shù)據(jù);
- 【2號(hào)、3號(hào)和4號(hào)】RDD類(lèi)型:MapPartitionsRDD,從一個(gè)RDD轉(zhuǎn)換而來(lái),沒(méi)有經(jīng)過(guò)shuffle操作;
- 【5號(hào)】RDD類(lèi)型:ShuffledRDD,從一個(gè)RDD轉(zhuǎn)換而來(lái),經(jīng)過(guò)Shuffle重分區(qū)操作,Spark Shuffle類(lèi)似MapReduce流程中Map Phase和Reduce Phase中的Shuffle;
?第二點(diǎn)、淺藍(lán)色矩形框表示調(diào)用RDD函數(shù)
- 上圖中【5號(hào)】RDD所在在藍(lán)色矩形框上的函數(shù)【reduceByKey】,表明【5號(hào)】RDD是【4號(hào)】RDD調(diào)用reduceByKey函數(shù)得到;
?第三點(diǎn)、查看ShuffleRDD源碼,實(shí)現(xiàn)RDD的5個(gè)特性
RDD 設(shè)計(jì)的一個(gè)重要優(yōu)勢(shì)是能夠記錄 RDD 間的依賴(lài)關(guān)系,即所謂血統(tǒng)(lineage)。
通過(guò)豐富的轉(zhuǎn)移操作(Transformation),可以構(gòu)建一個(gè)復(fù)雜的有向無(wú)環(huán)圖,并通過(guò)這個(gè)圖來(lái)一步步進(jìn)行計(jì)算。
總結(jié)
以上是生活随笔為你收集整理的2021年大数据Spark(十二):Spark Core的RDD详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2021年大数据Spark(十一):应用
- 下一篇: 2021年大数据Spark(十三):Sp