理解Spark的核心RDD
http://www.infoq.com/cn/articles/spark-core-rdd/
//摘要
【RDD將操作分為兩類:transformation與action。無(wú)論執(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ù)訪問(wèn)變得更高效咪鲜,也避免了大量中間結(jié)果對(duì)內(nèi)存的消耗】。
總結(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)存中鸟雏,從而提供了低延遲性
//
與許多專有的大數(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還提供了一組豐富的操作來(lái)【操作這些數(shù)據(jù)】械媒。在這些操作中目锭,諸如【map、flatMap纷捞、filter等轉(zhuǎn)換操作】實(shí)現(xiàn)了monad模式痢虹,很好地契合了Scala的【集合操作】。除此之外主儡,RDD還提供了諸如join奖唯、groupBy、reduceByKey等更為方便的操作(注意缀辩,reduceByKey是action臭埋,而非transformation)踪央,以支持常見(jiàn)的數(shù)據(jù)運(yùn)算。
通常來(lái)講瓢阴,針對(duì)數(shù)據(jù)處理有幾種常見(jiàn)模型畅蹂,包括: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讥巡。下圖說(shuō)明了narrow dependencies與wide dependencies之間的區(qū)別:
【RDD將操作分為兩類:transformation與action。無(wú)論執(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ù)訪問(wèn)變得更高效缆巧,也避免了大量中間結(jié)果對(duì)內(nèi)存的消耗】布持。
Spark快速入門指南 - 夢(mèng)里花落的博客 - 博客頻道 - CSDN.NET
http://blog.csdn.net/qq_19244267/article/details/46456873
【RDDs提供actions操作,通過(guò)它可以返回值陕悬;同時(shí)還提供 transformations操作题暖,通過(guò)它可以返回一個(gè)新的RDD的引用】。如下:
1 scala> textFile.count() // Number of items in this RDD
2 res1: Long = 108
我們?cè)僭囋噒ransformations操作捉超,下面的例子中我們通過(guò)使用filter transformation來(lái)一個(gè)新的RDD:
1 scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))
2 linesWithSpark: org.apache.spark.rdd.RDD[String] = FilteredRDD[4] at
3 filter at <console>:14
我們將transformations操作和actions操作連起來(lái)操作:
1 scala> textFile.filter(line => line.contains("Spark")).count()
2 res3: Long = 15
更多關(guān)于RDD上面的操作
RDD的transformations操作和actions操作可以用于更復(fù)雜的計(jì)算芙委。下面的例子是找出README.md文件中單詞數(shù)最多的行有多少個(gè)單詞
1 scala> var size = textFile.map(line=>line.split(" ").size)
2 scala> size.reduce((a, b)=>if (a > b) a else b)
3 res4: Long = 15
map函數(shù)負(fù)責(zé)將line按照空格分割,并得到這行單詞的數(shù)量狂秦,而reduce函數(shù)將獲取文件中單詞數(shù)最多的行有多少個(gè)單詞。map和reduce函數(shù)的參數(shù)是Scala的函數(shù)式編程風(fēng)格推捐。我們可以直接用Java里面的Math.max()函數(shù)裂问,這樣會(huì)使得這段代碼更好理解