Spark核心—RDD( Resilient Distributed Dataset 彈性分布式數(shù)據(jù)集模型)
1.四個(gè)特征
– RDD使用戶能夠顯式將計(jì)算結(jié)果保存在內(nèi)存中,控制數(shù)據(jù)的劃分
– 記錄數(shù)據(jù)的變換和描述,而不是數(shù)據(jù)本身,以保證容錯(cuò)
– 懶操作,延遲計(jì)算,action的時(shí)候才操作
– 瞬時(shí)性,用時(shí)才產(chǎn)生,用完就釋放
2.四種構(gòu)建方法
– 從共享文件系統(tǒng)中獲取,如從HDFS中讀數(shù)據(jù)構(gòu)建RDD
? val a = sc.textFile(“/xxx/yyy/file”)
– 通過(guò)現(xiàn)有RDD轉(zhuǎn)換得到
? val b = a.map(x => (x, 1))
– 定義一個(gè)scala數(shù)組
? val c = sc.parallelize(1 to 10, 1)
– 由一個(gè)已經(jīng)存在的RDD通過(guò)持久化操作生成
? val d = a.persist(), a. saveAsHadoopFile(“/xxx/yyy/zzz”)
3.partition和依賴
– 每個(gè)RDD包含了數(shù)據(jù)分塊/分區(qū)(partition)的集合,每個(gè)partition是不可分割的
– 每個(gè)partition的計(jì)算就是一個(gè)task,task是調(diào)度的基本單位
– 與父RDD的依賴關(guān)系(rddA=>rddB)
寬依賴: B的每個(gè)partition依賴于A的所有partition
? 比如groupByKey、reduceByKey、join……,由A產(chǎn)生B時(shí)會(huì)先對(duì)A做shuffle分桶
窄依賴: B的每個(gè)partition依賴于A的常數(shù)個(gè)partition
? 比如map、filter、union……
4.stage和依賴
– 從后往前,將寬依賴的邊刪掉,連通分量及其所有依賴的RDD,構(gòu)成一個(gè)stage
– 每個(gè)stage內(nèi)部盡可能多地包含一組具有窄依賴關(guān)系的轉(zhuǎn)換,并將它們流水線并行化
5.數(shù)據(jù)局部性原則
– 如果一個(gè)任務(wù)需要的數(shù)據(jù)在某個(gè)節(jié)點(diǎn)的內(nèi)存中,這個(gè)任務(wù)就會(huì)被分配至那個(gè)節(jié)點(diǎn)
– 需要的數(shù)據(jù)在某個(gè)節(jié)點(diǎn)的文件系統(tǒng)中,就分配至那個(gè)節(jié)點(diǎn)
6.容錯(cuò)性原則
– 如果此task失敗,AM會(huì)重新分配task
– 如果task依賴的上層partition數(shù)據(jù)已經(jīng)失效了,會(huì)先將其依賴的partition計(jì)算任務(wù)再重算一遍
? 寬依賴中被依賴partition,可以將數(shù)據(jù)保存HDFS,以便快速重構(gòu)(checkpoint)
? 窄依賴只依賴上層一個(gè)partition,恢復(fù)代價(jià)較少
– 可以指定保存一個(gè)RDD的數(shù)據(jù)至節(jié)點(diǎn)的cache中,如果內(nèi)存不夠,會(huì)LRU釋放一部分,仍有重構(gòu)的可能








暫無(wú)數(shù)據(jù)