1.自動(dòng)進(jìn)行內(nèi)存和磁盤存儲(chǔ)的切換
spark會(huì)優(yōu)先將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,如果內(nèi)存放不下床蜘,才把數(shù)據(jù)寫入磁盤辙培,不但能計(jì)算內(nèi)存中的數(shù)據(jù)蔑水,也能計(jì)算內(nèi)存放不下的數(shù)據(jù)。
2.基于Lineage(血統(tǒng))高容錯(cuò)機(jī)制
Lineage是基于spark的依賴關(guān)系來完成扬蕊,每個(gè)操作只關(guān)聯(lián)父操作搀别,各分片之間的數(shù)據(jù)互不影響,出現(xiàn)錯(cuò)誤的時(shí)候只需要恢復(fù)單個(gè)的split特定部分厨相。
常規(guī)容錯(cuò)方式有兩種:
數(shù)據(jù)檢查點(diǎn)
通過數(shù)據(jù)中心的網(wǎng)絡(luò)連接各臺(tái)機(jī)器领曼,如果發(fā)生checkPoint的時(shí)候就需要復(fù)制數(shù)據(jù),復(fù)制是要通過網(wǎng)絡(luò)傳輸?shù)穆虼司W(wǎng)絡(luò)寬帶是分布式的瓶頸庶骄,對(duì)存儲(chǔ)的資源也是很大的消耗。
記錄數(shù)據(jù)的更新
當(dāng)有數(shù)據(jù)更新的時(shí)候践磅,就需要記錄數(shù)據(jù)单刁,這種方式不需要復(fù)制數(shù)據(jù)集。
- RDD是不可變的且lazy的
- RDD的寫操作是粗粒度的府适、讀操作可以是粗粒度羔飞,也可以是細(xì)粒度。
3.Task失敗會(huì)進(jìn)行特定次數(shù)的重試
默認(rèn)重試次數(shù)是4次檐春。TaskSchedulimpl的源碼如下:
def this(sc: SparkContext) = {
this(
sc,
sc.conf.get(config.MAX_TASK_FAILURES),
TaskSchedulerImpl.maybeCreateBlacklistTracker(sc))
}
private[spark] val MAX_TASK_FAILURES =
ConfigBuilder("spark.task.maxFailures")
.intConf
.createWithDefault(4)
4.Stage失敗逻淌,會(huì)自動(dòng)進(jìn)行特定次數(shù)的重試
Stage可以跟蹤多個(gè)StageInfo(存儲(chǔ)SparkListener監(jiān)聽到的所有Stage信息,將Stage信息傳遞給Listeners或web UI)疟暖。重試默認(rèn)次數(shù)是4次卡儒,且可以直接運(yùn)行計(jì)算失敗的階段,只計(jì)算失敗的數(shù)據(jù)分片俐巴,具體Stage源碼如下:
private[spark] object DAGScheduler {
// The time, in millis, to wait for fetch failure events to stop coming in after one is detected;
// this is a simplistic way to avoid resubmitting tasks in the non-fetchable map stage one by one
// as more failure events come in
val RESUBMIT_TIMEOUT = 200
// Number of consecutive stage attempts allowed before a stage is aborted
val DEFAULT_MAX_CONSECUTIVE_STAGE_ATTEMPTS = 4
}
5.checkpoint和persist(檢查點(diǎn)和持久化)骨望,可以主動(dòng)或被動(dòng)觸發(fā)
checkpoint是對(duì)RDD進(jìn)行的標(biāo)記,會(huì)產(chǎn)生一系列的文件欣舵,且所有父依賴都會(huì)被刪除擎鸠,是整個(gè)依賴的終點(diǎn)。checkpoint是lazy級(jí)別的缘圈。
persist后劣光,RDD的每個(gè)分片會(huì)保存在內(nèi)存或磁盤中,下一次使用相同RDD進(jìn)行其他action計(jì)算的時(shí)候糟把,就可以重用赎线。
6.數(shù)據(jù)調(diào)度彈性、DAGSchedule糊饱、TaskSchedule調(diào)度和資源調(diào)度無關(guān)
spark講執(zhí)行模型抽象成有向無環(huán)圖(Stage),各個(gè)Stage之間可以串行或這并行颠黎,從而不需要把Stage的中間結(jié)果輸出到HDFS中另锋,當(dāng)節(jié)點(diǎn)發(fā)生故障時(shí)滞项,其他節(jié)點(diǎn)可以替代該節(jié)點(diǎn)運(yùn)行。