hadoop_MapReduce yarn

林子大有好多鳥發表於2020-11-11

Yarn通俗介紹

  • Apache Hadoop YARN (Yet Another Resource Negotiator,另一種資源協調者)是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統和排程平臺,可為上層應用提供統一的資源管理和排程。
  • 支援多個資料處理框架(MapReduce Spark Storm等)。具有資源利用率高、執行成本底、資料共享等特點

在這裡插入圖片描述

Yarn基本架構

  • ARN是一個資源管理、任務排程的框架,主要包含三大模組:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。

  • ResourceManager負責所有資源的監控、分配和管理,一個叢集只有一個;

  • NodeManager負責每一個節點的維護,一個叢集有多個。

  • ApplicationMaster負責每一個具體應用程式的排程和協調,一個叢集有多個;

  • 對於所有的applications,RM擁有絕對的控制權和對資源的分配權。而每個AM則會和RM協商資源,同時和NodeManager通訊來執行和監控task。

Yarn三大元件介紹

ResourceManager

  • ResourceManager負責整個叢集的資源管理和分配,是一個全域性的資源管理系統。

  • NodeManager以心跳的方式向ResourceManager彙報資源使用情況(目前主要是CPU和記憶體的使用情況)。RM只接受NM的資源回報資訊,對於具體的資源處理則交給NM自己處理。

  • YARN Scheduler根據application的請求為其分配資源,不負責application job的監控、追蹤、執行狀態反饋、啟動等工作。

NodeManager

  • NodeManager是每個節點上的資源和工作管理員,它是管理這臺機器的代理,負責該節點程式的執行,以及該節點資源的管理和監控。YARN叢集每個節點都執行一個NodeManager。

  • NodeManager定時向ResourceManager彙報本節點資源(CPU、記憶體)的使用情況和Container的執行狀態。當ResourceManager當機時NodeManager自動連線RM備用節點。

  • NodeManager接收並處理來自ApplicationMaster的Container啟動、停止等各種請求。

ApplicationMaster

  • 使用者提交的每個應用程式均包含一個ApplicationMaster,它可以執行在ResourceManager以外的機器上。

  • 負責與RM排程器協商以獲取資源(用Container表示)。

  • 將得到的任務進一步分配給內部的任務(資源的二次分配)。

  • 與NM通訊以啟動/停止任務。

  • 監控所有任務執行狀態,並在任務執行失敗時重新為任務申請資源以重啟任務。

  • 當前YARN自帶了兩個ApplicationMaster實現,一個是用於演示AM編寫方法的例項程式DistributedShell,它可以申請一定數目的Container以並行執行一個Shell命令或者Shell指令碼;另一個是執行MapReduce應用程式的AM—MRAppMaster。
    注:RM只負責監控AM,並在AM執行失敗時候啟動它。RM不負責AM內部任務的容錯,任務的容錯由AM完成。

Yarn執行流程

在這裡插入圖片描述

Yarn 排程器Scheduler

  • 理想情況下,我們應用對Yarn資源的請求應該立刻得到滿足,但現實情況資源往往是有限的,特別是在一個很繁忙的叢集,一個應用資源的請求經常需要等待一段時間才能的到相應的資源。在Yarn中,負責給應用分配資源的就是Scheduler。其實排程本身就是一個難題,很難找到一個完美的策略可以解決所有的應用場景。為此,Yarn提供了多種排程器和可配置的策略供我們選擇。
  • 在Yarn中有三種排程器可以選擇:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler。

FIFO Scheduler

  • FIFO Scheduler把應用按提交的順序排成一個佇列,這是一個先進先出佇列,在進行資源分配的時候,先給佇列中最頭上的應用進行分配資源,待最頭上的應用需求滿足後再給下一個分配,以此類推。
    在這裡插入圖片描述

  • FIFO Scheduler是最簡單也是最容易理解的排程器,也不需要任何配置,但它並不適用於共享叢集。大的應用可能會佔用所有叢集資源,這就導致其它應用被阻塞。在共享叢集中,更適合採用Capacity Scheduler或Fair Scheduler,這兩個排程器都允許大任務和小任務在提交的同時獲得一定的系統資源。

Capacity Scheduler

  • Capacity 排程器允許多個組織共享整個叢集,每個組織可以獲得叢集的一部分計算能力。通過為每個組織分配專門的佇列,然後再為每個佇列分配一定的叢集資源,這樣整個叢集就可以通過設定多個佇列的方式給多個組織提供服務了。除此之外,佇列內部又可以垂直劃分,這樣一個組織內部的多個成員就可以共享這個佇列資源了,在一個佇列內部,資源的排程是採用的是先進先出(FIFO)策略。
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 容量排程器 Capacity Scheduler 最初是由 Yahoo 最初開發設計使得 Hadoop 應用能夠被多使用者使用,且最大化整個叢集資源的吞吐量,現被 IBM BigInsights 和 Hortonworks HDP 所採用。
  • Capacity Scheduler 被設計為允許應用程式在一個可預見的和簡單的方式共享叢集資源,即"作業佇列"。Capacity Scheduler 是根據租戶的需要和要求把現有的資源分配給執行的應用程式。Capacity Scheduler 同時允許應用程式訪問還沒有被使用的資源,以確保佇列之間共享其它佇列被允許的使用資源。管理員可以控制每個佇列的容量,Capacity Scheduler 負責把作業提交到佇列中。

Capacity排程器配置使用
排程器的使用是通過yarn-site.xml配置檔案中的
yarn.resourcemanager.scheduler.class引數進行配置的,預設採用Capacity Scheduler排程器。
假設我們有如下層次的佇列:

root
├── prod
└── dev
    ├── mapreduce
    └── spark

下面是一個簡單的Capacity排程器的配置檔案,檔名為capacity-scheduler.xml。在這個配置中,在root佇列下面定義了兩個子佇列prod和dev,分別佔40%和60%的容量。需要注意,一個佇列的配置是通過屬性yarn.sheduler.capacity.<queue-path>.<sub-property>指定的。
<queue-path>代表的是佇列的繼承樹,如root.prod佇列.
<sub-property>一般指capacity和maximum-capacity。

<configuration>
 <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>prod,dev</value>
  </property>
 <property>
    <name>yarn.scheduler.capacity.root.dev.queues</name>
    <value>mapreduce,spark</value>
  </property>
    <property>
    <name>yarn.scheduler.capacity.root.prod.capacity</name>
    <value>40</value>
  </property>
    <property>
    <name>yarn.scheduler.capacity.root.dev.capacity</name>
    <value>60</value>
  </property>
    <property>
    <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
    <value>75</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.dev.mapreduce.capacity</name>
    <value>50</value>
  </property>
   <property>
    <name>yarn.scheduler.capacity.root.dev.spark.capacity</name>
    <value>50</value>
  </property>
</configuration>
  • 我們可以看到,dev佇列又被分成了mapreduce和spark兩個相同容量的子佇列。dev的maximum-capacity屬性被設定成了75%,所以即使prod佇列完全空閒dev也不會佔用全部叢集資源,也就是說,prod佇列仍有25%的可用資源用來應急。我們注意到,mapreduce和spark兩個佇列沒有設定maximum-capacity屬性,也就是說mapreduce或spark佇列中的job可能會用到整個dev佇列的所有資源(最多為叢集的75%)。而類似的,prod由於沒有設定maximum-capacity屬性,它有可能會佔用叢集全部資源。
  • 關於佇列的設定,這取決於我們具體的應用。比如,在MapReduce中,我們可以通過mapreduce.job.queuename屬性指定要用的佇列。如果佇列不存在,我們在提交任務時就會收到錯誤。如果我們沒有定義任何佇列,所有的應用將會放在一個default佇列中。
  • 注意:對於Capacity排程器,我們的佇列名必須是佇列樹中的最後一部分,如果我們使用佇列樹則不會被識別。比如,在上面配置中,我們使用prod和mapreduce作為佇列名是可以的,但是如果我們用root.dev.mapreduce或者dev. mapreduce是無效的。
例如:
hadoop jar  ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar pi -D mapreduce.job.queuename=mapreduce 10 10

Fair Scheduler

  • 在Fair排程器中,我們不需要預先佔用一定的系統資源,Fair排程器會為所有執行的job動態的調整系統資源。如下圖所示,當第一個大job提交時,只有這一個job在執行,此時它獲得了所有叢集資源;當第二個小任務提交後,Fair排程器會分配一半資源給這個小任務,讓這兩個任務公平的共享叢集資源。
  • 需要注意的是,在下圖Fair排程器中,從第二個任務提交到獲得資源會有一定的延遲,因為它需要等待第一個任務釋放佔用的Container。小任務執行完成之後也會釋放自己佔用的資源,大任務又獲得了全部的系統資源。最終效果就是Fair排程器即得到了高的資源利用率又能保證小任務及時完成。
    在這裡插入圖片描述
  • 公平排程器 Fair Scheduler 最初是由 Facebook 開發設計使得 Hadoop 應用能夠被多使用者公平地共享整個叢集資源,現被 Cloudera CDH 所採用。
  • Fair Scheduler 不需要保留叢集的資源,因為它會動態在所有正在執行的作業之間平衡資源。

yarn多租戶資源隔離

  • 在一個公司內部的Hadoop Yarn叢集,肯定會被多個業務、多個使用者同時使用,共享Yarn的資源,如果不做資源的管理與規劃,那麼整個Yarn的資源很容易被某一個使用者提交的Application佔滿,其它任務只能等待,這種當然很不合理,我們希望每個業務都有屬於自己的特定資源來執行MapReduce任務,Hadoop中提供的公平排程器–Fair Scheduler,就可以滿足這種需求。
  • Fair Scheduler將整個Yarn的可用資源劃分成多個資源池,每個資源池中可以配置最小和最大的可用資源(記憶體和CPU)、最大可同時執行Application數量、權重、以及可以提交和管理Application的使用者等。
  • Fair Scheduler除了需要在yarn-site.xml檔案中啟用和配置之外,還需要一個XML檔案fair-scheduler.xml來配置資源池以及配額,而該XML中每個資源池的配額可以動態更新,之後使用命令:yarn rmadmin –refreshQueues 來使得其生效即可,不用重啟Yarn叢集。
  • 需要注意的是:動態更新只支援修改資源池配額,如果是新增或減少資源池,則需要重啟Yarn叢集。

編輯yarn-site.xml

yarn叢集主節點中yarn-site.xml新增以下配置
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim yarn-site.xml


<!--  指定使用fairScheduler的排程方式  -->
<property>
	<name>yarn.resourcemanager.scheduler.class</name>
	<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

<!--  指定配置檔案路徑  -->
<property>
	<name>yarn.scheduler.fair.allocation.file</name>
	<value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/fair-scheduler.xml</value>
</property>

<!-- 是否啟用資源搶佔,如果啟用,那麼當該佇列資源使用
yarn.scheduler.fair.preemption.cluster-utilization-threshold 這麼多比例的時候,就從其他空閒佇列搶佔資源
  -->
<property>
	<name>yarn.scheduler.fair.preemption</name>
	<value>true</value>
</property>

<property>
	<name>yarn.scheduler.fair.preemption.cluster-utilization-threshold</name>
	<value>0.8f</value>
</property>

<!-- 預設提交到default佇列  -->
<property>
	<name>yarn.scheduler.fair.user-as-default-queue</name>
	<value>true</value>
</property>

<!-- 如果提交一個任務沒有到任何的佇列,是否允許建立一個新的佇列,設定false不允許  -->
<property>
	<name>yarn.scheduler.fair.allow-undeclared-pools</name>
	<value>false</value>
</property>

新增fair-scheduler.xml配置檔案
scp分發配置檔案、重啟yarn叢集

相關文章