---
# System prepended metadata

title: '8 - 2 Omega: flexible, scalable schedulers for large compute clusters'
tags: [Cluster Manager]

---

# Abstract

- 目前單一集群 scheduler 架構難以應對日益增長的規模和快速 response 變化需求的挑戰。
- 這限制了新功能的部署速度，降低了效率和利用率，最終將限制集群的增長。
- 提出了一種新方法，使用並行性、共享狀態和無鎖的樂觀並行控制來解決這些需求。

### 主要內容

比較了該方法與現有集群 scheduler 設計的差異。
評估了 scheduler 之間的干擾程度及其在實踐中的重要性。
提出了一些技術來減輕干擾。
最後通過一個實際應用案例，展示了該方法的優勢，所有結果均基於真實的 Google 生產工作負載。

### 關鍵詞

- 集群調度 (Cluster scheduling)
- 樂觀並行控制 (optimistic concurrency control)

這段摘要介紹了本文的研究背景、提出的解決方案以及主要研究發現，並強調了新方法在應對集群 scheduler 挑戰中的潛在優勢。

# 1. Introduction

- 大型計算集群非常昂貴，因此需要充分利用。
- 通過在相同機器上運行多種工作負載，可以提高利用率和效率。
    - 包括 CPU 和記憶體密集型作業、小型和大型作業、以及批次處理和低延遲作業 **(job)**。
    - 這樣的整合減少了完成工作負載所需的硬體數量，但也使得調度問題變得更加複雜。
- 調度問題變得複雜的原因：
    - 需要考慮更廣泛的需求和政策。
    - 集群和工作負載持續增長，導致 scheduler 的工作量大致與集群規模成正比，最終成為可擴展性的瓶頸。

Google 過去的產品的job scheduler 已經歷了上述所有挑戰。
經過多年的發展，變得複雜且難以改變。
在重新設計這個 scheduler 的過程中，我們尋找了一種更好的方法。


### 傳統 scheduler 架構

- Monolithic scheduler 使用一個集中的調度演算法處理所有作業（如現有的 scheduler）。
- Two-level scheduler 有一個活躍的資源管理器，將計算資源提供給多個並行且獨立的 “scheduler frameworks”，如 Mesos 和 Hadoop-on-Demand。

### 問題

- Monolithic scheduler 難以靈活添加新政策和專門實現，且難以擴展到我們計劃的集群規模。
- Two-level 調度架構提供靈活性和並行性，但其保守的資源可見性和鎖定演算法限制了這些優勢，且難以安置難以調度的“挑剔”作業或做出需要整個集群狀態的決策。
### 解決方案

- 新的並行 scheduler 架構基於共享狀態，使用無鎖的樂觀並行控制，實現可擴展性和靈活性。
- 該架構已應用於 Omega，即 Google 的下一代集群管理系統。

![image](https://hackmd.io/_uploads/Hymbif1UR.png)
## 1.1 Contributions
### 主要貢獻

提出了一個集群 scheduler 開發選項空間的輕量級分類法（§3）。
引入了一種使用共享狀態和無鎖樂觀並行控制的新 scheduler 架構（§3.4）。
比較了 monolithic、two-level 和共享狀態調度架構的性能，通過模擬和合成工作負載進行評估（§4）。
使用基於生產 scheduler 的代碼和實際工作負載跟踪數據，深入探討了共享狀態方法的行為（§5）。
通過一個實際應用案例展示了共享狀態方法的靈活性：新增一個 scheduler 利用全域集群利用率調整 MapReduce 作業 **(job)** 的資源分配（§6）。

# 2. Requirements

集群 scheduler 必須同時滿足多個目標：
高資源利用率
使用者指定的安置約束
快速決策
各種程度的“公平性”和業務重要性
同時需具備穩定性和高可用性
這些需求隨時間演變，隨著功能增長，單一的 monolithic scheduler 變得越來越難以新增政策。
隨著功能的增長，代碼積累，部分使用者依賴於系統內部行為的詳細理解來完成工作，這使得其功能和結構都難以改變。

## 2.1 Workload heterogeneity

硬體和工作負載的異質性在大型計算集群中很常見，是複雜性的主要驅動因素之一。

### 工作負載異質性

- 我們檢視了三個具有代表性的 Google 產品計算集群的工作負載異質性：
    - 集群 A：中型且相當繁忙
    - 集群 B：Google 目前使用的較大型集群之一
    - 集群 C：最近發布了 scheduler 工作負載跟蹤的集群

所有集群運行多種job，有些是手動配置，有些是由自動系統配置，如 MapReduce、Pregel 和 Percolator。

### 工作負載劃分

集群的工作負載可以通過多種方式在不同的 scheduler 之間劃分。
在這裡，我們選擇了一種簡單的二分法：
- 長期運行的服務：提供最終使用者操作或內部基礎設施服務（如 BigTable）
- 批次作業：執行計算並完成

### 特徵

![image](https://hackmd.io/_uploads/H1EIpMJ8A.png)

![image](https://hackmd.io/_uploads/SkRAMmkIC.png)

![image](https://hackmd.io/_uploads/SJODI7kUC.png)



作業由一個或多個任務組成，有時多達數千個任務。
大多數（>80%）作業是批次作業，但大多數資源（55–80%）分配給服務。
服務作業通常運行時間更長，且任務數量比批次作業少。
批次作業通常較短，快速完成很重要，輕量級、低品質的放置方法效果很好。
長期運行的高優先級服務需要滿足嚴格的可用性和性能目標，這需要謹慎的放置以避免失敗並提供良好性能。
### 挑戰

我們需要一種 scheduler 架構能夠同時適應這兩種類型的作業，靈活支援job specific的policy，並能擴展到不斷增長的schedule工作量。
下一節將詳細探討這些需求以及滿足這些需求的一些方法。

# 3. Taxonomy


我們首先對集群 scheduler 必須解決的設計問題進行了簡短調查，然後檢視可能滿足這些需求的不同 scheduler 架構。

### 調度工作分配

- 調度工作可以通過以下方式在 scheduler 之間分配：
    - load balance：與工作負載類型無關。
    - 專用 scheduler：針對不同部分的工作負載分配專用 scheduler。
    - 組合方式：結合以上兩種方法。

### 資源選擇

- Scheduler 可以選擇全部集群資源，或者選擇一部分資源以簡化決策過程。
    - 前者增加了做出更好決策的機會，對於需要在接近滿負荷的集群中放置“挑剔”作業或依賴整體狀態的決策特別重要。
    - 如果 scheduler 可以搶占現有分配的資源，而不僅考慮閒置資源，則放置任務的靈活性更大，但這會浪費掉被搶占任務已完成的一些工作。

### 干擾

- 如果 scheduler 競爭資源，可能會同時嘗試獲取相同資源。
    - 悲觀方法：通過確保特定資源一次僅供一個 scheduler 使用來避免這個問題。
    - 樂觀方法：檢測到衝突並撤銷一個或多個衝突的資源請求。
樂觀方法增加了並行性，但如果衝突太頻繁，可能會浪費大量調度工作。

### 分配粒度

- 由於作業通常包含許多任務，scheduler 可以採用不同的策略進行調度：
    - 一種極端是原子性全有或全無的集體調度。
    - 另一種極端是隨著找到資源逐步放置任務。
集體調度可以通過逐步獲取資源並在作業啟動前保留它們，但這會在此期間浪費這些資源。

### 跨集群行為

某些行為跨越多個 scheduler。
- 例如，實現各種公平性和對工作相對重要性的共同協議，特別是當一個 scheduler 可以搶占其他 scheduler 的任務時。
- 這些行為的嚴格執行可以通過集中控制來實現，但也可以依賴於涌現行為來近似。
- 技術如限制 scheduler 可用的優先級範圍，可以部分實現所需行為，並且通過事後審計確保符合集群範圍的政策。


### 調度架構比較

- 本文集中探討了以下組合的比較：
    - Monolithic scheduler
    - Statically partitioned scheduler
    - Two-level scheduler (如 Mesos)
    - Shared-state scheduler (如 Omega)

![image](https://hackmd.io/_uploads/rJgHqmyLR.png)

## 3.1 Monolithic schedulers

- Single instance scheduler 是我們比較的基準，它沒有並行性，必須在單一代碼庫中實現所有策略選擇。
- 這種方法在高性能計算 (HPC) 領域很常見，通常運行 single instance 調度代碼，對所有進來的作業應用相同的算法。

### 策略支持
- HPC scheduler，如 Maui 和其後繼者 Moab，以及 Platform LSF，通過多個加權因子計算總優先級來支持不同的策略。
    - 計算後，scheduler 會大致按照優先級順序啟動作業。
- 另一種支持不同調度策略的方法是提供多條代碼路徑，對不同的作業類型運行獨立的調度邏輯。
    - 然而，這比看起來要困難得多。
    - Google 當前的集群 scheduler 實際上是 monolithic 的，儘管它經過多年優化，具有內部並行性和多執行緒來解決佇列首阻塞和擴展性問題。

### 挑戰

- 這增加了本已困難的任務：scheduler 必須在尊重優先級、每個作業限制和多個策略目標（如容錯和擴展到數千台機器的工作負載）的同時，將作業等待時間降至最低。
- 雖然這種方法非常成功，但我們發現難以在單一算法實現中持續支持廣泛的策略。
    - 因此，基於這種考量，是我們轉向支持並行、獨立調度組件架構的主要動機。

## 3.2 Statically partitioned schedulers

- 大多數“雲計算” scheduler（如 Hadoop 和 Dryad 的 Quincy）假設它們擁有一組資源的完全控制權，通常部署在專用的靜態劃分集群上，或將單個集群劃分成不同部分以支持不同行為。
    - 這導致了資源的碎片化和非最佳利用。
- 由於我們無法接受這種方案，本文不再深入探討這一選項。

## 3.3 Two-level scheduling


- 靜態劃分問題的一個明顯解決方案是動態調整分配給每個 scheduler 的資源數量，使用一個中央協調器來決定每個子集群可以擁有多少資源。
- 二級調度方法被許多系統採用，包括 Mesos 和 Hadoop-on-Demand (HOD)。

### Mesos

- 在 Mesos 中，集中資源分配器動態劃分集群，將資源分配給不同的 scheduler 框架。
- 資源以“資源提供”的形式分配，僅包含當前未使用的資源。
    - 分配器通過僅向一個框架提供特定資源來避免衝突，並通過選擇提供的順序和大小來實現主要資源公平性 (DRF)。
- Mesos 假設 scheduler 決策快速且作業較小，當調度決策時間長或集群中有大量長期運行的服務作業時，效果會變差。

### 局限性

- Mesos 框架無法訪問整個集群狀態，因此無法支持搶占或需要訪問整個集群狀態的政策。
- 使用資源囤積實現群體調度，可能導致deadlock。

### YARN

- YARN 看起來也是二級調度器，但實際上是一個 monolithic scheduler 架構，因為資源請求由全局 scheduler 分配。

## 3.4 Shared-state scheduling

- Omega 使用共享狀態方法，允許每個 scheduler 完全存取整個集群，並使用樂觀並行控制來協調衝突。
    - 消除了二級 scheduler 方法中的並行性限制和資源可見性限制，但可能需要重新進行衝突時的工作。

### 實施細節

- Omega 沒有中央資源分配器，所有資源分配決策在 scheduler 中進行。
- 每個 scheduler 都有一個私人本地副本的集群狀態，用於做出調度決策。
    - 一旦做出放置決策，scheduler 會以原子方式更新共享的集群狀態。
    - 如果發生衝突，則只有那些不會導致超額分配的更改會被接受。
    - Scheduler 之間的操作完全並行，無需等待其他 scheduler 的工作完成。


### 策略實現

- Omega 的 scheduler 可以實現不同的策略，但必須在某些共同規則上達成一致，如機器是否已滿。
- 中央資源分配器簡化為持久資料儲存和驗證碼。
- Fairness 在 Omega 中不是主要關注點，更注重滿足業務需求。

### 性能可行性

- 共享狀態方法的性能可行性取決於衝突發生頻率和處理失敗的成本。
- Omega 的架構提供了靈活性，可以增加專門的 scheduler 和其他好處，如更好的資源利用率。

# 4. Design comparisons


- 為了理解不同方法之間的取捨，我們構建了兩個模擬器：
    - 輕量級模擬器：驅動合成工作負載，使用從經驗工作負載分佈中提取的參數。
    - 高擬真模擬器：重用 Google 過去產品集群的歷史workload數據，並重用大部分產品 scheduler 的代碼。

![image](https://hackmd.io/_uploads/H17VbueI0.png)
### 輕量級模擬器

- 通過一些簡化來提高速度和靈活性：
    - 初始化集群狀態時，使用從相關跟蹤中提取的任務大小數據，但僅實例化足夠多的任務以利用大約60%的集群資源。
    - 支援多種 scheduler 類型，初始僅考慮批次和服務兩種類型。
    - 限制單個作業最多嘗試1000次調度，如果有任務仍未調度成功，則放棄該作業。
### 高擬真模擬器

- 使用從 Google 產品集群獲得的詳細workload數據，模擬實際集群操作。
- 支援 Omega 架構的詳細行為模擬，但運行速度比輕量級模擬器慢得多。


## 結果比較

- 我們在輕量級模擬器中比較以下幾種組合：
    - Monolithic scheduler
    - Two-level scheduling
    - Shared-state scheduling (Omega)
![image](https://hackmd.io/_uploads/H15KWde8C.png)

## 4.1 Monolithic schedulers
### 單路徑

- baseline是單路徑 monolithic scheduler，使用相同的決策時間處理所有作業。
- 隨著決策時間增加，scheduler 繁忙度線性增長，作業等待時間相應增加，直到 scheduler 飽和，無法應對工作負載。

### 多路徑

- 多路徑 monolithic scheduler 為批次作業提供快速路徑，顯著降低平均作業等待時間和 scheduler 繁忙度，但批次作業仍可能因服務作業的慢速調度而阻塞。
- 
## 4.2 Two-level scheduling: Mesos
### 架構

- 模擬基於 Mesos 設計，包含一個資源管理器和兩個 scheduler 框架。
- 資源以提供的形式分配，只有閒置資源會被提供，框架只看當前可用的資源。
### 結果

- 批次 scheduler 的繁忙度比 monolithic 多路徑情況高得多，因為服務 scheduler 的長決策時間鎖定了幾乎所有資源。
- 結果是，批次作業被迫重複嘗試調度，導致作業被放棄。

## 4.3 Shared-state scheduling: Omega
### 架構

- 使用 Omega 的共享狀態方法，每個 scheduler 可以看到整個集群狀態，並使用樂觀並行控制來協調衝突。
### 結果

- Omega 方法的作業等待時間和 scheduler 繁忙度與 monolithic 多路徑方法相當，顯示出較低的衝突和干擾。
- 隨著批次工作負載增加，Omega 模型可以通過增加 scheduler 的數量來提高可擴展性。
![image](https://hackmd.io/_uploads/ryv3-de80.png)

## 4.4 Summary
![image](https://hackmd.io/_uploads/SkdC-de8C.png)
![image](https://hackmd.io/_uploads/SJ-gf_x8R.png)
- 輕量級模擬器有助於比較不同的 scheduler 架構。
- Monolithic scheduler 無法擴展，儘管多路徑功能降低了平均調度決策時間，但批次作業仍會阻塞。
- Mesos 二級模型受限於悲觀鎖定，無法很好地處理長決策時間。
- Omega 共享狀態方法提供了具有競爭力和可擴展的性能，支持獨立的 scheduler 實現，並且在現實的操作點上干擾較少。

![image](https://hackmd.io/_uploads/BJqtSOxIC.png)

# 5. Trace-driven simulation


- 在比較了不同 scheduler 架構後，我們使用高擬真模擬器進一步探討 Omega 共享狀態方法的一些特性。
- 高擬真模擬器的核心是 Google 產品調度系統的代碼，並遵從任務放置限制。
- 我們使用詳細的工作負載跟蹤資料來驅動模擬，評估共享狀態設計在真實世界工作負載中的表現。

### 主要問題

- 我們旨在回答以下問題：
    1. 在實際工作負載中，調度干擾有多大？我們能承受多長的 scheduler 決策時間？（§5.1）
    2. 不同的衝突檢測和解決技術對實際工作負載有何影響？（§5.2）
    3. 我們能否利用對整個集群狀態的訪問來提升調度決策？（§6）

### 簡化假設

- 儘管是高擬真模擬，該模擬器仍做了一些簡化：
    - 不模擬機器故障，因為這只會對 scheduler 產生小量負載。
    - 不模擬資源請求與實際使用之間的差異。
    - 固定分配於初始請求大小（受跟蹤資料限制）。
    - 禁用搶占，因為我們發現其對結果影響不大，但顯著減慢了模擬速度。

### 模擬器一致性

- 高擬真模擬器和輕量級模擬器的輸出通常一致。主要區別在於輕量級模擬器的干擾較少，這可能是因為它不支援放置限制和簡化了機器滿載的判斷。

### 結果確認

- 我們確認高擬真模擬器展示的趨勢與輕量級模擬器一致，這證實了輕量級模擬器實驗在一組共同假設下進行不同 scheduler 架構比較的合理性。

## 5.1 Scheduling performance
![image](https://hackmd.io/_uploads/HyW2rueLA.png)

### 服務 scheduler 繁忙度
![image](https://hackmd.io/_uploads/rkAZLue8C.png)

- 我們探討了服務 scheduler 繁忙度如何隨 $t_{job(service)}$ 和 $t_{task(service)}$ 變化：
    - 服務 scheduler 繁忙度在幾乎整個範圍內保持較低，顯示 Omega 架構能夠很好地適應長決策時間的服務作業。
### 負載平衡

- 我們使用來自集群 B 的7天追蹤資料，探討共享狀態架構的性能：
    - 當 $t_{job(service)}$ 達到約10秒時，衝突比率增加到1.0以上，意味著平均每次調度都需要至少一次重試。
    - 服務 scheduler 繁忙度增加約40%，這是由於衝突造成的額外工作負載。


- 共享狀態 Omega 架構能夠支持決策時間為數秒的服務 scheduler，也能支持高達1秒的 $t_{task(service)}$
![image](https://hackmd.io/_uploads/BJH7IOl8C.png)



## 5.2 Dealing with conflicts
### 衝突檢測

- 我們探討了兩種衝突檢測和解決技術：
    - 粗粒度衝突檢測：如果目標機器自同步以來有任何變更，則拒絕 scheduler 的放置選擇。
    - 全有或全無調度：如果任何機器超額分配，則拒絕整個狀態交易。
### 結果
![image](https://hackmd.io/_uploads/H1vUIuxI0.png)

- 兩種技術都導致更多的衝突和更高的 scheduler 繁忙度。
    - 全有或全無調度的衝突比率增加約2倍，應該僅在作業級別上使用。
    - 粗粒度衝突檢測導致衝突比率和 scheduler 繁忙度增加2-3倍。


# 6. Flexibility: a MapReduce scheduler

本節介紹了一個範例，展示了 Omega 共享狀態架構如何增加新的 scheduler 以利用整個集群的利用率，來實現特定工作負載（例如 MapReduce 作業）資源分配的改進。
我們設計了一個專門的 MapReduce scheduler，它能夠識別閒置的資源，並在不影響其他服務的情況下，動態地將這些資源分配給 MapReduce 作業。

### 策略選擇

我們探索了三種資源分配策略：
- 最大並行度策略：盡量最大化並行運行的 MapReduce 作業數量。
- 全域上限策略：設置 MapReduce 作業的全域資源使用上限。
- 相對作業大小策略：根據作業大小動態分配資源，優先處理較小的作業以提高周轉率。

### 最大並行度策略

- 該策略目標是最大化同時運行的 MapReduce 作業數量：
    - 當有新資源可用時，scheduler 立即將其分配給待處理的 MapReduce 作業。
    - 結果顯示，這種方法能夠顯著提高資源利用率和作業完成速度。

### 全域上限策略

- 在這種策略下，我們設置了一個 MapReduce 作業的全域資源使用上限：
    - 當達到上限時，新的資源不會分配給 MapReduce 作業，即使有閒置資源。
    - 這種方法能夠控制 MapReduce 作業的資源消耗，避免其對其他關鍵服務的影響。
    - 結果顯示，這種策略在控制資源分配和保證服務穩定性方面效果顯著，但會延長 MapReduce 作業的完成時間。

### 相對作業大小策略

- 該策略根據作業大小動態分配資源，優先處理較小的作業：
    - 目的是提高作業的周轉率，使小作業能夠快速完成，而大作業在有多餘資源時得到分配。
    - 結果顯示，這種策略在提高周轉率方面非常有效，特別是在有大量小型 MapReduce 作業的情況下。

### 結果分析
![image](https://hackmd.io/_uploads/HJ9J_Oe8A.png)
![image](https://hackmd.io/_uploads/S1sgOueLR.png)

- 我們使用高擬真模擬器進行了測試，結果顯示 Omega 架構下的新 MapReduce scheduler 能夠靈活有效地分配資源，提高資源利用率和作業完成速度。
- 專門的 MapReduce scheduler 表現出比傳統 scheduler 更高的靈活性，能夠根據集群的實時狀態動態調整資源分配。

### 總結

這些實驗證明了 Omega 共享狀態架構的靈活性，可以輕鬆添加新的 scheduler，以優化特定類型的工作負載。
專門的 scheduler 可以根據實時狀態和策略調整資源分配，有效提高集群的整體性能。


# Conclusions

- 本文提出了 Omega，這是一種新的共享狀態、無鎖的樂觀並行控制 scheduler 架構，旨在應對大型計算集群的需求。
- 透過將共享狀態與樂觀並行控制結合，Omega 能夠顯著提高調度效率和可擴展性，並支援靈活的策略實現。
- 我們的實驗結果表明，Omega 架構在大多數操作點上能夠提供具有競爭力的性能，並且在處理多樣化工作負載時干擾較小。
- 透過設計專門的 MapReduce scheduler，我們展示了 Omega 在動態資源分配和提高資源利用率方面的靈活性。