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

理解Spark的核心RDD

大數(shù)據(jù) Spark
與許多專有的大數(shù)據(jù)處理平臺(tái)不同,Spark建立在統(tǒng)一抽象的RDD之上,使得它可以以基本一致的方式應(yīng)對(duì)不同的大數(shù)據(jù)處理場(chǎng)景,包括MapReduce,Streaming,SQL,Machine Learning以及Graph等

[[174346]]

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

RDD是什么?

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

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

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

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

narrow dependencies的失敗恢復(fù)更有效,因?yàn)樗恍枰匦掠?jì)算丟失的parent partition即可,而且可以并行地在不同節(jié)點(diǎn)進(jìn)行重計(jì)算。而wide dependencies牽涉到RDD各級(jí)的多個(gè)Parent Partitions。下圖說明了narrow dependencies與wide dependencies之間的區(qū)別:

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

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

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

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

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

RDD對(duì)容錯(cuò)的支持

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

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

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

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

2016-10-24 09:52:45

SparkRDD容錯(cuò)

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
點(diǎn)贊
收藏

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