1. 先進先出(FIFO)調度器
先進先出調度器是Hadoop的默認調度器。就像這個名字所隱含的那樣,這種調度器就是用簡單按照“先到先得”的算法來調度任務的。例如,作業A和作業B被先后提交。那么在執行作業B的任務前,作業A中的所有map任務都應該已經執行完成。
配置:調度器類型的配置是在mapred-site.xml文件中,將mapred.jobtracker.taskscheduler參數設置為我們想要使用的調度器的類名,FIFO調度器的類名是org.apache.hadoop.mapred.jobQueueTaskScheduler。當然,如果想用FIFO調度器,並不需要在配置文件中明確指定,因為默認的就是FIFO調度器。
2. 公平調度器
公平調度器,有時也叫公平共享調度器或FS調度器,是默認FIFO調度器的一種替代調度器。開發公平調度器的目的是解決FIFO調取器在大流量多用戶環境中所滋生的一些問題。
某些加載項尚不支持其存在,在原來(MR1)公平調度。其中,是使用自定義的政策管轄優先權“提升”過某些應用程序。
將應用程序自動加載到隊列
公平調度器允許管理員配置策略,自動將應用程序提交到合適的隊列中。放置可以依賴於提交者和應用程序通過請求隊列中的用戶和組。策略由一組規則按順序應用到傳入的應用程序進行分類的。每項規則會將應用程序放入一個隊列,拒絕它,或者繼續到下一個規則。請參考下面的配置文件格式如何配置這些策略。
安裝
要使用公平調度器首先在yarn-site.xml配置相應的調度類:
<property>
<name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property>
配置
自定義公平調度器通常需要修改兩個文件。首先,調度范圍的選項可以通過添加在您現有的配置目錄在yarn-site.xml文件配置屬性進行設置。第二,在大多數情況下,用戶希望創建一個配置文件列表的隊列存在,它們各自的權重和容量。配置文件被裝入每10秒,允許改變要在程序進行調度方式。
可以放置在yarn-site.xml屬性
- yarn.scheduler.fair.allocation.file
- 路徑配置文件。分配文件是一個XML清單描述隊列和它們的屬性,除了某些政策的默認值。此文件必須在下一節中描述的XML格式。如果使用相對路徑,則該程序文件中搜索的類路徑(這通常包括Hadoop的conf目錄下)。默認為公平scheduler.xml。
- yarn.scheduler.fair.user-as-default-queue
- 是否使用與分配作為默認隊列名稱關聯的用戶名,在未指定隊列名稱的事件。如果設置為“false”或取消,所有工作都具有共享的缺省隊列,命名為“默認”。默認為true。如果隊列放置策略中給出了配置文件,則忽略此屬性。
- yarn.scheduler.fair.preemption
- 是否使用搶占。需要注意的是搶占實驗是在當前版本中。默認為false。
- yarn.scheduler.fair.sizebasedweight
- 是否將股份分配給基於其規模的個體應用,而不是提供一個平等的份額,所有的應用程序無論大小。如果設置為true,應用程序是由一加應用程序的總內存要求的自然對數,以2。默認值的自然對數除以假加權。
- yarn.scheduler.fair.assignmultiple
- 是否允許多個容器分配在一個心跳。默認為false。
- yarn.scheduler.fair.max.assign
- 如果assignmultiple是true,容器可以在一個心跳被分配的最大金額。默認為-1,這台沒有限制。
- yarn.scheduler.fair.locality.threshold.node
- 對於要求容器在特定節點上的應用程序,調度機會,因為最后一個容器分配數接受安置在另一個節點上之前的等待時間。表現為介於0和1之間的浮點數,其中,作為簇大小的一小部分,是調度機會的數量讓人欲罷不能。-1.0手段的默認值不傳遞任何調度的機會。
- yarn.scheduler.fair.locality.threshold.rack
- 對於要求容器上特定機架的應用,調度機會,因為最后一個容器分配數接受安置在另一架前等待。表現為介於0和1之間的浮點數,其中,作為簇大小的一小部分,是調度機會的數量讓人欲罷不能。-1.0手段的默認值不傳遞任何調度的機會。
- yarn.scheduler.fair.allow-undeclared-pools
- 如果這是true,新的隊列可以在提交申請時被創建,無論是因為它們是由提交者指定為應用程序的隊列中,或者因為它們是由用戶的默認隊列屬性放在那里。如果此為假,任何時間的應用程序將被放置在一個未在該分配文件中指定一個隊列,它被放置在“默認”的隊列來代替。默認為true。如果隊列放置策略中給出了配置文件,則忽略此屬性。
-
配置文件格式
配置文件必須是XML格式。該格式包含了五種類型的元素:
- 隊列中的元素,它們代表的隊列。每一個都可以包含下面的屬性:
- minResources:最少的資源隊列有權在形式的“X MB,Y vcores”。對於單資源公平性的政策,在vcores值將被忽略。如果一個隊列的最低份額不滿意,將根據之前同一母公司提供可用資源的任何其他隊列。當下資源的公平策略隊列被認為是不滿意的,如果它的內存使用量低於其最低內存份額。就失去優勢資源公平性,一個隊列被認為是不滿意的,如果它的使用,它的相對於所述簇的容量優勢資源低於它的最低份額該資源。如果多個隊列不滿意在這種情況下,資源進入隊列有關的資源使用情況和最小值之間的最小比率。注意,有可能是一個隊列,即低於其最小可能不會立即起床到最小,當它提交的申請,因為已經運行的作業可以利用這些資源。
- maxResources:最大的資源隊列是允許的,在形式的“X MB,Y vcores”。對於單資源公平性的政策,在vcores值將被忽略。隊列永遠不會被分配一個容器,將其放在總使用量超過此限制。
- maxRunningApps:從隊列限制的應用程序的數量,同時運行
- 重量:與其他隊列非按比例分擔集群。權值默認為1,而與體重2隊列應收取約兩倍的資源作為一個與默認權重隊列。
- schedulingPolicy:設置任何隊列的調度策略。允許的值是“先進先出”/“公平”/“DRF”或 ??擴展任何類org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy。默認為“公平”。如果“先進先出”,應用程序與先前提交時間以偏愛的容器,但后來提交的應用程序可以同時運行,如果有剩余的空間集群在滿足前面的應用程序的請求后。
- aclSubmitApps:用戶和/或可以提交應用程序的隊列組的列表。請參考下面的ACL部分在此列表的格式和隊列是如何工作的ACL的詳細信息。
- aclAdministerApps:用戶和/或組可管理一個隊列的列表。目前唯一的行政行為是殺一個應用程序。請參考下面的ACL部分在此列表的格式和隊列是如何工作的ACL的詳細信息。
- minSharePreemptionTimeout:秒數隊列是根據它的最小份額的時候,才試圖搶占容器,以使資源從其他隊列。
- 用戶元件,它代表設置管用戶個性化的行為。它們可以包含一個屬性:maxRunningApps上運行的應用程序對特定用戶數量的限制。
- 一個userMaxAppsDefault元素,它設置默認運行的應用程序的限制是不是另有規定的限制的任何用戶。
- 一個fairSharePreemptionTimeout元素,幾秒鍾的隊列號是其公平份額下的時候,才嘗試搶占容器,以使資源從其他隊列。
- 一個defaultQueueSchedulingPolicy元素,它設置為隊列默認的調度策略; 如果所指定的每個隊列的schedulingPolicy元素覆蓋。默認為“公平”。
- 一個queuePlacementPolicy元素,其中包含告訴調度程序如何進入的應用程序放置到隊列規則元素的列表。規則的應用,因為它們列出的順序。規則可能需要的參數。所有規則接受“創造”的說法,這表示規則是否可以創建一個新的隊列。“創建”默認為true; 如果設置為false,該規則將放在未在配置文件中配置一個隊列的應用程序,我們繼續到下一個規則。最后一條規則必須是一個永遠無法發出繼續。有效的規則是:
- 規定:應用程序被放置到它要求隊列中。如果應用程序要求沒有隊列,也就是說,它指定了“default”,我們繼續。
- 用戶:應用程序被放置到一個與誰提交它的用戶的名稱隊列。
- primaryGroup:應用程序被放置到一個隊列,誰提交它的用戶的主組的名稱。
- secondaryGroupExistingQueue:應用程序被放置到一個有一個與誰提交了用戶的次要組名的隊列。符合配置的隊列中的第一次要組將被選中。
- 默認:應用程序被放置到一個名為“默認”的隊列。
- 拒絕:應用程序被拒絕。
這里有一個例子配置文件中給出:
-
<?xml version="1.0"?> <allocations> <queue name="sample_queue"> <minResources>10000 mb,0vcores</minResources> <maxResources>90000 mb,0vcores</maxResources> <maxRunningApps>50</maxRunningApps> <weight>2.0</weight> <schedulingPolicy>fair</schedulingPolicy> <queue name="sample_sub_queue"> <aclSubmitApps>charlie</aclSubmitApps> <minResources>5000 mb,0vcores</minResources> </queue> </queue> <user name="sample_user"> <maxRunningApps>30</maxRunningApps> </user> <userMaxAppsDefault>5</userMaxAppsDefault> <queuePlacementPolicy> <rule name="specified" /> <rule name="primaryGroup" create="false" /> <rule name="default" /> </queuePlacementPolicy> </allocations>
隊列的訪問控制列表(ACL)
根隊列的ACL是“*”,其中,因為ACL是傳下來的默認值,也就是說,每個人都可以提出來,並從每個隊列殺應用程序。要開始限制訪問,修改root隊列的ACL來的東西比“*”等。
管理
公平調度器提供了通過兩個機制來管理支持在運行時:
- 它可以通過編輯配置文件來修改最小的股票,限制,重量,搶占超時和隊列調度策略在運行時。它看到后,它被修改調度程序將重新載入該文件10-15秒。
- 當前的應用程序,隊列和公平共享可以通過ResourceManager的Web界面進行審查,在http://ResourceManager URL/cluster/scheduler。
以下字段可以看出,Web界面上顯示每個隊列信息:
- 使用資源 - 資源分配給隊列容器內的總和。
- 運行的應用程序數 - 應用程序在已收到至少一個容器隊列的數目。
- 等待的應用程序數 - 在隊列中的應用尚未收到任何容器的數量。
- 最小的資源 - 這是保證隊列的配置最少的資源。
- 最大的資源 - 被允許的隊列配置的最大資源。
- 公平共享 - 資源的隊列的公平份額。隊列可能當其他隊列不使用它們被分配的資源超出了他們的公平份額。隊列的資源消耗在於等於或低於其公平份額將永遠不會有它的容器搶占。
除此之外ResourceManager中通常會顯示每個應用程序的信息,Web界面,包括應用程序的公平份額。
參考鏈接:
Hadoop-2.2.0中文文檔 MapReduce下一代 公平調度器
Hadoop的調度器總結
3. 計算能力調度器(Capacity Scheduler)
計算能力調度器是由Yahoo貢獻的,主要是解決HADOOP-3421中提出的,在調度器上完成HOD(Hadoop On Demand)功能,克服已有HOD的性能低效的缺點。它適合於多用戶共享集群的環境的調度器。本文解析的計算能力調度器屬於Hadoop 0.20.2。
Capacity Scheduler支持以下特性:
(1) 計算能力保證。支持多個隊列,某個作業可被提交到某一個隊列中。每個隊列會配置一定比例的計算資源,且所有提交到隊列中的作業共享該隊列中的資源。
(2) 靈活性。空閑資源會被分配給那些未達到資源使用上限的隊列,當某個未達到資源的隊列需要資源時,一旦出現空閑資源資源,便會分配給他們。
(3) 支持優先級。隊列支持作業優先級調度(默認是FIFO)
(4) 多重租賃。綜合考慮多種約束防止單個作業、用戶或者隊列獨占隊列或者集群中的資源。
(5) 基於資源的調度。 支持資源密集型作業,允許作業使用的資源量高於默認值,進而可容納不同資源需求的作業。不過,當前僅支持內存資源的調度。
參考鏈接:
http://www.cnblogs.com/ggjucheng/archive/2012/07/25/2608790.html
Hadoop計算能力調度器應用和配置
