更新時(shí)間:2020-12-22 來(lái)源:黑馬程序員 瀏覽量:
RDD( Resilient Distributed Dataset,彈性分布式數(shù)據(jù)集),是一個(gè)容錯(cuò)的、并行的數(shù)據(jù)結(jié)構(gòu),可以讓用戶顯式地將數(shù)據(jù)存儲(chǔ)到磁盤和內(nèi)存中,并且還能控制數(shù)據(jù)的分區(qū)。對(duì)于迭代式計(jì)算和交互式數(shù)據(jù)挖掘,RDD可以將中間計(jì)算的數(shù)據(jù)結(jié)果保存在內(nèi)存中,若是后面需要中間結(jié)果參與計(jì)算時(shí),則可以直接從內(nèi)存中讀取,從而可以極大地提高計(jì)算速度。
每個(gè)RDD都具有五大特征,具體如下。
1.分區(qū)列表( a list of partitions)
每個(gè)RDD被分為多個(gè)分區(qū)(Partitions),這些分區(qū)運(yùn)行在集群中的不同節(jié)點(diǎn),每個(gè)分區(qū)都會(huì)被一個(gè)計(jì)算任務(wù)處理,分區(qū)數(shù)決定了并行計(jì)算的數(shù)量,創(chuàng)建RDD時(shí)可以指定RDD分區(qū)的個(gè)數(shù)。如果不指定分區(qū)數(shù)量,當(dāng)RDD從集合創(chuàng)建時(shí),默認(rèn)分區(qū)數(shù)量為該程序所分配到的資源的CPU核數(shù)(每個(gè)Core可以承載2~4個(gè)Partition),如果是從HDFS文件創(chuàng)建,默認(rèn)為文件的Block數(shù)。
2.每個(gè)分區(qū)都有一個(gè)計(jì)算函數(shù)( a function for computing each split)
Spark的RDD的計(jì)算函數(shù)是以分片為基本單位的,每個(gè)RDD都會(huì)實(shí)現(xiàn) compute函數(shù),對(duì)具體的分片進(jìn)行計(jì)算。
3.依賴于其他RDD(a list of dependencies on other RDDs)
RDD的每次轉(zhuǎn)換都會(huì)生成一個(gè)新的RDD,所以RDD之間就會(huì)形成類似于流水線一樣的前后依賴關(guān)系。在部分分區(qū)數(shù)據(jù)丟失時(shí),Spark可以通過(guò)這個(gè)依賴關(guān)系重新計(jì)算丟失的分區(qū)數(shù)據(jù),而不是對(duì)RDD的所有分區(qū)進(jìn)行重新計(jì)算。
4.(Key,Value)數(shù)據(jù)類型的RDD分區(qū)器(a Partitioner for Key-Value RDDS)
當(dāng)前Spark中實(shí)現(xiàn)了兩種類型的分區(qū)函數(shù),一個(gè)是基于哈希的HashPartitioner,另外個(gè)是基于范圍的RangePartitioner。只有對(duì)于(Key,Value)的RDD,才會(huì)有Partitioner(分區(qū)),非(Key,Value)的RDD的Partitioner的值是None。Partitioner函數(shù)不但決定了RDD本身的分區(qū)數(shù)量,也決定了parent RDD Shuffle輸出時(shí)的分區(qū)數(shù)量。
5.每個(gè)分區(qū)都有一個(gè)優(yōu)先位置列表(a list of preferred locations to compute each split on)
優(yōu)先位置列表會(huì)存儲(chǔ)每個(gè)Partition的優(yōu)先位置,對(duì)于一個(gè)HDFS文件來(lái)說(shuō),就是每個(gè)Partition塊的位置。按照“移動(dòng)數(shù)據(jù)不如移動(dòng)計(jì)算”的理念,Spark在進(jìn)行任務(wù)調(diào)度的時(shí)候,會(huì)盡可能地將計(jì)算任務(wù)分配到其所要處理數(shù)據(jù)塊的存儲(chǔ)位置。
猜你喜歡
不同系統(tǒng)如何加載數(shù)據(jù)創(chuàng)建RDD?
RDD為什么要進(jìn)行數(shù)據(jù)持久化?它的操作方法有哪些?