1. 程式人生 > >spark--資源調度

spark--資源調度

技術 任務調度 ges 啟動app bmi cut lib drive 充足

在上一個博客裏,我們將一輛汽車的油箱、發動機進行了大體的說明了,汽車的最主要的功能已經說明了,那麽想讓汽車發動起來,我們應該怎麽辦呢?對,司機,我們現在還缺一個司機來使用這些資源,那麽這些資源是如何使用的呢?
在我們剛開始的時候,我對spark進行相應的簡介的時候說過一個詞,也在後面對這個詞進行了具體的講解,他就是RDD--分布式彈性數據集,它通過將計算數據持久化到內存中進行存儲,提高了集群的運行效率,那麽,作為一個大數據處理方面的勞斯萊斯,spark僅僅只是在這一個方面進行了優化嗎?他會滿足僅僅只是由RDD提供的運行效率嗎?答案是肯定的,一定不會,所以,spark在另外兩個重點的方面進行了自己的發展,資源和任務。進行一個數據的計算無非就是兩個方面,提交處理任務,獲取相應的資源之後對提交的任務進行處理,那麽在spark內部是如何進行資源調度的呢
1、資源調度:Worker是在集群啟動的時候就向Master註冊了集群的相關信息,存儲在一個HashSet中,Master就掌握了整個集群的資源情況。Driver在啟動後將其信息註冊到Master中,存儲在ArrayBuffer中,Driver啟動後會另外啟動一個線程將Application註冊到Master,同樣存儲在ArrayBuffer裏。一個Worker默認給一個Application啟動1個Executor,可以設置 --executor-cores num來啟動多個。開機啟動時最好設置spreadOut,可以在集群中分散啟動executor。
2、資源調度的流程:
start-all.sh ssh去鏈接其他的節點,連接成功之後在hadoop2,3上各啟動worker進程,往worker進程啟動之後會向master註冊,spark://hadoop1:7077
在client提交一個application,這個提交命令一回車,就會在客戶端上啟動一個進程(sparksubmit)。負責向master為driver申請資源,在底層源碼中就是將申請的信息發送到master進程的waitingDriver對象中
master會根據worker的資源情況,選擇合適的節點啟動Driver
當Driver進程啟動完畢後,會向master為application申請資源,在底層源碼就是將申請信息寫入到了waitingApps中
master會根據worker的資源情況選擇資源充足的節點去啟動executor
當executor啟動完畢後,會反向註冊給Driver進程,Driver就掌握了一批Executor進程
Driver進行任務調度,將task發送到Executor的線程池中去運行
技術分享圖片
就像人有點粗心有的細心一樣,資源調度也有兩種不同的類型:粗粒度的資源調度,細粒度的資源調度
粗粒度的資源調度(Spark):就像一個富二代一樣,一生下來就掌握了一大批的資源,可以自己任意揮霍,去幹自己想幹的事情,不擔心會沒有錢,粗粒度的資源調度就是這樣在Application執行之前,現將資源申請完畢在執行任務調度,一直到最後一個task執行 完畢在會釋放資源
優點:task啟動快,所以stage、job、application的一系列的流程的處理速度都會加快,執行時間短
缺點:當集群中有一個task沒有執行完都不會釋放這個資源,集群的資源產生浪費
細粒度的資源調度(MapReduce):窮人家的孩子早當家,當有事情要去處理的時候會好好的考考慮一下資源的使用情況,看看夠不夠,給每件事情使用剛剛好的錢,細粒度的資源調度就是這樣在Application執行之前,不會將資源準備好,而是直接進行任務調度,讓每一個task自己去申請資源,他需要多少資源就申請多少資源,每一個task執行完畢之後就立即釋放資源
優點:很好的利用了集群的資源,因為每一次都是task動態的申請資源,需要多少申請多少,不會造成資源的浪費,能夠充分的利用集群的資源,
缺點:來一個task申請一次,國家都支持簡短操作流程了,他還是浪費時間的操作在申請上,很煩,而且造成的結果就是task啟動時間長,從而之後一系列的都會很慢,影響了集群的使用效率
人無完人,孰能無過,不同的事情不同的對待,我們可以自己選擇合適的方式進行資源的申請,可是這之後呢,如果集群在處理過程中出現問題,怎麽辦,不用擔心,這個時候就體現出來程序員縝密的邏輯思維能力了,在spark的設定中
1、如果在提交Application的時候沒有指定 --executor-cores這個選項,默認每臺節點啟動一個executor進程,占用1G內存和Worker管理的所有core,或默認的分配這些資源,但是人心不足蛇吞象,總會有不滿足這麽點資源的,那這個時候國家就會進行分配了,我們可以通過在提交任務的時候書面申請一下我需要多少資源
2、啟動多個Executor進行需要指定
spark-submit --master spark://hadoop1:7077,hadoop2:7077 --executor-cores 1 --class org.apache.spark.examples.SparkPi ../lib/spark-submit-1.6.0-hadoop2.6.0.jar 101
--driver-cores 每個Driver進程需要的核數
--driver-memory 每個Driver進程需要的內存
--executor-cores 每個Executor進程需要的核數
--executor-memory 每個Executor進程需要的內存
--total-executor-cores Application總共需要使用的核數
最後補充一點在啟動applicationInfo的時候,master回去worker上啟動executor,我們的數據跟executor都是隨機啟動的,Executor的啟動過程是輪訓啟動的方式,executor啟動時候計算能夠更好地找到數據,有助於數據的本地化

spark--資源調度