大數(shù)據(jù)服務(wù)上云的思考">大數(shù)據(jù)服務(wù)上云的思考
923
2025-03-31
Spark 學(xué)習(xí)中的一些疑問
問題1:Spark 為什么只有在調(diào)用 action 時(shí)才會(huì)觸發(fā)任務(wù)執(zhí)行呢?
Spark 算子主要?jiǎng)澐譃閮深悾簍ransformation 和 action,并且只有 action 算子觸發(fā)的時(shí)候才會(huì)真正執(zhí)行任務(wù)。
Spark RDD 的緩存和 checkpoint 是懶加載操作,只有 action 觸發(fā)的時(shí)候才會(huì)真正執(zhí)行,其實(shí)不僅是 Spark RDD,在 Spark 其他組件如SparkStreaming 中也是如此,這是 Spark 的一個(gè)特性之一。像我們常用的算子 map、flatMap、filter 都是 transformation 算子,而 collect、count、saveAsTextFile、countByKey、foreach 則為 action 算子。
但是,為什么 Spark 任務(wù)只有在調(diào)用 action 算子的時(shí)候,才會(huì)真正執(zhí)行呢?
假設(shè)一種情況:假如 Spark 中 transformation 直接觸發(fā) Spark 任務(wù)!那么會(huì)產(chǎn)生什么結(jié)果呢?
導(dǎo)致 map 執(zhí)行完了要立即輸出,數(shù)據(jù)也必然要落地(內(nèi)存和磁盤)
map 任務(wù)的生成、調(diào)度、執(zhí)行,以及彼此之間的 rpc 通信等等,當(dāng)牽扯到大量任務(wù)、大數(shù)據(jù)量時(shí),會(huì)很影響性能
看到這兩點(diǎn)是不是很容易聯(lián)想到 MapReduce 的計(jì)算模型,MapReduce 因?yàn)橹虚g結(jié)果需要落地,導(dǎo)致性能相對 Spark 較低下,這也是 MapReduce 廣為詬病的原因之一。所以 Spark 采用只有調(diào)用 action 算子時(shí)才會(huì)真正執(zhí)行任務(wù),這是相對于 MapReduce 的優(yōu)化點(diǎn)之一。
但是每個(gè) Spark RDD 中連續(xù)調(diào)用多個(gè) map 類算子,Spark 任務(wù)是對數(shù)據(jù)在一次循環(huán)遍歷中完成還是每個(gè) map 算子都進(jìn)行一次循環(huán)遍歷呢?
實(shí)際上,并不需要對每個(gè) map 算子都進(jìn)行循環(huán)遍歷。Spark 會(huì)將多個(gè) map 算子 pipeline 起來應(yīng)用到 RDD 分區(qū)的每個(gè)數(shù)據(jù)元素上
問題2:Spark 與 MapReduce 對比
Spark
集流批處理、交互式查詢、機(jī)器學(xué)習(xí)及圖計(jì)算等于一體
基于內(nèi)存迭代式計(jì)算,適合低延遲、迭代運(yùn)算類型作業(yè)
可以通過緩存共享 rdd、DataFrame,提升效率【尤其是 SparkSQL 可以將數(shù)據(jù)以列式的形式存儲(chǔ)于內(nèi)存中】
中間結(jié)果支持 checkpoint,遇錯(cuò)可快速恢復(fù)
支持 DAG、map 之間以 pipeline 方式運(yùn)行,無需刷磁盤
多線程模型,每個(gè) worker 節(jié)點(diǎn)運(yùn)行一個(gè)或多個(gè) executor 服務(wù),每個(gè) task 作為線程運(yùn)行在 executor 中,task 間可共享資源
Spark 編程模型更靈活,支持多種語言如 java、scala、python、R,并支持豐富的 transformation 和 action 的算子
MapReduce
適合離線數(shù)據(jù)處理,不適合迭代計(jì)算、交互式處理、流式處理
中間結(jié)果需要落地,需要大量的磁盤 IO 和網(wǎng)絡(luò) IO 影響性能
雖然 MapReduce 中間結(jié)果可以存儲(chǔ)于 HDFS,利用 HDFS 緩存功能,但相對 Spark 緩存功能較低效
多進(jìn)程模型,任務(wù)調(diào)度(頻繁申請、釋放資源)和啟動(dòng)開銷大,不適合低延遲類型作業(yè)
MR 編程不夠靈活,僅支持 map 和 reduce 兩種操作。當(dāng)一個(gè)計(jì)算邏輯復(fù)雜的時(shí)候,需要寫多個(gè) MR 任務(wù)運(yùn)行【并且這些 MR 任務(wù)生成的結(jié)果在下一個(gè) MR 任務(wù)使用時(shí)需要將數(shù)據(jù)持久化到磁盤才行,這就不可避免的進(jìn)行遭遇大量磁盤 IO 影響效率】
MapReduce spark
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。