spark學習筆記3 spark應用程序之間的調度

1、調度配置

Standalone集羣模式:默認情況下,提交給Standalone集羣的應用程序以FIFO(first in, first out)順序執行,同時,每個應用程序都會嘗試使用所有可用的節點。你可以通過設置屬性spark.cores.max來限制應用程序能使用的節點數目,或者,對於那些未設置該屬性的應用程序,還可以通過設置屬性spark.deploy.defaultCores來改變默認的資源分配方式(即每個應用使用所有可用節點)。最後,除了控制CPU核數外,每個應用程序可以通過屬性spark.executor.memory來控制其內存用量。

Mesos集羣模式:要在Mesos集羣上使用靜態資源分區,將屬性spark.mesos.coarse配置爲true即可,還可以根據需要設置屬性spark.cores.max來限制每個應用程序所佔用的資源,如同在Standalone集羣模式下所做的配置一樣。你還應當設置屬性spark.executor.memor來控制executor的內存佔用量。

YARN集羣模式:用於Spark YARN客戶端的命令行選項--num-executors控制着應用程序要在集羣上分配多少個executor來執行作業,而選項--executor-memory和--executor-cores則分別控制着每個executor所用的內存量和CPU核數。

2、應用程序內部的job調度

在spark程序的內部,用戶通過不同線程提交的job可以並行運行,這裏說的job就是spark action算子觸發的整個RDD DAG爲一個job。

(1)FIFO

默認條件下,spark的調度器以fifo調度job的執行。優先分配資源給第一個job。

不看了,

(2)fair

從Spark 0.8版開始,通過配置我們就可以讓各個作業公平地共享資源。在公平資源共享模式下,spark以輪轉(round robin)方式在各個作業(job)之間分配任務(task),以便所有作業都能大致平等地共享集羣資源。這就意味着,在長期作業正在運行時提交的短期作業可以立即獲得資源並得到良好的響應時間,而無需等待長期作業執行完畢。該模式對於多用戶環境是最佳的。要啓用公平作業調度,在創建一個SparkContext之前,需要簡單的配置spark.scheduler.mode爲FAIR。

fair調度池:

fair scheduler調度器還支持把作業分組放入調度池(pool)裏,併爲每個調度池設置不同的調度選項(如權重weight)。這個功能是很有用的,例如,對於那些更重要的作業設置優先級,或者把每個用戶的作業分別合併爲一組,無論他們各自有多少個併發作業,都讓其平等地共享資源,而不是讓每個作業平等地共享資源。這種方法是基於Hadoop Fair Scheduler來實現的。

無需任何干預,新提交的作業會進入默認調度池,但是作業所屬的調度池也是可以設置的,即在提交作業的那個線程內,向SparkContext中添加本地屬性(local property)spark.scheduler.pool就能實現。方法如下:

sc.setLocalProperty("spark.scheduler.pool", "pool1")
設置了該本地屬性之後,此線程中提交的所有作業(在此線程中調用RDD.save,count,collect等)都將使用這個調度池名稱。這個設置是每個線程中都有一個,便於讓一個線程以同一用戶的名義運行多個作業。如果你想清空與該線程關聯的調度池,可以簡單地調用:

sc.setLocalProperty("spark.scheduler.pool", null)

 默認情況下,每個調度池都會平等地共享集羣資源(在默認調度池內的每個作業也都是平等地共享資源) ,但在每個調度池內,各個作業以FIFO順序運行。例如,如果你爲每個用戶各創建一個調度池,也就意味着每個用戶都將平等地共享集羣資源,且每個用戶的查詢作業將按順序運行,而不是後續的查詢作業搶佔該用戶之前的查詢作業已經獲得的資源。

對於特定的調度池,其屬性也可以通過配置文件來修改。每個調度池都支持以下三個屬性:

schedulingMode:該屬性可以設爲FIFO或FAIR,用來控制調度池內的各個作業是按照排隊順序執行(默認行爲),還是平等地共享該調度池的資源。
weight:該屬性控制一個調度池與其他調度池共享集羣資源的方式。默認情況下,所有調度池的權重均爲1。舉例來說,如果你將某個調度池的權重設爲2,那麼,它獲得的資源將是其他調度池的兩倍。設置一個較高的權重(比如1000)還可能實現調度池之間的優先級——基本上,權重爲1000的調度池無論何時有活動的作業,它都總是優先執行其任務(task)。
minShare:除了設定調度池的總體權重外,每個調度池都可以設置共享資源的最小數量(如CPU核數)。在根據權重重新分發額外的資源之前,fair scheduler調度器總是嘗試去滿足所有活躍調度池所需的共享資源的最小數量。因此,minShare屬性就成了確保調度池在無需設置高優先級的情況下就能快速獲得定量資源(如10個CPU核)的又一種方法。默認情況下,每個調度池的minShare屬性值爲0.
調度池的屬性可以通過創建一個XML文件(類似於conf/fairscheduler.xml.template)並在你的SparkContext中設定屬性spark.scheduler.allocation.file來配置。

<?xml version="1.0"?>
<allocations>
  <pool name="production">
    <schedulingMode>FAIR</schedulingMode>
    <weight>1</weight>
    <minShare>2</minShare>
  </pool>
  <pool name="test">
    <schedulingMode>FIFO</schedulingMode>
    <weight>2</weight>
    <minShare>3</minShare>
  </pool>
</allocations>
3、Stage TaskSetManager調度方式

(1)stage的生成

stage的調度是由DAGScheduler完成的。由RDD的DAG切分出Stage的DAG,stage的DAG通過最後執行的stage爲根進行廣度優先遍歷,遍歷到最開始執行的Stage執行,如果提交的Stage仍有未完成的父母Stage,則Stage需要等待其父Stage執行完才能執行。 同時DAGScheduler中還維持了幾個重要的Key-Value集合結構,用來記錄Stage的狀態,這樣能夠避免過早執行和重複提交Stage。 waitingStages中記錄仍有未執行的父母Stage,防止過早執行。 runningStages中保存正在執行的Stage,防止重複執行。failedStages中保存執行失敗的Stage,需要重新執行,這裏的設計是出於容錯的考慮。其調度是在DAGScheduler中完成的。

(2)tasksetmanager的調度

每個Stage對應一個TaskSetManager,通過Stage回溯提交到調度池,在調度池中又根據JobID排序,先提交的Job的TaskSetManager優先調度,同一個Job內的TaskSetManager ID小的先調度。

4、Task調度(看不太懂,以後用的時候慢慢看,下面簡介下)

(1)分配任務執行節點
   1)如果是調用過cache()方法的RDD,數據已經緩存在內存,則讀取內存緩存中分區的數據。

   2)如果直接能獲取到執行地點,則返回執行地點作爲任務的執行地點,通常DAG中最源頭的RDD或者每個Stage中最開始的RDD會有執行地點的信息。 

  3)如果不是上面兩種情況,將遍歷RDD獲取第一個窄依賴的父親RDD對應分區的執行地點。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章