1. 程式人生 > 其它 >6-Hadoop學習筆記3

6-Hadoop學習筆記3

YARN。

YARN

YARN資源排程器

  • YARN是一個資源排程平臺,負責為運算程式提供伺服器運算資源,相當於一個分散式的作業系統平臺,而MapReduce等運算程式則相當於運行於作業系統之上的應用程式

  • YARN基礎架構

    • YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等元件構成
  • YARN工作機制

    • MR程式提交到客戶端所在的節點
    • YarnRunner向ResourceManager申請一個Application
    • RM將該應用程式的資源路徑返回給YarnRunner
    • 該程式將執行所需的資源提交到HDFS上
    • 程式資源提交完畢後,申請執行MRAppMaster
    • RM將使用者的請求初始化成一個Task
    • 其中一個NodeManager領取到Task任務
    • 該NodeManager建立容器Container,併產生MRAPPMaster
    • Container從HDFS上拷貝資源到本地
    • MRAppMaster向RM申請執行MapTask資源
    • RM將執行MapTask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務並建立容器
    • MR向兩個接收到任務的NodeManager傳送程式啟動指令碼,這兩個NodeManager分別啟動MapTask、MapTask對資料分割槽排序
    • MRAppMaster等待所有MapTask執行完畢後,向RM申請容器,執行ReduceTask
    • ReduceTask向MapTask獲取相應分割槽的資料
    • 程式執行完畢後,MR會向RM申請登出自己
  • 作業提交全過程

    • 作業提交

    • 作業初始化

    • 任務分配

    • 任務執行

    • 進度和狀態更新

      • YARN中的任務將其進度和狀態(counter)返回給應用管理器,客戶端每秒(通過mapreduce.client.progressmonitor.pollinterval設定)嚮應用管理器請求進度更新,展示給使用者
    • 作業完成

      • 除了嚮應用管理器請求作業進度外,客戶端每5秒都會通過呼叫waitForCompletion()來檢查作業是否完成。時間間隔可以通過mapreduce.client.completion.pollinterval來設定。作業完成之後,應用管理器和Container會清理工作狀態。作業的資訊被作業歷史伺服器儲存以備之後使用者核查
  • YARN排程器和排程演算法

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

      • <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>
        
    • 先進先出排程器(FIFO)

      • FIFO排程器:單佇列,根據作業提交的先後順序,先來先服務

      • 優點:簡單易懂

      • 缺點:不支援佇列,生產環境很少使用

    • 容量排程器(Yahoo開發的多使用者排程器)

    • 公平排程器(Facebook開發)

  • YARN常用命令

    • yarn application檢視任務

      • 列出所有Application

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

        • yarn application -list -appStates FINISHED
          
      • Kill掉Application

        • yarn application -kill application_1612577921195_0001
          
    • yarn logs檢視日誌

      • 查詢Application日誌

        • yarn logs -applicationId application_1612577921195_0001
          
      • 查詢Container日誌

        • yarn logs -applicationId application_1612577921195_0001 -containerId container_1612577921195_0001_01_000001
          
    • yarn applicationattempt並檢視嘗試執行的任務

      • 列出所有Application嘗試的列表

        • yarn applicationattempt -list application_1612577921195_0001
          
      • 列印ApplicationAttempt狀態

        • yarn applicationattempt -status appattempt_1612577921195_0001_000001
          
    • yarn container檢視容器

      • 列出所有Container

        • yarn container -list appattempt_1612577921195_0001_000001
          
      • 列印Container狀態

        • yarn container -status container_1612577921195_0001_01_000001
          
        • 注:只有任務跑的途中才能看到container的狀態

    • yarn node檢視節點狀態

      • 列出所有節點

        • yarn node -list -all
          
    • yarn rmadmin更新配置

      • 載入佇列配置

        • yarn rmadmin -refreshQueues
          
    • yarn queue檢視佇列

      • 列印佇列資訊

        • yarn queue -status default
          
  • YARN生產環境核心引數

YARN案例實操

  • 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>
      
    • 關閉虛擬記憶體檢查原因

    • 分發配置

    • 重啟叢集

      • sbin/stop-yarn.sh
        sbin/start-yarn.sh
        
  • 容量排程器多佇列提交案例

    • 1)在生產環境怎麼建立佇列?
      (1)排程器預設就1個default佇列,不能滿足生產要求。
          (2)按照框架:hive /spark/ flink 每個框架的任務放入指定的佇列(企業用的不是特別多)
      (3)按照業務模組:登入註冊、購物車、下單、業務部門1、業務部門2
      2)建立多佇列的好處?
      (1)因為擔心員工不小心,寫遞迴死迴圈程式碼,把所有資源全部耗盡。
      (2)實現任務的降級使用,特殊時期保證重要的任務佇列資源充足。11.11  6.18
      業務部門1(重要)=》業務部門2(比較重要)=》下單(一般)=》購物車(一般)=》登入註冊(次要)
      
    • 需求

      • 需求1:default佇列佔總記憶體的40%,最大資源容量佔總資源60%,hive佇列佔總記憶體的60%,最大資源容量佔總資源80%。
        	需求2:配置佇列優先順序
        
    • 配置多佇列的容量排程器

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

      • <!-- 指定多佇列,增加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>
        
      • 為新加佇列新增必要屬性

      • <!-- 指定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>
        
    • 分發配置檔案

    • 重啟Yarn或者執行yarn rmadmin -refreshQueues重新整理佇列,就可以看到兩條佇列

    • 向Hive佇列提交任務

      • # -D表示執行時改變引數值
        hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename=hive /input /output
        
      • 打jar包的方式

        • 預設的任務提交都是提交到default佇列的。如果希望向其他佇列提交任務,需要在Driver中宣告:

        •     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);
              }
          }
          
    • 任務優先順序

      • 容量排程器,支援任務優先順序的配置,在資源緊張時,優先順序高的任務將優先獲取資源。預設情況,Yarn將所有任務的優先順序限制為0,若想使用任務的優先順序功能,須開放該限制。
        
      • 修改yarn-site.xml檔案,增加以下引數

        • <property>
              <name>yarn.cluster.max-application-priority</name>
              <value>5</value>
          </property>
          
      • 分發配置並重啟Yarn

      • 模擬資源緊張環境,可連續提交以下任務,直到新提交的任務申請不到資源為止

      • 再次重新提交優先順序高的任務

      • 也可以通過以下命令修改正在執行的任務的優先順序

        • yarn application -appID application_1611133087930_0009 -updatePriority 5
          
  • 公平排程器案例

    • 需求

      • 建立兩個佇列,分別是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/
        
    • 配置多佇列的公平排程器

      • 修改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>
          
      • 配置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>
          
      • 分發配置並重啟yarn

    • 測試提交任務

      • 提交任務時指定佇列,按照配置規則,任務會到指定的root.test佇列

        • 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
          
      • 提交任務時不指定佇列,按照配置規則,任務會到root.atguigu.atguigu佇列

        • hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1
          
  • Yarn的Tool介面案例(實現動態傳參)

    • 新建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>
        
    • 新建com.lotuslaw.yarn包名

    • 建立類WordCount並實現Tool介面

      • package com.lotuslaw.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);
                }
            }
        }
        
    • 新建WordCountDriver

      • package com.lotuslaw.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);
            }
        }
        
    • 打包上傳叢集,測試

      • yarn jar YarnDemo.jar com.atguigu.yarn.WordCountDriver wordcount -Dmapreduce.job.queuename=root.test /input /output1