Presto 任務調度: 任務分配到哪裏

在調度任務時,有幾個決策點,第一:分配多少個任務,第二:每個任務分配到哪些機器上。

要回答這個問題,首先把計算任務做一下分類,在presto內部有4種計算類型的節點:

  1. source節點,讀源數據的節點,負責讀取數據、Map階段的計算任務。分配的個數由SplitManager根據數據決定。
  2. fixed節點,shuffle節點,用於處理reduce任務。比如group by計算,source階段的數據按照hash發送到fixed節點。分配的個數由hash_partition_count這個session參數決定,由於是固定個數,所以對於不同的數據規模採用同樣的個數也不是很合適,這也是需要改進的點。
  3. single節點,單節點計算任務,某些計算需要在單一節點計算,比如MergeReduce,output等,需要分配一個節點。
  4. coordinator only,只在coordinator節點計算的任務,一般是meta類操作。

image.png

Presto是一個計算引擎,採用計算和存儲分離的架構。所以,理論上來講,上邊回答清楚每個階段分配多少個計算任務,然後按照隨機的原則把task分配到每臺機器上,並注意機器之間的負載均衡就足夠了。

但是這樣性能並不是最佳的。我們都知道,大規模的數據遷移是一件非常耗時的事情。在計算機硬件中,CPU、內存、磁盤、網卡,這些硬件中,網卡的性能提升是最慢的,在整個分佈式系統中也是性能最差的。
因此在調度上presto提供了一種基於拓撲的調度算法(Topology Aware schedule),以使source節點儘量靠近數據。

拓撲調度算法Topology Aware Scheduling strategy

image.png

Presto把集羣資源劃分成兩級結構(Machine,集羣)(包含機架的三級結構是我們的實現方式,不是presto原生的算法)。

分配算法如下:

  1. 當分配一個split時候,會給定split的一個地址,這個地址代表期望的分配地址。
  2. 從Machine層開始查找,首先查看Machine上已經分配的split個數是否已滿,若未滿則分配該機器,
  3. 若Machine資源池已滿,然後查看機架級別的資源池。多個機器組成一個機架。然後在同一個機架找出一臺機器,這臺機器的資源池小於75%,則分配這臺機器。
  4. 如果在機架級別找不到可用機器,則到集羣級別找一臺機器,這臺機器的資源池使用量小於50%,則分配這臺機器。否則分配失敗。

presto代碼提供了Machine/集羣的兩級拓撲結構,但是架構上提供一個基礎的多級分配策略,因此我們增加了機架級別的資源調度。我們知道,同一個機架內機器在一個交換機下,網絡速度要快於跨機架傳輸。

Presto調度上的其他優化點

presto提供了基礎的調度能力,這個調度策略是很簡單的,如果要實現精細化的調度,還有很多工作可以做。例如:

  1. 上文提到的Fix Count Scheduler,對所有的計算採用固定的節點個數。這個可以通過CBO,衡量不同數據源的大小,以及計算的複雜度,分配不同的節點個數。
  2. 上文提到的機架級別調度。
  3. 在資源池的管理上,簡單以split的個數來衡量,但是我們知道每個split對應的數據量和計算複雜度是不一樣的。因此更加精細化的策略是根據統計數據預估split消耗的內存/cpu。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章