自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

理解Spark的核心RDD

大數(shù)據(jù) Spark
RDD,全稱為Resilient Distributed Datasets,是一個容錯的、并行的數(shù)據(jù)結(jié)構(gòu),可以讓用戶顯式地將數(shù)據(jù)存儲到磁盤和內(nèi)存中,并能控制數(shù)據(jù)的分區(qū)。

[[174205]]

與許多專有的大數(shù)據(jù)處理平臺不同,Spark建立在統(tǒng)一抽象的RDD之上,使得它可以以基本一致的方式應(yīng)對不同的大數(shù)據(jù)處理場景,包括MapReduce,Streaming,SQL,Machine Learning以及Graph等。這即Matei Zaharia所謂的“設(shè)計一個通用的編程抽象(Unified Programming Abstraction)。這正是Spark這朵小火花讓人著迷的地方。要理解Spark,就需得理解RDD。

RDD是什么?

RDD,全稱為Resilient Distributed Datasets,是一個容錯的、并行的數(shù)據(jù)結(jié)構(gòu),可以讓用戶顯式地將數(shù)據(jù)存儲到磁盤和內(nèi)存中,并能控制數(shù)據(jù)的分區(qū)。同時,RDD還提供了一組豐富的操作來操作這些數(shù)據(jù)。在這些操作中,諸如map、flatMap、filter等轉(zhuǎn)換操作實現(xiàn)了monad模式,很好地契合了Scala的集合操作。

除此之外,RDD還提供了諸如join、groupBy、reduceByKey等更為方便的操作(注意,reduceByKey是action,而非transformation),以支持常見的數(shù)據(jù)運算。 通常來講,針對數(shù)據(jù)處理有幾種常見模型,包括:Iterative Algorithms,Relational Queries,MapReduce,Stream Processing。例如Hadoop MapReduce采用了MapReduces模型,Storm則采用了Stream Processing模型。

RDD混合了這四種模型,使得Spark可以應(yīng)用于各種大數(shù)據(jù)處理場景。RDD作為數(shù)據(jù)結(jié)構(gòu),本質(zhì)上是一個只讀的分區(qū)記錄集合。一個RDD可以包含多個分區(qū),每個分區(qū)就是一個dataset片段。RDD可以相互依賴。 如果RDD的每個分區(qū)最多只能被一個Child RDD的一個分區(qū)使用,則稱之為narrow dependency;若多個Child RDD分區(qū)都可以依賴,則稱之為wide dependency。不同的操作依據(jù)其特性,可能會產(chǎn)生不同的依賴。

例如map操作會產(chǎn)生narrow dependency,而join操作則產(chǎn)生wide dependency。Spark之所以將依賴分為narrow與wide,基于兩點原因。 首先,narrow dependencies可以支持在同一個cluster node上以管道形式執(zhí)行多條命令,例如在執(zhí)行了map后,緊接著執(zhí)行filter。相反,wide dependencies需要所有的父分區(qū)都是可用的,可能還需要調(diào)用類似MapReduce之類的操作進(jìn)行跨節(jié)點傳遞。 其次,則是從失敗恢復(fù)的角度考慮。

narrow dependencies的失敗恢復(fù)更有效,因為它只需要重新計算丟失的parent partition即可,而且可以并行地在不同節(jié)點進(jìn)行重計算。而wide dependencies牽涉到RDD各級的多個Parent Partitions。下圖說明了narrow dependencies與wide dependencies之間的區(qū)別:

本圖來自Matei Zaharia撰寫的論文An Architecture for Fast and General Data Processing on Large Clusters。圖中,一個box代表一個RDD,一個帶陰影的矩形框代表一個partition。RDD如何保障數(shù)據(jù)處理效率?RDD提供了兩方面的特性persistence和patitioning,用戶可以通過persist與patitionBy函數(shù)來控制RDD的這兩個方面。RDD的分區(qū)特性與并行計算能力(RDD定義了parallerize函數(shù)),使得Spark可以更好地利用可伸縮的硬件資源。若將分區(qū)與持久化二者結(jié)合起來,就能更加高效地處理海量數(shù)據(jù)。 例如:

 

partitionBy函數(shù)需要接受一個Partitioner對象,如:

RDD本質(zhì)上是一個內(nèi)存數(shù)據(jù)集,在訪問RDD時,指針只會指向與操作相關(guān)的部分。例如存在一個面向列的數(shù)據(jù)結(jié)構(gòu),其中一個實現(xiàn)為Int的數(shù)組,另一個實現(xiàn)為Float的數(shù)組。如果只需要訪問Int字段,RDD的指針可以只訪問Int數(shù)組,避免了對整個數(shù)據(jù)結(jié)構(gòu)的掃描。RDD將操作分為兩類:transformation與action。無論執(zhí)行了多少次transformation操作,RDD都不會真正執(zhí)行運算,只有當(dāng)action操作被執(zhí)行時,運算才會觸發(fā)。

而在RDD的內(nèi)部實現(xiàn)機制中,底層接口則是基于迭代器的,從而使得數(shù)據(jù)訪問變得更高效,也避免了大量中間結(jié)果對內(nèi)存的消耗。 在實現(xiàn)時,RDD針對transformation操作,都提供了對應(yīng)的繼承自RDD的類型,例如map操作會返回MappedRDD,而flatMap則返回FlatMappedRDD。當(dāng)我們執(zhí)行map或flatMap操作時,不過是將當(dāng)前RDD對象傳遞給對應(yīng)的RDD對象而已。 例如:

這些繼承自RDD的類都定義了compute函數(shù)。該函數(shù)會在action操作被調(diào)用時觸發(fā),在函數(shù)內(nèi)部是通過迭代器進(jìn)行對應(yīng)的轉(zhuǎn)換操作:

RDD對容錯的支持

支持容錯通常采用兩種方式: 數(shù)據(jù)復(fù)制或日志記錄。對于以數(shù)據(jù)為中心的系統(tǒng)而言,這兩種方式都非常昂貴,因為它需要跨集群網(wǎng)絡(luò)拷貝大量數(shù)據(jù),畢竟帶寬的數(shù)據(jù)遠(yuǎn)遠(yuǎn)低于內(nèi)存。RDD天生是支持容錯的。首先,它自身是一個不變的(immutable)數(shù)據(jù)集,其次,它能夠記住構(gòu)建它的操作圖(Graph of Operation),因此當(dāng)執(zhí)行任務(wù)的Worker失敗時,完全可以通過操作圖獲得之前執(zhí)行的操作,進(jìn)行重新計算。

由于無需采用replication方式支持容錯,很好地降低了跨網(wǎng)絡(luò)的數(shù)據(jù)傳輸成本。不過,在某些場景下,Spark也需要利用記錄日志的方式來支持容錯。例如,在Spark Streaming中,針對數(shù)據(jù)進(jìn)行update操作,或者調(diào)用Streaming提供的window操作時,就需要恢復(fù)執(zhí)行過程的中間狀態(tài)。 此時,需要通過Spark提供的checkpoint機制,以支持操作能夠從checkpoint得到恢復(fù)。

針對RDD的wide dependency,最有效的容錯方式同樣還是采用checkpoint機制。不過,似乎Spark的***版本仍然沒有引入auto checkpointing機制。總結(jié)RDD是Spark的核心,也是整個Spark的架構(gòu)基礎(chǔ)。 它的特性可以總結(jié)如下:

  • 它是不變的數(shù)據(jù)結(jié)構(gòu)存儲
  • 它是支持跨集群的分布式數(shù)據(jù)結(jié)構(gòu)
  • 可以根據(jù)數(shù)據(jù)記錄的key對結(jié)構(gòu)進(jìn)行分區(qū)
  • 提供了粗粒度的操作,且這些操作都支持分區(qū)
  • 它將數(shù)據(jù)存儲在內(nèi)存中,從而提供了低延遲性
責(zé)任編輯:武曉燕 來源: 36大數(shù)據(jù)
相關(guān)推薦

2016-10-24 23:04:56

SparkRDD數(shù)據(jù)

2017-04-25 09:50:16

SparkRDD核心

2018-04-17 09:03:01

SparkRDD大數(shù)據(jù)

2017-08-04 10:58:55

RDDSpark算子

2018-04-18 08:54:28

RDD內(nèi)存Spark

2018-05-28 08:54:45

SparkRDD Cache緩存

2019-04-17 15:16:00

Sparkshuffle算法

2021-03-04 08:39:21

SparkRDD調(diào)優(yōu)

2018-04-09 12:25:11

2022-05-03 00:03:11

狀態(tài)管理前端開發(fā)

2021-07-12 09:45:36

NameServer 核心Conusmer

2021-08-11 06:57:16

ShuffleSpark核心

2022-03-15 08:25:32

SparkShuffle框架

2018-03-21 11:05:26

Spark大數(shù)據(jù)應(yīng)用程序

2020-05-21 13:25:43

Spring組件架構(gòu)

2017-07-14 15:40:28

2023-12-13 10:22:04

APISpark數(shù)據(jù)

2016-11-15 14:33:05

Flink大數(shù)據(jù)

2022-03-15 09:31:17

ESLint工作原理前端

2014-04-09 09:42:30

ScalaJVM
點贊
收藏

51CTO技術(shù)棧公眾號