傳統(tǒng)的單機(jī)系統(tǒng)旭等,雖然可以多核共享內(nèi)存酌呆、磁盤(pán)等資源,但是當(dāng)計(jì)算與存儲(chǔ)能力無(wú)法滿(mǎn)足大規(guī)模數(shù)據(jù)處理的需要時(shí)搔耕,面對(duì)自身CPU與存儲(chǔ)無(wú)法擴(kuò)展的先天限制肪笋,單機(jī)系統(tǒng)就力不從心了。
1.分布式系統(tǒng)的架構(gòu)
所謂的分布式系統(tǒng)度迂,即為在網(wǎng)絡(luò)互連的多個(gè)計(jì)算單元執(zhí)行任務(wù)的軟硬件系統(tǒng),一般包括分布式操作系統(tǒng)猜揪、分布式數(shù)據(jù)庫(kù)系統(tǒng)惭墓、分布式應(yīng)用程序等。本書(shū)介紹的Spark分布式計(jì)算框架而姐,可以看作分布式軟件系統(tǒng)的組成部分腊凶,基于Spark,開(kāi)發(fā)者可以編寫(xiě)分布式計(jì)算程序拴念。
直觀來(lái)看钧萍,大規(guī)模分布式系統(tǒng)由許多計(jì)算單元構(gòu)成,每個(gè)計(jì)算單元之間松耦合政鼠。同時(shí)风瘦,每個(gè)計(jì)算單元都包含自己的CPU、內(nèi)存公般、總線(xiàn)及硬盤(pán)等私有計(jì)算資源万搔。這種分布式結(jié)構(gòu)的最大特點(diǎn)在于不共享資源胡桨,與此同時(shí),計(jì)算節(jié)點(diǎn)可以無(wú)限制擴(kuò)展瞬雹,計(jì)算能力和存儲(chǔ)能力也因而得到巨大增長(zhǎng)昧谊。但是由于分布式架構(gòu)在資源共享方面的先天缺陷,開(kāi)發(fā)者在書(shū)寫(xiě)和優(yōu)化程序時(shí)應(yīng)引起注意酗捌。分布式系統(tǒng)架構(gòu)如圖1-2所示呢诬。
[插圖]
圖1-2 分布式系統(tǒng)架構(gòu)圖
為了減少網(wǎng)絡(luò)I/O開(kāi)銷(xiāo),分布式計(jì)算的一個(gè)核心原則是數(shù)據(jù)應(yīng)該盡量做到本地計(jì)算胖缤。在計(jì)算過(guò)程中尚镰,每個(gè)計(jì)算單元之間需要傳輸信息,因此在信息傳輸較少時(shí)草姻,分布式系統(tǒng)可以利用資源無(wú)限擴(kuò)展的優(yōu)勢(shì)達(dá)到高效率钓猬,這也是分布式系統(tǒng)的優(yōu)勢(shì)。目前分布式系統(tǒng)在數(shù)據(jù)挖掘和決策支持等方面有著廣泛的應(yīng)用撩独。
Spark正是基于這種分布式并行架構(gòu)而產(chǎn)生敞曹,也可以利用分布式架構(gòu)的優(yōu)勢(shì),根據(jù)需要综膀,對(duì)計(jì)算能力和存儲(chǔ)能力進(jìn)行擴(kuò)展澳迫,以應(yīng)對(duì)處理海量數(shù)據(jù)帶來(lái)的挑戰(zhàn)。同時(shí)剧劝,Spark的快速及容錯(cuò)等特性橄登,讓數(shù)據(jù)處理分析顯得游刃有余。
- Spark架構(gòu)
Spark架構(gòu)采用了分布式計(jì)算中的Master-Slave模型讥此。集群中運(yùn)行Master進(jìn)程的節(jié)點(diǎn)稱(chēng)為Master拢锹,同樣,集群中含有Worker進(jìn)程的節(jié)點(diǎn)為Slave萄喳。Master負(fù)責(zé)控制整個(gè)集群的運(yùn)行卒稳;Worker節(jié)點(diǎn)相當(dāng)于分布式系統(tǒng)中的計(jì)算節(jié)點(diǎn),它接收Master節(jié)點(diǎn)指令并返回計(jì)算進(jìn)程到Master; Executor負(fù)責(zé)任務(wù)的執(zhí)行他巨;Client是用戶(hù)提交應(yīng)用的客戶(hù)端充坑;Driver負(fù)責(zé)協(xié)調(diào)提交后的分布式應(yīng)用。具體架構(gòu)如圖1-3所示染突。
[插圖]
圖1-3 Spark架構(gòu)
在Spark應(yīng)用的執(zhí)行過(guò)程中捻爷,Driver和Worker是相互對(duì)應(yīng)的。Driver是應(yīng)用邏輯執(zhí)行的起點(diǎn)份企,負(fù)責(zé)Task任務(wù)的分發(fā)和調(diào)度也榄;Worker負(fù)責(zé)管理計(jì)算節(jié)點(diǎn)并創(chuàng)建Executor來(lái)并行處理Task任務(wù)。Task執(zhí)行過(guò)程中所需的文件和包由Driver序列化后傳輸給對(duì)應(yīng)的Worker節(jié)點(diǎn)薪棒,Executor對(duì)相應(yīng)分區(qū)的任務(wù)進(jìn)行處理手蝎。
下面介紹Spark架構(gòu)中的組件榕莺。
1)Client:提交應(yīng)用的客戶(hù)端。
2)Driver:執(zhí)行Application中的main函數(shù)并創(chuàng)建SparkContext棵介。
3)ClusterManager:在YARN模式中為資源管理器钉鸯。在Standalone模式中為Master(主節(jié)點(diǎn)),控制整個(gè)集群邮辽。
4)Worker:從節(jié)點(diǎn)唠雕,負(fù)責(zé)控制計(jì)算節(jié)點(diǎn)。啟動(dòng)Executor或Driver吨述,在YARN模式中為NodeManager岩睁。
5)Executor:在計(jì)算節(jié)點(diǎn)上執(zhí)行任務(wù)的組件。
6)SparkContext:應(yīng)用的上下文揣云,控制應(yīng)用的生命周期捕儒。
7)RDD:彈性分布式數(shù)據(jù)集,Spark的基本計(jì)算單元邓夕,一組RDD可形成有向無(wú)環(huán)圖刘莹。
8)DAG Scheduler:根據(jù)應(yīng)用構(gòu)建基于Stage的DAG,并將Stage提交給Task Scheduler焚刚。
9)Task Scheduler:將Task分發(fā)給Executor執(zhí)行点弯。
10)SparkEnv:線(xiàn)程級(jí)別的上下文,存儲(chǔ)運(yùn)行時(shí)重要組件的應(yīng)用矿咕,具體如下:
①SparkConf:存儲(chǔ)配置信息抢肛。
②BroadcastManager:負(fù)責(zé)廣播變量的控制及元信息的存儲(chǔ)。
③BlockManager:負(fù)責(zé)Block的管理碳柱、創(chuàng)建和查找捡絮。
④MetricsSystem:監(jiān)控運(yùn)行時(shí)的性能指標(biāo)。
⑤MapOutputTracker:負(fù)責(zé)shuffle元信息的存儲(chǔ)莲镣。
Spark架構(gòu)揭示了Spark的具體流程如下:
1)用戶(hù)在Client提交了應(yīng)用锦援。
2)Master找到Worker,并啟動(dòng)Driver剥悟。
3)Driver向資源管理器(YARN模式)或者M(jìn)aster(Standalone模式)申請(qǐng)資源,并將應(yīng)用轉(zhuǎn)化為RDD Graph曼库。
4)DAG Scheduler將RDD Graph轉(zhuǎn)化為Stage的有向無(wú)環(huán)圖提交給Task Scheduler区岗。
5)Task Scheduler提交任務(wù)給Executor執(zhí)行。
- Spark運(yùn)行邏輯
下面舉例說(shuō)明Spark的運(yùn)行邏輯毁枯,如圖1-4所示慈缔,在Action算子被觸發(fā)之后,所有累積的算子會(huì)形成一個(gè)有向無(wú)環(huán)圖DAG种玛。Spark會(huì)根據(jù)RDD之間不同的依賴(lài)關(guān)系形成Stage藐鹤,每個(gè)Stage都包含一系列函數(shù)執(zhí)行流水線(xiàn)瓤檐。圖1-4中A、B娱节、C挠蛉、D、E肄满、F為不同的RDD, RDD內(nèi)的方框?yàn)镽DD的分區(qū)谴古。
[插圖]
圖1-4 Spark執(zhí)行RDD Graph
圖1-4中的運(yùn)行邏輯如下:
1)數(shù)據(jù)從HDFS輸入Spark。
2)RDD A稠歉、RDD C經(jīng)過(guò)flatMap與Map操作后掰担,分別轉(zhuǎn)換為RDD B和RDD D。
3)RDD D經(jīng)過(guò)reduceByKey操作轉(zhuǎn)換為RDD E怒炸。
4)RDD B與RDD E進(jìn)行join操作轉(zhuǎn)換為RDD F带饱。
5)RDD F通過(guò)函數(shù)saveAsSequenceFile輸出保存到HDFS中。