学习笔记Spark(三)—— Spark架构及原理(spark架构、spark RDD)
一、Spark架構(gòu)
1.1、基本組件
Cluster Manager
在standalone模式中即為Master主節(jié)點(diǎn),控制整個(gè)集群,監(jiān)控worker。在YARN模式中為資源管理器。
Worker
從節(jié)點(diǎn),負(fù)責(zé)控制計(jì)算節(jié)點(diǎn),啟動(dòng)Executor或者Driver。在YARN模式中為NodeManager,負(fù)責(zé)計(jì)算節(jié)點(diǎn)的控制。
Driver
運(yùn)行Application的main()函數(shù)并創(chuàng)建SparkContext。
Executor
執(zhí)行器,在worker node上執(zhí)行任務(wù)的組件、用于啟動(dòng)線程池運(yùn)行任務(wù)。每個(gè)Application擁有獨(dú)立的一組Executor。
SparkContext
整個(gè)應(yīng)用的上下文,控制應(yīng)用的生命周期,主要包括:
RDD Objects(RDD DAG):構(gòu)建DAG圖;
DAG Scheduler:根據(jù)作業(yè)(task)構(gòu)建基于Stage的DAG,并提交Stage給TaskSchedule;
TaskScheduler:將任務(wù)(task)分發(fā)給Executor執(zhí)行。
1.2、Standalone模式運(yùn)行流程
Client:客戶端,負(fù)責(zé)提交Application應(yīng)用程序
Application:用戶編寫的Spark應(yīng)用程序,包含一個(gè)Driver功能的代碼
Driver:運(yùn)行Application代碼里的main函數(shù)并創(chuàng)建SparkContext
SparkContext:應(yīng)用上下文,控制整個(gè)生命周期。負(fù)責(zé)和Master通信,進(jìn)行資源申請(qǐng)、分配任務(wù)等。
1、SparkContext向Master注冊(cè)并申請(qǐng)資源
2、Master接收到SparkContext的資源申請(qǐng)要求,根據(jù)Worker的心跳周期內(nèi)的報(bào)告信息決定在哪個(gè)Worker上分配資源
3、Worker獲取到資源后,啟動(dòng)Executor,Executor啟動(dòng)后向SparkContext注冊(cè)并申請(qǐng)分配任務(wù)
4、SparkContext接收到Executor的任務(wù)申請(qǐng)后,SparkContext將Application代碼發(fā)送給Executor并自身解析Application代碼構(gòu)建RDD DAG圖,DAGScheduler將DAG劃分成一個(gè)或多個(gè)Stage,Stage根據(jù)Partition個(gè)數(shù)分成一個(gè)多個(gè)Task并形成TaskSet同時(shí)發(fā)送給TaskScheduler。TaskScheduler將Task分配到相應(yīng)的Worker,最后提交給Executor執(zhí)行。
5、Executor接收到Task之后運(yùn)行Task并SparkContext匯報(bào)任務(wù)狀態(tài)和進(jìn)度,直到Task運(yùn)行完成
所有Task運(yùn)行完成后,SparkContext向Master注銷,釋放資源
1.3、Spark on YARN
1.3.1、yarn-cluster運(yùn)行流程
在集群模式下,Driver運(yùn)行在Application Master上,Application Master進(jìn)程同時(shí)負(fù)責(zé)驅(qū)動(dòng)Application和從YARN中申請(qǐng)資源,該進(jìn)程運(yùn)行在YARN container內(nèi),所以啟動(dòng)Application Master的Client可以立即關(guān)閉而不必持續(xù)到Application的聲明周期。圖 1?18是YARN集群模式的作業(yè)運(yùn)行流程,流程描述如下:
- 客戶端生成作業(yè)信息提交給ResourceManager。
- ResourceManager在某一個(gè)NodeManager(由YARN決定)啟動(dòng)container并將Application Master分配給該NodeManager。
- NodeManager接收到ResourceManager的分配,啟動(dòng)Application Master并初始化作業(yè),此時(shí)NodeManager就稱為Driver。
- Application向ResourceManager申請(qǐng)資源,分配資源同時(shí)通知其他NodeManager啟動(dòng)相應(yīng)的Executor。
- Executor向NodeManager上的Application Master注冊(cè)匯報(bào)并完成相應(yīng)的任務(wù)。
1.3.2、yarn-client運(yùn)行流程
YARN客戶端模式的作業(yè)運(yùn)行流程。Application Master僅僅從YARN中申請(qǐng)資源給Executor,之后Client會(huì)跟container通信進(jìn)行作業(yè)的調(diào)度。YARN-Client模式的作業(yè)運(yùn)行流程描述如下:
- 客戶端生成作業(yè)信息提交給ResourceManager。
- ResourceManager在本地NodeManager啟動(dòng)Container并將Application Master分配給該NodeManager。
- NodeManager接收到ResourceManager的分配,啟動(dòng)Application Master并初始化作業(yè),此時(shí)這個(gè)NodeManager就稱為Driver。
- Application向ResourceManager申請(qǐng)資源,分配資源同時(shí)通知其他NodeManager啟動(dòng)相應(yīng)的Executor。
- Executor向本地啟動(dòng)的Application Master注冊(cè)匯報(bào)并完成相應(yīng)的任務(wù)。
二、Spark RDD
2.1、RDD簡(jiǎn)介
RDD(Resilient Distributed Datasets彈性分布式數(shù)據(jù)集),可以簡(jiǎn)單的把RDD理解成一個(gè)提供了許多操作接口的數(shù)據(jù)集合,和一般數(shù)據(jù)集不同的是,其實(shí)際數(shù)據(jù)分布存儲(chǔ)于一批機(jī)器中(內(nèi)存或磁盤中)
RDD最重要的特性就是,提供了容錯(cuò)性,可以自動(dòng)從節(jié)點(diǎn)失敗中恢復(fù)過來。即如果某個(gè)節(jié)點(diǎn)上的RDD partition,因?yàn)楣?jié)點(diǎn)故障,導(dǎo)致數(shù)據(jù)丟了,那么RDD會(huì)自動(dòng)通過自己的數(shù)據(jù)來源重新計(jì)算該partition。
RDD的數(shù)據(jù)默認(rèn)情況下存放在內(nèi)存中的,但是在內(nèi)存資源不足時(shí),Spark會(huì)自動(dòng)將RDD數(shù)據(jù)寫入磁盤。(彈性)
2.2、RDD 特點(diǎn)
- 它是集群節(jié)點(diǎn)上的不可改變的、已分區(qū)的集合對(duì)象;
- 通過并行轉(zhuǎn)換的方式來創(chuàng)建如(map、filter、join等);
- 失敗自動(dòng)重建;
- 可以控制存儲(chǔ)級(jí)別(內(nèi)存、磁盤等)來進(jìn)行重用;
- 必須是可序列化的;在內(nèi)存不足時(shí)可自動(dòng)降級(jí)為磁盤存儲(chǔ),把RDD存儲(chǔ)于磁盤上,這時(shí)性能有大的下降但不會(huì)差于現(xiàn)在的MapReduce;
- 對(duì)于丟失部分?jǐn)?shù)據(jù)分區(qū)只需要根據(jù)它的lineage就可重新計(jì)算出來,而不需要做特定的checkpoint;
注意:
① RDD一旦創(chuàng)建就不可更改
② 重建不是從最開始的點(diǎn)來重建的,可以是上一步開始重建
2.3、算子
(了解)
轉(zhuǎn)換(Transformations)(如:map、Filter、groupby、join等),Transformations操作是Lazy的,也就是說從一個(gè)RDD轉(zhuǎn)換生成另一個(gè)RDD的操作不是馬上執(zhí)行,spark在遇到Transformations操作時(shí)只會(huì)記錄需要這樣的操作,并不會(huì)去執(zhí)行,需要等到有Actions操作的時(shí)候才會(huì)真正啟動(dòng)計(jì)算過程進(jìn)行計(jì)算
操作(Actions)(如:count、collect、save等),Actions操作會(huì)返回結(jié)果或把RDD數(shù)據(jù)寫到存儲(chǔ)系統(tǒng)中。Actions是觸發(fā)Spark啟動(dòng)計(jì)劃的動(dòng)因。
2.4、寬依賴與窄依賴
窄依賴:表現(xiàn)為一個(gè)父RDD的分區(qū)對(duì)應(yīng)于一個(gè)子RDD的分區(qū)或者多個(gè)父RDD的分區(qū)對(duì)應(yīng)于一個(gè)子RDD的分區(qū)。
寬依賴:表現(xiàn)為存在一個(gè)父RDD的一個(gè)分區(qū)對(duì)應(yīng)一個(gè)子RDD的多個(gè)分區(qū)。
圖中的每個(gè)小方格代表一個(gè)分區(qū),而一個(gè)大方格(比如包含3個(gè)或2個(gè)小方格的大方格)代表一個(gè)RDD,豎線左邊顯示的是窄依賴,而右邊是寬依賴。
要知道寬窄依賴的區(qū)別,那么先要了解父RDD(Parent RDD)和子RDD(Child RDD)。在上圖中,“map,filter”左上面的是父RDD,而右上面的是子RDD。“union”左上面的兩個(gè)RDD都是其右上面的RDD的父RDD,所以它是有兩個(gè)父RDD的。
總結(jié)
以上是生活随笔為你收集整理的学习笔记Spark(三)—— Spark架构及原理(spark架构、spark RDD)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记Spark(二)—— Spark
- 下一篇: 学习笔记Spark(四)—— Spark