(1) 預設情況下,各個節點的負載不均衡(任務數目不同),有的節點很多任務在跑,有的沒有任務,怎樣讓各個節點任務數目盡可能均衡呢?
答: 預設情況下,資源排程器處于批排程模式下,即一個心跳會盡可能多的配置設定任務,這樣,優先發送心跳過來的節點将會把任務領光(前提:任務數目遠小于叢集可以同時運作的任務數量),為了避免該情況發生,可以按照以下說明配置參數:
如果采用的是fair scheduler,可在yarn-site.xml中,将參數yarn.scheduler.fair.max.assign設定為1(預設是-1,)
如果采用的是capacity scheduler(預設排程器),則不能配置,目前該排程器不帶負載均衡之類的功能。
當然,從hadoop叢集使用率角度看,該問題不算問題,因為一般情況下,使用者任務數目要遠遠大于叢集的并發處理能力的,也就是說,通常情況下,叢集時刻處于忙碌狀态,沒有節點一直空閑着。
(2)某個節點上任務數目太多,資源使用率太高,怎麼控制一個節點上的任務數目?
答:一個節點上運作的任務數目主要由兩個因素決定,一個是NodeManager可使用的資源總量,一個是單個任務的資源需求量,比如一個NodeManager上可用資源為8 GB記憶體,8 cpu,單個任務資源需求量為1 GB記憶體,1cpu,則該節點最多運作8個任務。
NodeManager上可用資源是由管理者在配置檔案yarn-site.xml中配置的,相關參數如下:
yarn.nodemanager.resource.memory-mb:總的可用實體記憶體量,預設是8096
yarn.nodemanager.resource.cpu-vcores:總的可用CPU數目,預設是8
對于MapReduce而言,每個作業的任務資源量可通過以下參數設定:
mapreduce.map.memory.mb:實體記憶體量,預設是1024
mapreduce.map.cpu.vcores:CPU數目,預設是1
注:以上這些配置屬性的詳細介紹可參考文章:Hadoop YARN配置參數剖析(1)—RM與NM相關參數。
預設情況,各個排程器隻會對記憶體資源進行排程,不會考慮CPU資源,你需要在排程器配置檔案中進行相關設定,具體可參考文章:Hadoop YARN配置參數剖析(4)—Fair Scheduler相關參數和Hadoop YARN配置參數剖析(5)—Capacity Scheduler相關參數。
(3)如何設定單個任務占用的記憶體量和CPU數目?
答:對于MapReduce而言,每個作業的任務資源量可通過以下參數設定:
需要注意的是,預設情況,各個排程器隻會對記憶體資源進行排程,不會考慮CPU資源,你需要在排程器配置檔案中進行相關設定。
(4) 使用者給任務設定的記憶體量為1000MB,為何最終配置設定的記憶體卻是1024MB?
答:為了易于管理資源和排程資源,Hadoop YARN内置了資源規整化算法,它規定了最小可申請資源量、最大可申請資源量和資源規整化因子,如果應用程式申請的資源量小于最小可申請資源量,則YARN會将其大小改為最小可申請量,也就是說,應用程式獲得資源不會小于自己申請的資源,但也不一定相等;如果應用程式申請的資源量大于最大可申請資源量,則會抛出異常,無法申請成功;規整化因子是用來規整化應用程式資源的,應用程式申請的資源如果不是該因子的整數倍,則将被修改為最小的整數倍對應的值,公式為ceil(a/b)*b,其中a是應用程式申請的資源,b為規整化因子。
以上介紹的參數需在yarn-site.xml中設定,相關參數如下:
yarn.scheduler.minimum-allocation-mb:最小可申請記憶體量,預設是1024
yarn.scheduler.minimum-allocation-vcores:最小可申請CPU數,預設是1
yarn.scheduler.maximum-allocation-mb:最大可申請記憶體量,預設是8096
yarn.scheduler.maximum-allocation-vcores:最大可申請CPU數,預設是4
對于規整化因子,不同排程器不同,具體如下:
FIFO和Capacity Scheduler,規整化因子等于最小可申請資源量,不可單獨配置。
Fair Scheduler:規整化因子通過參數yarn.scheduler.increment-allocation-mb和yarn.scheduler.increment-allocation-vcores設定,預設是1024和1。
通過以上介紹可知,應用程式申請到資源量可能大于資源申請的資源量,比如YARN的最小可申請資源記憶體量為1024,規整因子是1024,如果一個應用程式申請1500記憶體,則會得到2048記憶體,如果規整因子是512,則得到1536記憶體。
(5)我們使用的是Fairscheduler,配置了多個隊列,當使用者送出一個作業,指定的隊列不存在時,Fair Scheduler會自動建立一個新隊列而不是報錯(比如報錯:隊列XXX不存在),如何避免這種情況發生?
答:在yarn-site.xml中設定yarn.scheduler.fair.allow-undeclared-pools,将它的值配置為false(預設是true)。