RDD基礎(chǔ)
RDD:Resilient Distributed Datasets唱星,彈性分布式數(shù)據(jù)集
分布在集群中的只讀對(duì)象集合(由多個(gè)分區(qū)(Partition)構(gòu)成乱豆,這些分區(qū)運(yùn)行在集群中的不同節(jié)點(diǎn)上)
可以存儲(chǔ)在磁盤或內(nèi)存中(多種存儲(chǔ)級(jí)別)
通過并行“轉(zhuǎn)換”操作構(gòu)造
失效后自動(dòng)重構(gòu)
RDD可以包含Python局扶、java吉执、Scala中任意類型的對(duì)象挺益,甚至可以包含用戶自定義的對(duì)象涕蚤。
兩種方法創(chuàng)建RDD:
1.讀取外部數(shù)據(jù)集宪卿。
2.在驅(qū)動(dòng)程序里分發(fā)驅(qū)動(dòng)器程序中的對(duì)象集合(比如list和set)。
-
RDD支持兩種類型操作
- 1.轉(zhuǎn)化操作(tranformation):由一個(gè)RDD生成一個(gè)新的RDD.舊的RDD不會(huì)被改變万栅。map佑钾、filter、groupBy烦粒、reduceBy
- 2.行動(dòng)操作(action):對(duì)RDD計(jì)算出一個(gè)結(jié)果休溶,并把結(jié)果返回到驅(qū)動(dòng)程序中,或者寫入外部存儲(chǔ)系統(tǒng)中。count兽掰、collect芭碍、saveAsTextFile
-
注:轉(zhuǎn)化操作返回的是RDD,行動(dòng)操作返回的是其它數(shù)據(jù)類型禾进。
-
惰性求值
轉(zhuǎn)化操作和行動(dòng)操作的區(qū)別在于Spark計(jì)算RDD的方式不同豁跑。RDD的轉(zhuǎn)化操作都是惰性求值廉涕,即對(duì)RDD調(diào)用轉(zhuǎn)化操作(如map())時(shí)泻云,操作不會(huì)立即執(zhí)行,它們只有第一次在一個(gè)行動(dòng)操作中用到時(shí)才會(huì)真正計(jì)算狐蜕。
默認(rèn)情況下宠纯,Spark的RDD會(huì)在每次對(duì)它們進(jìn)行行動(dòng)操作時(shí)重新計(jì)算,如果想在多個(gè)行動(dòng)操作中重用同一個(gè)RDD,可以使用RDD.persist()层释,讓Spark把這個(gè)RDD緩存起來婆瓜。默認(rèn)緩存到內(nèi)存中(以分區(qū)方式存儲(chǔ)到集群中各個(gè)機(jī)器上)
-
持久化(緩存)
- 持久化原因如上。持久化數(shù)據(jù)丟失怎么辦贡羔?讓Spark持久化一個(gè)RDD廉白,計(jì)算出RDD的節(jié)點(diǎn)會(huì)分別保存它們所求出的分區(qū)數(shù)據(jù),如果一個(gè)有持久化的節(jié)點(diǎn)發(fā)生故障乖寒,Spark會(huì)在用到緩存的數(shù)據(jù)時(shí)重算丟失的數(shù)據(jù)分區(qū)猴蹂,當(dāng)然可以把數(shù)據(jù)備份到多個(gè)節(jié)點(diǎn)上,以避免單節(jié)點(diǎn)故障拖累進(jìn)度楣嘁。
持久化數(shù)據(jù)方式:默認(rèn)情況下persist()會(huì)把數(shù)據(jù)以序列化的形式緩存在JVM的堆空間中磅轻,當(dāng)我們把數(shù)據(jù)寫到磁盤或堆外存儲(chǔ)上是也總是使用序列化數(shù)據(jù)。
持久化級(jí)別:
如果采用緩存在內(nèi)存中的級(jí)別逐虚,當(dāng)內(nèi)存放不下是聋溜,Spark會(huì)自動(dòng)利用最近最少使用(LRU)的策略吧最老的分區(qū)從內(nèi)存中移除。
向Spark傳遞函數(shù)
- Spark 的大部分轉(zhuǎn)化操作和一部分行動(dòng)操作叭爱,都需要依賴用戶傳遞的函數(shù)來計(jì)算撮躁。
- 在Scala 中,我們可以把定義的內(nèi)聯(lián)函數(shù)买雾、方法的引用或靜態(tài)方法傳遞給Spark馒胆,就像Scala 的其他函數(shù)式API 一樣。我們還要考慮其他一些細(xì)節(jié)凝果,比如所傳遞的函數(shù)及其引用的數(shù)據(jù)需要是可序列化的(實(shí)現(xiàn)了Java 的Serializable 接口)祝迂。
- 如果在Scala 中出現(xiàn)了NotSerializableException,通常問題就在于我們傳遞了一個(gè)不可序列化的類中的函數(shù)或字段器净。記住型雳,傳遞局部可序列化變量或頂級(jí)對(duì)象中的函數(shù)始終是安全的。
常見轉(zhuǎn)化操作和行動(dòng)操作
sample(withReplacement, fraction, seed):對(duì)RDD采樣,以及是否替換纠俭。