基本概念
*& RDD
是彈性分布式數(shù)據(jù)集,【我也不太清楚這個概念】。是一個分布式抽象內(nèi)存的概念,提供了一種高度受限的共享內(nèi)存模型【完成流運算,迭代運算,交互運算】
*& DAG
(有向無環(huán)圖)的簡稱。反映了RDD之間的依賴關(guān)系
*&Executor
是一個運行在worknode 上的一個進程。負責(zé)運行任務(wù)。并且為應(yīng)用程序存取數(shù)據(jù)
*& 應(yīng)用:
用戶編寫的Spark程序
*& 任務(wù):
運行在Executor上的工作單元
*& 作業(yè):
一個作業(yè)包含多個RDD和作用在相應(yīng)RDD上的各種操作
*&階段:
是作業(yè)的基本調(diào)度單位。一個作業(yè)會分為多組任務(wù),每組任務(wù)被稱為階段,或者被稱為任務(wù)集。
架構(gòu)設(shè)計
?????????????? Spark運行架構(gòu)包括集群資源管理器(cluster Manager)? 運行作業(yè)任務(wù)的工作節(jié)點(worknode),每個應(yīng)用的任務(wù)的控制節(jié)點(driver)和在沒一個工作節(jié)點上負責(zé)具體執(zhí)行任務(wù)的Executor 過程。

Spark 采用excutor的優(yōu)點
1.利用多線程來只選執(zhí)行具體任務(wù)【Hadoop 是采用進程模型】來減少任務(wù)的啟動開銷
2.在executor中有一個BlockManger 存儲模塊。 會將內(nèi)存和硬盤共同作為存儲設(shè)備,當(dāng)需要進行迭代運時候,可以將中間結(jié)果存儲到這個模塊中,下次需要時候,直接讀取該存儲模塊中的數(shù)據(jù),而不需要讀取HDFS中的數(shù)據(jù),減少I/O操作;或者再交互式查詢場景下,預(yù)先將表緩存到該存儲模塊上,從而提高I/O性能。
spark運行架構(gòu)
在Spark中一格應(yīng)用有一個Driver節(jié)點和多個job作業(yè)組成,一個作業(yè)由多個階段【stage】組成,一個階段由多個task 組成。
當(dāng)執(zhí)行一個應(yīng)用時候,clustermanger,申請資源,啟動Executor,并向Executor 發(fā)送文件和代碼。在Executor上執(zhí)行任務(wù),任務(wù)結(jié)束后,執(zhí)行結(jié)果返回給Driver 或者寫入到HDFS.Hbase


Spark執(zhí)行流程
(1)當(dāng)一個Spark應(yīng)用被提交時,首先需要為這個應(yīng)用構(gòu)建起基本的運行環(huán)境,即由任務(wù)控制節(jié)點(Driver)創(chuàng)建一個SparkContext,由SparkContext負責(zé)和資源管理器(Cluster Manager)的通信以及進行資源的申請、任務(wù)的分配和監(jiān)控等。SparkContext會向資源管理器注冊并申請運行Executor的資源;
(2)資源管理器為Executor分配資源,并啟動Executor進程,Executor運行情況將隨著“心跳”發(fā)送到資源管理器上;
(3)SparkContext根據(jù)RDD的依賴關(guān)系構(gòu)建DAG圖,DAG圖提交給DAG調(diào)度器(DAGScheduler)進行解析,將DAG圖分解成多個“階段”(每個階段都是一個任務(wù)集),并且計算出各個階段之間的依賴關(guān)系,然后把一個個“任務(wù)集”提交給底層的任務(wù)調(diào)度器(TaskScheduler)進行處理;Executor向SparkContext申請任務(wù),任務(wù)調(diào)度器將任務(wù)分發(fā)給Executor運行,同時,SparkContext將應(yīng)用程序代碼發(fā)放給Executor;
(4)任務(wù)在Executor上運行,把執(zhí)行結(jié)果反饋給任務(wù)調(diào)度器,然后反饋給DAG調(diào)度器,運行完畢后寫入數(shù)據(jù)并釋放所有資源。

Spark 特點
(1)每個應(yīng)用都有自己專屬的Executor進程,并且該進程在應(yīng)用運行期間一直駐留。Executor進程以多線程的方式運行任務(wù),減少了多進程任務(wù)頻繁的啟動開銷,使得任務(wù)執(zhí)行變得非常高效和可靠;
(2)Spark運行過程與資源管理器無關(guān),只要能夠獲取Executor進程并保持通信即可;
(3)Executor上有一個BlockManager存儲模塊,類似于鍵值存儲系統(tǒng)(把內(nèi)存和磁盤共同作為存儲設(shè)備),在處理迭代計算任務(wù)時,不需要把中間結(jié)果寫入到HDFS等文件系統(tǒng),而是直接放在這個存儲系統(tǒng)上,后續(xù)有需要時就可以直接讀?。辉诮换ナ讲樵儓鼍跋?,也可以把表提前緩存到這個存儲系統(tǒng)上,提高讀寫IO性能;
(4)任務(wù)采用了數(shù)據(jù)本地性和推測執(zhí)行等優(yōu)化機制。數(shù)據(jù)本地性是盡量將計算移到數(shù)據(jù)所在的節(jié)點上進行,即“計算向數(shù)據(jù)靠攏”,因為移動計算比移動數(shù)據(jù)所占的網(wǎng)絡(luò)資源要少得多。而且,Spark采用了延時調(diào)度機制,可以在更大的程度上實現(xiàn)執(zhí)行過程優(yōu)化。比如,擁有數(shù)據(jù)的節(jié)點當(dāng)前正被其他的任務(wù)占用,那么,在這種情況下是否需要將數(shù)據(jù)移動到其他的空閑節(jié)點呢?答案是不一定。因為,如果經(jīng)過預(yù)測發(fā)現(xiàn)當(dāng)前節(jié)點結(jié)束當(dāng)前任務(wù)的時間要比移動數(shù)據(jù)的時間還要少,那么,調(diào)度就會等待,直到當(dāng)前節(jié)點可用。
體會:
????????? 要想了解架構(gòu),先把各個節(jié)點之間的關(guān)系弄清楚,誰包含誰,誰在誰上面運行。比如Spark包含一個控制節(jié)點,多個工作job節(jié)點,工作節(jié)點 又包含多個階段stage。階段又包含多個task .一個worknode 上有一個executor? 應(yīng)用通過Driver 中的SparkConnect 告知cluster manager,cm 開始一系列的申請調(diào)度資源,啟動所有的executor,然后想executor發(fā)送代碼文件,在executor上執(zhí)行,然后把執(zhí)行結(jié)果返回給driver或者存到hbase中去.??