分布式系統Hadoop作業調度器及其問題的討論
Hadoop是Apache基金會下的一個分布式系統基礎架構,它最核心的兩個部分:分布式文件系統HDFS,存儲Hadoop集群中所有存儲節點上的文件;由NameNode和DataNode組成;分布式計算引擎MapReduce,由JobTracker和TaskTracker組成。
Hadoop使得用戶可以在不了解分布式系統底層細節的情況下,輕松地根據自己的業務需求,開發出分布式應用程序。在Hadoop的實際應用中,往往存在多種應用共用Hadoop的情況,例如:
- 生產性應用:數據分析、統計計算等;
- 批處理應用:機器學習等;
- 交互式應用:SQL查詢等。
因此,在Hadoop集群中,可能同時運行多道作業,不同類型的作業,作業之間可能還存在依賴關系,那么,這種情況下該如何保證整個集群計算資源得到充分的利用呢?這就要求有一個作業調度器,來保證在整個集群內有效地進行作業的調度與執行過程。
Hadoop作業調度器的設計采用的是插件機制,即作業調度器是動態加載的、可插拔的,同時第三方可以開發自己的作業調度器替代Hadoop默認的調度器。目前,Hadoop的作業調度器主要有以下三個:
- FIFO Scheduler:采用一個FIFO隊列進行調度,在其基礎上Hadoop還提供一個擴展的調度器,可以對每個job的tasks總數作限制;優點是實現非常簡單、調度過程快;缺點是資源的利用率不高。
- Capacity Scheduler:采用多個隊列,每個隊列分配一定的系統容量,空閑資源可以動態分配給負荷重的隊列,支持作業優先級;優點是支持多作業并行執行,提高資源利用率,動態調整資源分配,提高作業執行效率;缺點是用戶需要了解大量系統信息,才能設置和選擇隊列。
- Fair Scheduler:將作業分組形成作業池,每個作業池分配最小共享資源,然后將多余的資源平均分配給每個作業;優點是支持作業分類調度,使不同類型的作業獲得不同的資源分配,提高服務質量,動態調整并行作業數量,充分利用資源;缺點是不考慮節點的實際負載狀態,導致節點負載實際不均衡。
雖然Hadoop自帶的作業調度器原理簡單且使用,但分析它的原理不難發現其存在以下問題(有些問題可能Capacity Scheduler和Fair Scheduler也并未予以考慮或者很好的解決),羅列出來以供大家討論:
- 并未明確區分長作業和短作業:長作業一般要保證服務質量,而短作業則要求保證足夠短的響應時間,但是FIFO調度器并未考慮進行區分(Facebook的Fair Scheduler進行了考慮)。
- 并未充分考慮到每個計算節點TaskNode的實際計算負載情況:在FIFO調度器中,JobTracker完全按照TaskNode的map/reduce slots數分配map/reduce作業運行,但是每個TaskNode節點的實際負載情況,JobTracker考慮的很少。一種方法是可以在JobTracker和TaskTracker的心跳之間,TaskTracker主動匯報其實時負載信息給JobTracker,以便JobTracker綜合考慮是否為其分配新的map/reduce作業。
- 并未考慮在虛擬化平臺下各個節點資源的分配與實際使用情況:如果在虛擬化平臺下部署和應用Hadoop,那么每個VM就是一個Hadoop節點,那么同處于一個物理機上的不同VM,以及處于不同物理機上的不同VM,需要區分對待,一個物理機上的不同VM,它們之間可能被預先分配了CPU、Memory、Disk等資源,但是同時運行時還可能存在資源爭用的情景,進而會影響到這些VM作為Hadoop的計算節點TaskNode時,單獨使用map/reduce slots的分配方式,顯得不夠合理,可能出現某個VM上運行的Task滯后進而導致整個Job滯后的現象。另外,虛擬化的一些特性(如虛擬機的實時遷移技術來平衡物理機的負載,對上層應用Hadoop來說是透明的)也可以考慮在Hadoop集群中進行應用。
- 并未支持作業之間的依賴關系分析:如果能根據作業間的依賴關系,找到關鍵路徑,那么就能提高作業的執行完成效率,提高響應速度。
這里只是根據自己的理解,列出的幾個問題,歡迎讀者提出討論。
浙公網安備 33010602011771號