天天看點

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

第1章Yarn資源排程器

思考:

1)如何管理叢集資源?

2)如何給任務合理配置設定資源?

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

Yarn是一個資源排程平台,負責為運算程式提供伺服器運算資源,相當于一個分布式的作業系統平台,而MapReduce等運算程式則相當于運作于作業系統之上的應用程式。

1.1 Yarn基礎架構

YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等元件構成。

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

1.2 Yarn工作機制

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

(1)MR程式送出到用戶端所在的節點。

(2)YarnRunner向ResourceManager申請一個Application。

(3)RM将該應用程式的資源路徑傳回給YarnRunner。

(4)該程式将運作所需資源送出到HDFS上。

(5)程式資源送出完畢後,申請運作mrAppMaster。

(6)RM将使用者的請求初始化成一個Task。

(7)其中一個NodeManager領取到Task任務。

(8)該NodeManager建立容器Container,并産生MRAppmaster。

(9)Container從HDFS上拷貝資源到本地。

(10)MRAppmaster向RM 申請運作MapTask資源。

(11)RM将運作MapTask任務配置設定給另外兩個NodeManager,另兩個NodeManager分别領取任務并建立容器。

(12)MR向兩個接收到任務的NodeManager發送程式啟動腳本,這兩個NodeManager分别啟動MapTask,MapTask對資料分區排序。

(13)MrAppMaster等待所有MapTask運作完畢後,向RM申請容器,運作ReduceTask。

(14)ReduceTask向MapTask擷取相應分區的資料。

(15)程式運作完畢後,MR會向RM申請登出自己。

講解位址:https://www.bilibili.com/video/BV1Qp4y1n7EN?p=127&vd_source=eb68502f30a10ee7e5e6328b4db887ac

1.3 作業送出全過程

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操
大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

上圖的job.split是切片資訊,決定開啟的MapTask數量,job.xml是job的配置資訊(例如前面的MapReduce的相關配置都包含在這裡面),wc.jar是程式包

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

作業送出全過程詳解

(1)作業送出

第1步:Client調用job.waitForCompletion方法,向整個叢集送出MapReduce作業。

第2步:Client向RM申請一個作業id。

第3步:RM給Client傳回該job資源的送出路徑和作業id。

第4步:Client送出jar包、切片資訊和配置檔案到指定的資源送出路徑。

第5步:Client送出完資源後,向RM申請運作MrAppMaster。

(2)作業初始化

第6步:當RM收到Client的請求後,将該job添加到容量排程器中。

第7步:某一個空閑的NM領取到該Job。

第8步:該NM建立Container,并産生MRAppmaster。

第9步:下載下傳Client送出的資源到本地。

(3)任務配置設定

第10步:MrAppMaster向RM申請運作多個MapTask任務資源。

第11步:RM将運作MapTask任務配置設定給另外兩個NodeManager,另兩個NodeManager分别領取任務并建立容器。

(4)任務運作

第12步:MR向兩個接收到任務的NodeManager發送程式啟動腳本,這兩個NodeManager分别啟動MapTask,MapTask對資料分區排序。

第13步:MrAppMaster等待所有MapTask運作完畢後,向RM申請容器,運作ReduceTask。

第14步:ReduceTask向MapTask擷取相應分區的資料。

第15步:程式運作完畢後,MR會向RM申請登出自己。

(5)進度和狀态更新

YARN中的任務将其進度和狀态(包括counter)傳回給應用管理器, 用戶端每秒(通過mapreduce.client.progressmonitor.pollinterval設定)向應用管理器請求進度更新, 展示給使用者。

(6)作業完成

除了向應用管理器請求作業進度外, 用戶端每5秒都會通過調用waitForCompletion()來檢查作業是否完成。時間間隔可以通過mapreduce.client.completion.pollinterval來設定。作業完成之後, 應用管理器和Container會清理工作狀态。作業的資訊會被作業曆史伺服器存儲以備之後使用者核查。

1.4 Yarn排程器和排程算法

目前,Hadoop作業排程器主要有三種:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。Apache Hadoop3.1.3預設的資源排程器是Capacity Scheduler。

CDH架構預設排程器是Fair Scheduler。

具體設定詳見:yarn-default.xml檔案

<property>
    <description>The class to use as the resource scheduler.</description>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
           

1.4.1 先進先出排程器(FIFO)

FIFO排程器(First In First Out):單隊列,根據送出作業的先後順序,先來先服務。

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

優點:簡單易懂;

缺點:不支援多隊列,生産環境很少使用;

1.4.2 容量排程器(Capacity Scheduler)

Capacity Scheduler是Yahoo開發的多使用者排程器。

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操
大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

1.4.3 公平排程器(Fair Scheduler)

Fair Schedulere是Facebook開發的多使用者排程器。

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操
大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操
大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操
大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操
大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操
大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

大公司要求高并發就用公平排程器,不然那就用容量排程器

1.5 Yarn常用指令

Yarn狀态的查詢,除了可以在hadoop103:8088頁面檢視外,還可以通過指令操作。常見的指令操作如下所示:

需求:執行WordCount案例,并用Yarn指令檢視任務運作情況。

[[email protected] hadoop-3.1.3]$ myhadoop.sh start
[[email protected] hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
           

1.5.1 yarn application檢視任務

(1)列出所有Application:

[[email protected] hadoop-3.1.3]$ yarn application -list

2021-02-06 10:21:19,238 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):0
                Application-Id	    Application-Name	    Application-Type	      User	     Queue	             State	       Final-State	       Progress	                       Tracking-URL
           

(2)根據Application狀态過濾:yarn application -list -appStates (所有狀态:ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)

[[email protected] hadoop-3.1.3]$ yarn application -list -appStates FINISHED

2021-02-06 10:22:20,029 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Total number of applications (application-types: [], states: [FINISHED] and tags: []):1
                Application-Id	    Application-Name	    Application-Type	      User	     Queue	             State	       Final-State	       Progress	                       Tracking-URL
application_1612577921195_0001	          word count	           MAPREDUCE	   atguigu	   default	          FINISHED	         SUCCEEDED	           100%	http://hadoop102:19888/jobhistory/job/job_1612577921195_0001
           

(3)Kill掉Application:

[[email protected] hadoop-3.1.3]$ yarn application -kill application_1612577921195_0001

2021-02-06 10:23:48,530 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Application application_1612577921195_0001 has already finished
           

1.5.2 yarn logs檢視日志

(1)查詢Application日志:yarn logs -applicationId <ApplicationId>

[[email protected] hadoop-3.1.3]$ yarn logs -applicationId application_1612577921195_0001

(2)查詢Container日志:yarn logs -applicationId <ApplicationId> -containerId <ContainerId>

[[email protected] hadoop-3.1.3]$ yarn logs -applicationId application_1612577921195_0001 -containerId container_1612577921195_0001_01_000001

這裡的容器id可以通過下面的yarn applicationattempt -list 來檢視

1.5.3 yarn applicationattempt檢視嘗試運作的任務

(1)列出所有Application嘗試的清單:yarn applicationattempt -list <ApplicationId>

[[email protected] hadoop-3.1.3]$ yarn applicationattempt -list application_1612577921195_0001

2021-02-06 10:26:54,195 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Total number of application attempts :1
         ApplicationAttempt-Id	               State	                    AM-Container-Id	                       Tracking-URL
appattempt_1612577921195_0001_000001	            FINISHED	container_1612577921195_0001_01_000001	http://hadoop103:8088/proxy/application_1612577921195_0001/
           

(2)列印ApplicationAttemp狀态:yarn applicationattempt -status <ApplicationAttemptId>

[[email protected] hadoop-3.1.3]$ yarn applicationattempt -status appattempt_1612577921195_0001_000001

2021-02-06 10:27:55,896 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Application Attempt Report : 
	ApplicationAttempt-Id : appattempt_1612577921195_0001_000001
	State : FINISHED
	AMContainer : container_1612577921195_0001_01_000001
	Tracking-URL : http://hadoop103:8088/proxy/application_1612577921195_0001/
	RPC Port : 34756
	AM Host : hadoop104
	Diagnostics :
           

1.5.4 yarn container檢視容器

(1)列出所有Container:yarn container -list <ApplicationAttemptId>

[[email protected] hadoop-3.1.3]$ yarn container -list appattempt_1612577921195_0001_000001

2021-02-06 10:28:41,396 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Total number of containers :0
                  Container-Id	          Start Time	         Finish Time	               State	                Host	   Node Http Address	
           

(2)列印Container狀态: yarn container -status <ContainerId>

[[email protected] hadoop-3.1.3]$ yarn container -status container_1612577921195_0001_01_000001

2021-02-06 10:29:58,554 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Container with id 'container_1612577921195_0001_01_000001' doesn't exist in RM or Timeline Server.
           

注:隻有在任務跑的途中才能看到container的狀态

1.5.5 yarn node檢視節點狀态

列出所有節點:yarn node -list -all

[[email protected] hadoop-3.1.3]$ yarn node -list -all

2021-02-06 10:31:36,962 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Total Nodes:3
         Node-Id	     Node-State	Node-Http-Address	Number-of-Running-Containers
 hadoop103:38168	        RUNNING	   hadoop103:8042	                           0
 hadoop102:42012	        RUNNING	   hadoop102:8042	                           0
 hadoop104:39702	        RUNNING	   hadoop104:8042	                           0
           

1.5.6 yarn rmadmin更新配置

加載隊列配置:yarn rmadmin -refreshQueues

[[email protected] hadoop-3.1.3]$ yarn rmadmin -refreshQueues

2021-02-06 10:32:03,331 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8033
           

1.5.7 yarn queue檢視隊列

列印隊列資訊:yarn queue -status <QueueName>

[[email protected] hadoop-3.1.3]$ yarn queue -status default

2021-02-06 10:32:33,403 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Queue Information : 
Queue Name : default
	State : RUNNING
	Capacity : 100.0%
	Current Capacity : .0%
	Maximum Capacity : 100.0%
	Default Node Label expression : <DEFAULT_PARTITION>
	Accessible Node Labels : *
	Preemption : disabled
	Intra-queue Preemption : disabled
           

1.6 Yarn生産環境核心參數

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

第2章Yarn案例實操

注:調整下列參數之前盡量拍攝Linux快照,否則後續的案例,還需要重寫準備叢集。

2.1 Yarn生産環境核心參數配置案例

1)需求:從1G資料中,統計每個單詞出現次數。伺服器3台,每台配置4G記憶體,4核CPU,4線程。

2)需求分析:

1G / 128m = 8個MapTask;1個ReduceTask;1個mrAppMaster

平均每個節點運作10個 / 3台≈ 3個任務(4 3 3)

3)修改yarn-site.xml配置參數如下:

<!-- 選擇排程器,預設容量 -->
<property>
	<description>The class to use as the resource scheduler.</description>
	<name>yarn.resourcemanager.scheduler.class</name>
	<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
 
<!-- ResourceManager處理排程器請求的線程數量,預設50;如果送出的任務數大于50,可以增加該值,但是不能超過3台* 4線程 = 12線程(去除其他應用程式實際不能超過8) -->
<property>
	<description>Number of threads to handle scheduler interface.</description>
	<name>yarn.resourcemanager.scheduler.client.thread-count</name>
	<value>8</value>
</property>
 
<!-- 是否讓yarn自動檢測硬體進行配置,預設是false,如果該節點有很多其他應用程式,建議手動配置。如果該節點沒有其他應用程式,可以采用自動 -->
<property>
	<description>Enable auto-detection of node capabilities such as memory and CPU.</description>
	<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
	<value>false</value>
</property>
 
<!-- 是否将虛拟核數當作CPU核數,預設是false,采用實體CPU核數 -->
<property>
	<description>Flag to determine if logical processors(such as
	hyperthreads) should be counted as cores. Only applicable on Linux
	when yarn.nodemanager.resource.cpu-vcores is set to -1 and
	yarn.nodemanager.resource.detect-hardware-capabilities is true.
	</description>
	<name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
	<value>false</value>
</property>
 
<!-- 虛拟核數和實體核數乘數,預設是1.0 -->
<property>
	<description>Multiplier to determine how to convert phyiscal cores to
	vcores. This value is used if yarn.nodemanager.resource.cpu-vcores
	is set to -1(which implies auto-calculate vcores) and
	yarn.nodemanager.resource.detect-hardware-capabilities is set to true. The	number of vcores will be calculated as	number of CPUs * multiplier.
	</description>
	<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
	<value>1.0</value>
</property>
 
<!-- NodeManager使用記憶體數,預設8G,修改為4G記憶體 -->
<property>
	<description>Amount of physical memory, in MB, that can be allocated 
	for containers. If set to -1 and
	yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
	automatically calculated(in case of Windows and Linux).
	In other cases, the default is 8192MB.
	</description>
	<name>yarn.nodemanager.resource.memory-mb</name>
	<value>4096</value>
</property>
 
<!-- nodemanager的CPU核數,不按照硬體環境自動設定時預設是8個,修改為4個 -->
<property>
	<description>Number of vcores that can be allocated
	for containers. This is used by the RM scheduler when allocating
	resources for containers. This is not used to limit the number of
	CPUs used by YARN containers. If it is set to -1 and
	yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
	automatically determined from the hardware in case of Windows and Linux.
	In other cases, number of vcores is 8 by default.</description>
	<name>yarn.nodemanager.resource.cpu-vcores</name>
	<value>4</value>
</property>
 
<!-- 容器最小記憶體,預設1G -->
<property>
	<description>The minimum allocation for every container request at the RM	in MBs. Memory requests lower than this will be set to the value of this	property. Additionally, a node manager that is configured to have less memory	than this value will be shut down by the resource manager.
	</description>
	<name>yarn.scheduler.minimum-allocation-mb</name>
	<value>1024</value>
</property>
 
<!-- 容器最大記憶體,預設8G,修改為2G -->
<property>
	<description>The maximum allocation for every container request at the RM	in MBs. Memory requests higher than this will throw an	InvalidResourceRequestException.
	</description>
	<name>yarn.scheduler.maximum-allocation-mb</name>
	<value>2048</value>
</property>
 
<!-- 容器最小CPU核數,預設1個-->
<property>
	<description>The minimum allocation for every container request at the RM	in terms of virtual CPU cores. Requests lower than this will be set to the	value of this property. Additionally, a node manager that is configured to	have fewer virtual cores than this value will be shut down by the resource	manager.
	</description>
	<name>yarn.scheduler.minimum-allocation-vcores</name>
	<value>1</value>
</property>
 
<!-- 容器最大CPU核數,預設4個,修改為2個 -->
<property>
	<description>The maximum allocation for every container request at the RM	in terms of virtual CPU cores. Requests higher than this will throw an
	InvalidResourceRequestException.</description>
	<name>yarn.scheduler.maximum-allocation-vcores</name>
	<value>2</value>
</property>
 
<!-- 虛拟記憶體檢查,預設打開,修改為關閉 -->
<property>
	<description>Whether virtual memory limits will be enforced for
	containers.</description>
	<name>yarn.nodemanager.vmem-check-enabled</name>
	<value>false</value>
</property>
 
<!-- 虛拟記憶體和實體記憶體設定比例,預設2.1 -->
<property>
	<description>Ratio between virtual memory to physical memory when	setting memory limits for containers. Container allocations are	expressed in terms of physical memory, and virtual memory usage	is allowed to exceed this allocation by this ratio.
	</description>
	<name>yarn.nodemanager.vmem-pmem-ratio</name>
	<value>2.1</value>
</property>
           
大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

4)分發配置。

注意:如果叢集的硬體資源不一緻,要每個NodeManager單獨配置

5)重新開機叢集

[[email protected] hadoop-3.1.3]$ sbin/stop-yarn.sh

[[email protected] hadoop-3.1.3]$ sbin/start-yarn.sh

6)執行WordCount程式

[[email protected] hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output

7)觀察Yarn任務執行頁面

http://hadoop103:8088/cluster/apps

2.2 容量排程器多隊列送出案例

1)在生産環境怎麼建立隊列?

(1)排程器預設就1個default隊列,不能滿足生産要求。

(2)按照架構:hive /spark/ flink 每個架構的任務放入指定的隊列(企業用的不是特别多)

(3)按照業務子產品:登入注冊、購物車、下單、業務部門1、業務部門2

2)建立多隊列的好處?

(1)因為擔心員工不小心,寫遞歸死循環代碼,把所有資源全部耗盡。

(2)實作任務的降級使用,特殊時期保證重要的任務隊列資源充足。11.11 6.18

業務部門1(重要)=》業務部門2(比較重要)=》下單(一般)=》購物車(一般)=》登入注冊(次要)

2.2.1 需求

需求1:default隊列占總記憶體的40%,最大資源容量占總資源60%,hive隊列占總記憶體的60%,最大資源容量占總資源80%。

需求2:配置隊列優先級

2.2.2 配置多隊列的容量排程器

1)在capacity-scheduler.xml中配置如下:

(1)修改如下配置

<!-- 指定多隊列,增加hive隊列 -->
<property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,hive</value>
    <description>
      The queues at the this level (root is the root queue).
    </description>
</property>
 
<!-- 降低default隊列資源額定容量為40%,預設100% -->
<property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>40</value>
</property>
 
<!-- 降低default隊列資源最大容量為60%,預設100% -->
<property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>60</value>
</property>
           

(2)為新加隊列添加必要屬性:

<!-- 指定hive隊列的資源額定容量 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.capacity</name>
    <value>60</value>
</property>
 
<!-- 使用者最多可以使用隊列多少資源,1表示 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
    <value>1</value>
</property>
 
<!-- 指定hive隊列的資源最大容量 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
    <value>80</value>
</property>
 
<!-- 啟動hive隊列 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.state</name>
    <value>RUNNING</value>
</property>
 
<!-- 哪些使用者有權向隊列送出作業 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
    <value>*</value>
</property>
 
<!-- 哪些使用者有權操作隊列,管理者權限(檢視/殺死) -->
<property>
    <name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
    <value>*</value>
</property>
 
<!-- 哪些使用者有權配置送出任務優先級 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
    <value>*</value>
</property>
 
<!-- 任務的逾時時間設定:yarn application -appId appId -updateLifetime Timeout
參考資料:https://blog.cloudera.com/enforcing-application-lifetime-slas-yarn/ -->
 
<!-- 如果application指定了逾時時間,則送出到該隊列的application能夠指定的最大逾時時間不能超過該值。 
-->
<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
    <value>-1</value>
</property>
 
<!-- 如果application沒指定逾時時間,則用default-application-lifetime作為預設值 -->
<property>
    <name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
    <value>-1</value>
</property>
           

2)分發配置檔案

3)重新開機Yarn或者執行yarn rmadmin -refreshQueues重新整理隊列,就可以看到兩條隊列:

[[email protected] hadoop-3.1.3]$ yarn rmadmin -refreshQueues

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

2.2.3 向Hive隊列送出任務

1)hadoop jar的方式

[[email protected] hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename=hive /input /output

注: -D表示運作時改變參數值

2)打jar包的方式

預設的任務送出都是送出到default隊列的。如果希望向其他隊列送出任務,需要在Driver中聲明:

public class WcDrvier {
 
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
 
        Configuration conf = new Configuration();
 
        conf.set("mapreduce.job.queuename","hive");
 
        //1. 擷取一個Job執行個體
        Job job = Job.getInstance(conf);
 
        。。。。。。
 
        //6. 送出Job
        boolean b = job.waitForCompletion(true);
        System.exit(b ? 0 : 1);
    }
}
           

這樣,這個任務在叢集送出時,就會送出到hive隊列:

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

2.2.4 任務優先級

容量排程器,支援任務優先級的配置,在資源緊張時,優先級高的任務将優先擷取資源。預設情況,Yarn将所有任務的優先級限制為0,若想使用任務的優先級功能,須開放該限制。

  1. 修改yarn-site.xml檔案,增加以下參數
<property>
    <name>yarn.cluster.max-application-priority</name>
    <value>5</value>
</property>
           

2)分發配置,并重新開機Yarn

[[email protected] hadoop]$ xsync yarn-site.xml

[[email protected] hadoop-3.1.3]$ sbin/stop-yarn.sh

[[email protected] hadoop-3.1.3]$ sbin/start-yarn.sh

3)模拟資源緊張環境,可連續送出以下任務,直到新送出的任務申請不到資源為止。

[[email protected] hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 5 2000000

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

4)再次重新送出優先級高的任務

[[email protected] hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -D mapreduce.job.priority=5 5 2000000

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

5)也可以通過以下指令修改正在執行的任務的優先級。

yarn application -appID <ApplicationID> -updatePriority 優先級

[[email protected] hadoop-3.1.3]$ yarn application -appID application_1611133087930_0009 -updatePriority 5

2.3 公平排程器案例

2.3.1 需求

建立兩個隊列,分别是test和atguigu(以使用者所屬組命名)。期望實作以下效果:若使用者送出任務時指定隊列,則任務送出到指定隊列運作;若未指定隊列,test使用者送出的任務到root.group.test隊列運作,atguigu送出的任務到root.group.atguigu隊列運作(注:group為使用者所屬組)。

公平排程器的配置涉及到兩個檔案,一個是yarn-site.xml,另一個是公平排程器隊列配置設定檔案fair-scheduler.xml(檔案名可自定義)。

(1)配置檔案參考資料:

https://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

(2)任務隊列放置規則參考資料:

https://blog.cloudera.com/untangling-apache-hadoop-yarn-part-4-fair-scheduler-queue-basics/

2.3.2 配置多隊列的公平排程器

1)修改yarn-site.xml檔案,加入以下參數

<property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    <description>配置使用公平排程器</description>
</property>
 
<property>
    <name>yarn.scheduler.fair.allocation.file</name>
    <value>/opt/module/hadoop-3.1.3/etc/hadoop/fair-scheduler.xml</value>
    <description>指明公平排程器隊列配置設定配置檔案</description>
</property>
 
<property>
    <name>yarn.scheduler.fair.preemption</name>
    <value>false</value>
    <description>禁止隊列間資源搶占</description>
</property>
           

2)配置fair-scheduler.xml

<?xml version="1.0"?>
<allocations>
  <!-- 單個隊列中Application Master占用資源的最大比例,取值0-1 ,企業一般配置0.1 -->
  <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
  <!-- 單個隊列最大資源的預設值 test atguigu default -->
  <queueMaxResourcesDefault>4096mb,4vcores</queueMaxResourcesDefault>
 
  <!-- 增加一個隊列test -->
  <queue name="test">
    <!-- 隊列最小資源 -->
    <minResources>2048mb,2vcores</minResources>
    <!-- 隊列最大資源 -->
    <maxResources>4096mb,4vcores</maxResources>
    <!-- 隊列中最多同時運作的應用數,預設50,根據線程數配置 -->
    <maxRunningApps>4</maxRunningApps>
    <!-- 隊列中Application Master占用資源的最大比例 -->
    <maxAMShare>0.5</maxAMShare>
    <!-- 該隊列資源權重,預設值為1.0 -->
    <weight>1.0</weight>
    <!-- 隊列内部的資源配置設定政策 -->
    <schedulingPolicy>fair</schedulingPolicy>
  </queue>
  <!-- 增加一個隊列atguigu -->
  <queue name="atguigu" type="parent">
    <!-- 隊列最小資源 -->
    <minResources>2048mb,2vcores</minResources>
    <!-- 隊列最大資源 -->
    <maxResources>4096mb,4vcores</maxResources>
    <!-- 隊列中最多同時運作的應用數,預設50,根據線程數配置 -->
    <maxRunningApps>4</maxRunningApps>
    <!-- 隊列中Application Master占用資源的最大比例 -->
    <maxAMShare>0.5</maxAMShare>
    <!-- 該隊列資源權重,預設值為1.0 -->
    <weight>1.0</weight>
    <!-- 隊列内部的資源配置設定政策 -->
    <schedulingPolicy>fair</schedulingPolicy>
  </queue>
 
  <!-- 任務隊列配置設定政策,可配置多層規則,從第一個規則開始比對,直到比對成功 -->
  <queuePlacementPolicy>
    <!-- 送出任務時指定隊列,如未指定送出隊列,則繼續比對下一個規則; false表示:如果指定隊列不存在,不允許自動建立-->
    <rule name="specified" create="false"/>
    <!-- 送出到root.group.username隊列,若root.group不存在,不允許自動建立;若root.group.user不存在,允許自動建立 -->
    <rule name="nestedUserQueue" create="true">
        <rule name="primaryGroup" create="false"/>
    </rule>
    <!-- 最後一個規則必須為reject或者default。Reject表示拒絕建立送出失敗,default表示把任務送出到default隊列 -->
    <rule name="reject" />
  </queuePlacementPolicy>
</allocations>
           

3)分發配置并重新開機Yarn

[[email protected] hadoop]$ xsync yarn-site.xml
[[email protected] hadoop]$ xsync fair-scheduler.xml
 
[[email protected] hadoop-3.1.3]$ sbin/stop-yarn.sh
[[email protected] hadoop-3.1.3]$ sbin/start-yarn.sh
           

2.3.3 測試送出任務

1)送出任務時指定隊列,按照配置規則,任務會到指定的root.test隊列

[[email protected] hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -Dmapreduce.job.queuename=root.test 1 1

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

2)送出任務時不指定隊列,按照配置規則,任務會到root.atguigu.atguigu隊列

[[email protected] hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1

大資料技術之Hadoop(Yarn)第1章Yarn資源排程器第2章Yarn案例實操

2.4 Yarn的Tool接口案例

0)回顧:

[[email protected] hadoop-3.1.3]$ hadoop jar wc.jar com.atguigu.mapreduce.wordcount2.WordCountDriver /input /output1

期望可以動态傳參,結果報錯,誤認為是第一個輸入參數。

[[email protected] hadoop-3.1.3]$ hadoop jar wc.jar com.atguigu.mapreduce.wordcount2.WordCountDriver -Dmapreduce.job.queuename=root.test /input /output1

1)需求:自己寫的程式也可以動态修改參數。編寫Yarn的Tool接口。

2)具體步驟:

(1)建立Maven項目YarnDemo,pom如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.atguigu.hadoop</groupId>
    <artifactId>yarn_tool_test</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.1.3</version>
        </dependency>
    </dependencies>
</project>
           

(2)建立com.atguigu.yarn報名

(3)建立類WordCount并實作Tool接口:

package com.atguigu.yarn;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
 
import java.io.IOException;
 
public class WordCount implements Tool {
 
    private Configuration conf;
 
    @Override
    public int run(String[] args) throws Exception {
 
        Job job = Job.getInstance(conf);
 
        job.setJarByClass(WordCountDriver.class);
 
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);
 
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
 
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
 
        return job.waitForCompletion(true) ? 0 : 1;
    }
 
    @Override
    public void setConf(Configuration conf) {
        this.conf = conf;
    }
 
    @Override
    public Configuration getConf() {
        return conf;
    }
 
    public static class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
 
        private Text outK = new Text();
        private IntWritable outV = new IntWritable(1);
 
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
 
            String line = value.toString();
            String[] words = line.split(" ");
 
            for (String word : words) {
                outK.set(word);
 
                context.write(outK, outV);
            }
        }
    }
 
    public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable outV = new IntWritable();
 
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
 
            int sum = 0;
 
            for (IntWritable value : values) {
                sum += value.get();
            }
            outV.set(sum);
 
            context.write(key, outV);
        }
    }
}
           

(4)建立WordCountDriver

package com.atguigu.yarn;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import java.util.Arrays;
 
public class WordCountDriver {
 
    private static Tool tool;
 
    public static void main(String[] args) throws Exception {
        // 1. 建立配置檔案
        Configuration conf = new Configuration();
 
        // 2. 判斷是否有tool接口
        switch (args[0]){
            case "wordcount":
                tool = new WordCount();
                break;
            default:
                throw new RuntimeException(" No such tool: "+ args[0] );
        }
        // 3. 用Tool執行程式
        // Arrays.copyOfRange 将老數組的元素放到新數組裡面
        int run = ToolRunner.run(conf, tool, Arrays.copyOfRange(args, 1, args.length));
 
        System.exit(run);
    }
}
           

3)在HDFS上準備輸入檔案,假設為/input目錄,向叢集送出該Jar包

[[email protected] hadoop-3.1.3]$ yarn jar YarnDemo.jar com.atguigu.yarn.WordCountDriver wordcount /input /output

注意此時送出的3個參數,第一個用于生成特定的Tool,第二個和第三個為輸入輸出目錄。此時如果我們希望加入設定參數,可以在wordcount後面添加參數,例如:

[[email protected] hadoop-3.1.3]$ yarn jar YarnDemo.jar com.atguigu.yarn.WordCountDriver wordcount -Dmapreduce.job.queuename=root.test /input /output1

4)注:以上操作全部做完過後,快照回去或者手動将配置檔案修改成之前的狀态,因為本身資源就不夠,分成了這麼多,不友善以後測試。

繼續閱讀