一: Spark內(nèi)核架構(gòu)
1,Drive是運行程序的時候有main方法,并且會創(chuàng)建SparkContext對象,是程序運行調(diào)度的中心,向Master注冊程序,然后Master分配資源。
應用程序: Application = Driver(驅(qū)動程序) + Executor(執(zhí)行程序)
Driver部分的代碼:主要是SparkContext +SparkConf
Application 的main 方法 、創(chuàng)建sparkcontext、這樣 環(huán)境對象 sparkcontext 創(chuàng)建時要有程序的高層調(diào)度器DAGScheduler 分為幾個階段 、底層調(diào)度器TasKScheduler 一個階段的任務處理 、SchedulerBackend向Master 注冊程序 、分資源 、根據(jù) job 許多RDD 從后向前倒推 如寬依賴劃分不同的stage 然后提交給底層調(diào)度器TaskScheduler 然后根據(jù) 數(shù)據(jù)的本地性 發(fā)送到 Excutor 去執(zhí)行,如出問題 向 Drive 部分 匯報 完成 關(guān)閉創(chuàng)建對象
Executor 是運行在Worker所在節(jié)點上,為當前應用程序而開啟的一個JVM進程里邊的一個對象,這個對象負責具體Task的運行。這個JVM進程里面是通過 線程池并發(fā) 每個線程運行一個Task任務 ,完成后 進行 線程復用。
默認情況在一個節(jié)點上 只為當前程序 開啟 一個 Excutor。?
Cluster Manager(集群中獲取資源的Web服務)?
spark Aplication 運行不依賴 Cluster Manager?
可插拔的 資源方式 粗粒度的?
Worker 操作代碼的節(jié)點,不運行 程序的代碼,管理 當前 節(jié)點的資源(cup,Memory),并接收 Master指令來分配具體的計算資源的Excutor(在新的進程中分配)?
并通過ExcutorRunner 來具體啟動一個新進程,進程里面有Executor。
在此可以做一個比喻:Worker是工頭,Cluster Manager:是項目經(jīng)理?
Master:是Boss
worker 不會 匯報 當前信息(發(fā)心跳) 給 Master?
故障時候 發(fā)的心跳 只有 workid?
Master 分配時 就知道 資源
Job 包含一系列的task 并行計算 一般由action 觸發(fā) action不會產(chǎn)生RDD
action前面的是RDD ,前面的RDD是Transformation級別的是lazy的執(zhí)行方式,他是從后往前推,如果后面的RDD與前面的RDD是回溯的話是窄依賴(如果父RDD的一個Partition被一個子RDD的Partion所使用的話就是窄依賴,否則的話就是寬依賴,如果子RDD中的Partition對父RDD的Partition依賴的數(shù)量不會隨著數(shù)據(jù)量規(guī)模的改變而改變的話就是窄依賴,否則的話就是寬依賴)的話就在內(nèi)存中進行迭代。寬依賴導致stage的劃分。?
Spark快絕不是因為基于內(nèi)存,最基本的是他的調(diào)度,然后是他的容錯
如果 寬依賴?
依賴構(gòu)成了 DAG ,DAG導致 寬依賴?
stage 是內(nèi)存迭代 當然也可以 磁盤的迭代 ,如有100W 個數(shù)據(jù)分片 就有 100W 個task任務?
stage內(nèi)部:計算邏輯一樣 只是 算的數(shù)據(jù)不一樣而已
任務本身計算數(shù)據(jù)分片 ,一個pation是否精的 等于 一個 block大????
默認情況下 是 一個數(shù)據(jù)分片 128MB 最后一個記錄跨2個 block
怎么分配資源:通過spark-env.sh和spark-defaults.sh
Scheduling:
Dependency Types :?
Event Flow :?
????????????????????????????????????????????????????????????????????????長按識別關(guān)注我們,每天都有技術(shù)和精彩內(nèi)容分享哦!~