Spark開發-Spark核心細說

Xlucas發表於2017-09-21

核心
1、介紹spark的核心

叢集模式是Standalone的
● Driver:就是我們用來提交編寫的Spark程式的一臺機器,在Driver中最重要的一件事—建立SparkContext
● Application :就是我們編寫的程式,類裡面建立了SparkContext的程式
● spark-submit: 就是用來向Spark叢集提交application的程式,spark-submit,其實說白了就是一個繼承了AKKA Actor的actor模型,如果不繼承的話,就無法與我們進行master進行通訊,就不能向master註冊我們編寫的application
● SparkContext : 我們在建立SparkContext的過程中,最重要的3件事,其一建立DAGSechedule(有向無迴圈圖排程者),其二建立TaskScheduler(任務排程者),三就是依照TaskSecheduler建立TaskSchedulerBackend(任務排程後端)
● DAGScheduler: DAG:有向無環圖(Directed acyclic graph)在建立好程式之後,就會把各種運算元交給DAGScheduler進行整體的一個排程,我們每一個Application在執行的時候,都會被DAGScheduler分成若干 個Stage,是由相關的劃分演算法來做的
● 當DAGScheduler接受到任務資訊之後,就會指派相關的TaskScheduler對任務進行具體的排程,讓我們taskset中的的一批task去執行具體的任務
● TaskScheduler:TaskScheduler ,就會組織,排程task進行任務執行
● 當worker中的 executor 啟動之後,會主動反向註冊到Driver,當driver收到所有的executor(一組executor)反向註冊資訊之後,就開始載入資料建立RDD ,將各種運算元交給DAGScheduler管理【so 問題來了,driver是如何知道它收到了一組內所有的executor呢,大家還記不記得,Master接收到Driver的註冊請求後,進行任務分配,通知各個worker進行接收任務,worker結合之後會做出迴應給master任務接收到了,master會告訴driver,worker已經接收任務了,並且master此時此刻將任務分配計劃,交給DRIVER,Driver按照這個分配計劃,就可以知道是否一組內Executor是否已經全部到達】
● Master: Master主要用於叢集的監控,執行資源的分配,Master在分配資源的時候,有兩種分配方式,一種spreadapps,一種是非spreadapps,Master實際就是一個AKKA Actor的Actor模型接收到Driver發過來的註冊通知,然後衡量任務,需要如何的資源,交給Worker進行幹活,其實說白了就是讓worker來啟動executor程式
● taskRunner: 在我們的task分配過來的時候,executor會從執行緒池中抽取相應的task,把它給我封裝成taskRunner,執行具體的flatmap , map ,reduceByKey等等操作
● 實際上,task任務分為兩種,ShuffleMapTask,ResultTask,ResultTask說白了就是執行action的task,其餘都是ShuffleMapTask

spark核心:
● application=driver+executor
● Driver的程式碼=SparkConf+SparkContext
● executor在work裡面一個程式裡面的處理物件。通過執行緒池併發執行,執行緒複用執行task
● application 執行過程不依賴cluster Manager
● work是管理節點,不會執行程式的程式碼,是管理當前節點的資源,並接受master的指令來分配
具體的計算資源executor(在新的程式中分配)
● work 不會在傳送心跳的時候傳送資源資訊,master分配的時候就知道了資源的情況
● Job 包含一系列的task 平行計算 一般由action 觸發 action不會產生RDD
● stage內部:計算邏輯一樣 只是 算的資料不一樣而已

為什麼不能用idea整合開發環境之間釋出spark程式到spark叢集中
1、記憶體和core的限制,預設情況下spark程式的driver會在提交spark程式的機器上,所以如果是IDE中提交程式的話,那麼IDE機器必須非常強大
2、driver要指揮workers的執行並頻繁的發生通訊,如果併發環境IDE和spark叢集不在同樣的一個網路下,就會出現任務丟失,執行緩慢等多種不必要的問題
3、這是不安全的

流程圖:
這裡寫圖片描述

● SparkContext連線到Master,向Master註冊並申請資源(CPU Core 和Memory)
● Master根據SparkContext的資源申請要求和Worker心跳週期內報告的資訊決定在哪個Worker上分配資源,然後在該Worker上獲取資源,然後啟動StandaloneExecutorBackend;
● StandaloneExecutorBackend向SparkContext註冊;
● SparkContext將Applicaiton程式碼傳送給StandaloneExecutorBackend;並且SparkContext解析Applicaiton程式碼,構建DAG圖,並提交給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在獲取外部資料和shuffle之前產生),然後以Stage(或者稱為TaskSet)提交給Task Scheduler,Task Scheduler負責將Task分配到相應的Worker,最後提交給StandaloneExecutorBackend執行;
● StandaloneExecutorBackend會建立Executor執行緒池,開始執行Task,並向SparkContext報告,直至Task完成
● 所有Task完成後,SparkContext向Master登出,釋放資源

相關文章