YARN產生背景

YARN是Hadoop2.x纔有的,因此在介紹YARN以前,咱們先看一下MapReduce1.x時所存在的問題:html

  • 單點故障
  • 節點壓力大
  • 不易擴展

MapReduce1.x時的架構以下:
分佈式資源調度——YARN框架java

能夠看到,1.x時也是Master/Slave這種主從結構,在集羣上的表現就是一個JobTracker帶多個TaskTracker。node

JobTracker:負責資源管理和做業調度
TaskTracker:按期向JobTracker彙報本節點的健康情況、資源使用狀況以及做業執行狀況。還能夠接收來自JobTracker的命令,例如啓動任務或結束任務等。apache

那麼這種架構存在哪些問題呢:vim

  1. 整個集羣中只有一個JobTracker,就表明着會存在單點故障的狀況
  2. JobTracker節點的壓力很大,不只要接收來自客戶端的請求,還要接收大量TaskTracker節點的請求
  3. 因爲JobTracker是單節點,因此容易成爲集羣中的瓶頸,並且也不易域擴展
  4. JobTracker承載的職責過多,基本整個集羣中的事情都是JobTracker來管理
  5. 1.x版本的整個集羣只支持MapReduce做業,其餘例如Spark的做業就不支持了

因爲1.x版本不支持其餘框架的做業,因此致使咱們須要根據不一樣的框架去搭建多個集羣。這樣就會致使資源利用率比較低以及運維成本太高,由於多個集羣會致使服務環境比較複雜。以下圖:
分佈式資源調度——YARN框架centos

在上圖中咱們能夠看到,不一樣的框架我不只須要搭建不一樣的集羣。並且這些集羣不少時候並非老是在工做,如上圖能夠看到,Hadoop集羣在忙的時候Spark就比較閒,Spark集羣比較忙的時候Hadoop集羣就比較閒,而MPI集羣則是總體並非很忙。這樣就沒法高效的利用資源,由於這些不一樣的集羣沒法互相使用資源。除此以外,咱們還得運維這些個不一樣的集羣,並且文件系統是沒法共享的。若是當須要將Hadoop集羣上的HDFS裏存儲的數據傳輸到Spark集羣上進行計算時,還會耗費至關大的網絡IO流量。瀏覽器

因此咱們就想着要把這些集羣都合併在一塊兒,讓這些不一樣的框架可以運行在同一個集羣上,這樣就能解決這各類各樣的問題了。以下圖:
分佈式資源調度——YARN框架bash

正是由於在1.x中,有各類各樣的問題,才使得YARN得以誕生,而YARN就能夠令這些不一樣的框架運行在同一個集羣上,併爲它們調度資源。咱們來看看Hadoop2.x的架構圖:
分佈式資源調度——YARN框架網絡

在上圖中,咱們能夠看到,集羣最底層的是HDFS,在其之上的就是YARN層,而在YARN層上則是各類不一樣的計算框架。因此不一樣計算框架能夠共享同一個HDFS集羣上的數據,享受總體的資源調度,進而提升集羣資源的利用率,這也就是所謂的 xxx on YARN。架構


YARN架構

YARN概述:

  • YARN是資源調度框架
  • 通用的資源管理系統
  • 爲上層應用提供統一的資源管理和調度

YARN架構圖,也是Master/Slave結構的:
分佈式資源調度——YARN框架

從上圖中,咱們能夠看到YARN主要由如下幾個核心組件構成:

1. ResourceManager, 簡稱RM,整個集羣同一時間提供服務的RM只有一個,它負責集羣資源的統一管理和調度。以及還須要處理客戶端的請求,例如:提交做業或結束做業等。而且監控集羣中的NM,一旦某個NM掛了,那麼就須要將該NM上運行的任務告訴AM來如何進行處理。

2. NodeManager, 簡稱NM,整個集羣中會有多個NM,它主要負責本身自己節點的資源管理和使用,以及定時向RM彙報本節點的資源使用狀況。接收並處理來自RM的各類命令,例如:啓動Container。NM還須要處理來自AM的命令,例如:AM會告訴NM須要啓動多少個Container來跑task。

3. ApplicationMaster, 簡稱AM,每一個應用程序都對應着一個AM。例如:MapReduce會對應一個、Spark會對應一個。它主要負責應用程序的管理,爲應用程序向RM申請資源(Core、Memory),將資源分配給內部的task。AM須要與NM通訊,以此來啓動或中止task。task是運行在Container裏面的,因此AM也是運行在Container裏面。

4. Container, 封裝了CPU、Memory等資源的一個容器,至關因而一個任務運行環境的抽象。

5. Client, 客戶端,它能夠提交做業、查詢做業的運行進度以及結束做業。

YARN官方文檔地址以下:

https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html


YARN執行流程

假設客戶端向ResourceManager提交一個做業,ResourceManager則會爲這個做業分配一個Container。因此ResourceManager會與NodeManager進行通訊,要求這個NodeManager啓動一個Container。而這個Container是用來啓動ApplicationMaster的,ApplicationMaster啓動完以後會與ResourceManager進行一個註冊。這時候客戶端就能夠經過ResourceManager查詢做業的運行狀況了。而後ApplicationMaster還會到ResourceManager上申請做業所須要的資源,申請到之後就會到對應的NodeManager之上運行客戶端所提交的做業,而後NodeManager就會把task運行在啓動的Container裏。

以下圖:
分佈式資源調度——YARN框架

另外找到兩篇關於YARN執行流程不錯的文章:


YARN環境搭建

介紹完基本的理論部分以後,咱們來搭建一個僞分佈式的單節點YARN環境,使用的hadoop版本以下:

  • hadoop-2.6.0-cdh5.7.0

官方的安裝文檔地址以下:

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html

1.下載並解壓好hadoop-2.6.0-cdh5.7.0,這一步能夠參考我以前寫的一篇關於HDFS僞分佈式環境搭建的文章,我這裏就再也不贅述了。

確保HDFS是正常啓動狀態:

[root@localhost ~]# jps 3827 Jps 3383 NameNode 3500 DataNode 3709 SecondaryNameNode [root@localhost ~]# 

2.編輯mapred-site.xml配置文件,在文件中增長以下內容:

[root@localhost ~]# cd /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop]# cp mapred-site.xml.template mapred-site.xml # 拷貝模板文件 [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop]# vim mapred-site.xml # 增長以下內容 <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>

3.編輯yarn-site.xml配置文件,在文件中增長以下內容:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop]# vim yarn-site.xml # 增長以下內容 <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>

4.啓動ResourceManager進程以及NodeManager進程:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop]# cd ../../sbin/ [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/sbin]# ./start-yarn.sh starting yarn daemons starting resourcemanager, logging to /usr/local/hadoop-2.6.0-cdh5.7.0/logs/yarn-root-resourcemanager-localhost.out localhost: starting nodemanager, logging to /usr/local/hadoop-2.6.0-cdh5.7.0/logs/yarn-root-nodemanager-localhost.out [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/sbin]# jps 3984 NodeManager # 啓動成功後能夠看到多出了NodeManager 4947 DataNode 5252 Jps 5126 SecondaryNameNode 3884 ResourceManager # 和ResourceManager進程,這樣纔是正常的。 4813 NameNode [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/sbin]# netstat -lntp |grep java tcp 0 0 0.0.0.0:50090 0.0.0.0:* LISTEN 5126/java tcp 0 0 127.0.0.1:42602 0.0.0.0:* LISTEN 4947/java tcp 0 0 192.168.77.130:8020 0.0.0.0:* LISTEN 4813/java tcp 0 0 0.0.0.0:50070 0.0.0.0:* LISTEN 4813/java tcp 0 0 0.0.0.0:50010 0.0.0.0:* LISTEN 4947/java tcp 0 0 0.0.0.0:50075 0.0.0.0:* LISTEN 4947/java tcp 0 0 0.0.0.0:50020 0.0.0.0:* LISTEN 4947/java tcp6 0 0 :::8040 :::* LISTEN 5566/java tcp6 0 0 :::8042 :::* LISTEN 5566/java tcp6 0 0 :::8088 :::* LISTEN 5457/java tcp6 0 0 :::13562 :::* LISTEN 5566/java tcp6 0 0 :::8030 :::* LISTEN 5457/java tcp6 0 0 :::8031 :::* LISTEN 5457/java tcp6 0 0 :::8032 :::* LISTEN 5457/java tcp6 0 0 :::48929 :::* LISTEN 5566/java tcp6 0 0 :::8033 :::* LISTEN 5457/java [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/sbin]# 

5.經過瀏覽器來訪問ResourceManager,默認端口是8088,例如192.168.77.130:8088,就會訪問到這樣的一個頁面上:
分佈式資源調度——YARN框架

錯誤解決:

從上圖中,能夠看到有一個不健康的節點,也就是說咱們的單節點環境有問題,點擊紅色框框中標記的數字能夠進入到詳細的信息頁面,在該頁面中看到了以下信息:

分佈式資源調度——YARN框架

因而查看yarn的日誌文件:yarn-root-nodemanager-localhost.log,發現以下警告與異常:
分佈式資源調度——YARN框架

很明顯是由於磁盤的使用空間達到了90%,因此咱們須要刪除一些沒有的數據,或者擴容磁盤空間才行。因而刪除了一堆安裝包,讓磁盤空間下降到90%如下了:

[root@localhost /usr/local]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 19G 14G 4.5G 76% / devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 8.7M 3.9G 1% /run tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/sdb 50G 14G 34G 29% /kvm_data /dev/sda1 497M 127M 371M 26% /boot tmpfs 781M 0 781M 0% /run/user/0 [root@localhost /usr/local]# 

這時再次刷新頁面,能夠發現這個節點就正常了:
分佈式資源調度——YARN框架

到此爲止,咱們的yarn環境就搭建完成了。

若是須要關閉進程則使用如下命令:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/sbin]# stop-yarn.sh

初識提交PI的MapReduce做業到YARN上執行

雖然咱們沒有搭建MapReduce的環境,可是咱們可使用Hadoop自帶的一些測試例子來演示一下如何提交做業到YARN上執行。Hadoop把example的包放在了以下路徑,能夠看到有好幾個jar包:

[root@localhost ~]# cd /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/ [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# ls hadoop-mapreduce-client-app-2.6.0-cdh5.7.0.jar hadoop-mapreduce-client-common-2.6.0-cdh5.7.0.jar hadoop-mapreduce-client-core-2.6.0-cdh5.7.0.jar hadoop-mapreduce-client-hs-2.6.0-cdh5.7.0.jar hadoop-mapreduce-client-hs-plugins-2.6.0-cdh5.7.0.jar hadoop-mapreduce-client-jobclient-2.6.0-cdh5.7.0.jar hadoop-mapreduce-client-jobclient-2.6.0-cdh5.7.0-tests.jar hadoop-mapreduce-client-nativetask-2.6.0-cdh5.7.0.jar hadoop-mapreduce-client-shuffle-2.6.0-cdh5.7.0.jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar lib lib-examples sources [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# 

在這裏咱們使用hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar這個jar包來進行演示:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 2 3

命令說明:

  • hadoop jar 執行一個jar包做業的命令
  • hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar 須要被執行的jar包路徑
  • pi 表示計算圓周率,能夠寫其餘的
  • 末尾的兩個數據分別表示指定運行2次map, 以及指定每一個map任務取樣3次,兩數相乘即爲總的取樣數。

運行以上命令後,到瀏覽器頁面上進行查看,會有如下三個階段:

1.接收資源,這個階段就是ApplicationMaster到ResourceManager上申請做業所須要的資源:
分佈式資源調度——YARN框架

2.運行做業,這時候NodeManager就會把task運行在啓動的Container裏:
分佈式資源調度——YARN框架

3.做業完成:
分佈式資源調度——YARN框架

終端輸出信息以下:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 2 3 Number of Maps = 2 Samples per Map = 3 Wrote input for Map #0 Wrote input for Map #1 Starting Job 18/03/27 23:00:01 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 18/03/27 23:00:01 INFO input.FileInputFormat: Total input paths to process : 2 18/03/27 23:00:01 INFO mapreduce.JobSubmitter: number of splits:2 18/03/27 23:00:02 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1522162696272_0001 18/03/27 23:00:02 INFO impl.YarnClientImpl: Submitted application application_1522162696272_0001 18/03/27 23:00:02 INFO mapreduce.Job: The url to track the job: http://localhost:8088/proxy/application_1522162696272_0001/ 18/03/27 23:00:02 INFO mapreduce.Job: Running job: job_1522162696272_0001 18/03/27 23:00:10 INFO mapreduce.Job: Job job_1522162696272_0001 running in uber mode : false 18/03/27 23:00:10 INFO mapreduce.Job: map 0% reduce 0% 18/03/27 23:00:15 INFO mapreduce.Job: map 50% reduce 0% 18/03/27 23:00:16 INFO mapreduce.Job: map 100% reduce 0% 18/03/27 23:00:19 INFO mapreduce.Job: map 100% reduce 100% 18/03/27 23:00:20 INFO mapreduce.Job: Job job_1522162696272_0001 completed successfully 18/03/27 23:00:20 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=50 FILE: Number of bytes written=335298 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=536 HDFS: Number of bytes written=215 HDFS: Number of read operations=11 HDFS: Number of large read operations=0 HDFS: Number of write operations=3 Job Counters Launched map tasks=2 Launched reduce tasks=1 Data-local map tasks=2 Total time spent by all maps in occupied slots (ms)=7108 Total time spent by all reduces in occupied slots (ms)=2066 Total time spent by all map tasks (ms)=7108 Total time spent by all reduce tasks (ms)=2066 Total vcore-seconds taken by all map tasks=7108 Total vcore-seconds taken by all reduce tasks=2066 Total megabyte-seconds taken by all map tasks=7278592 Total megabyte-seconds taken by all reduce tasks=2115584 Map-Reduce Framework Map input records=2 Map output records=4 Map output bytes=36 Map output materialized bytes=56 Input split bytes=300 Combine input records=0 Combine output records=0 Reduce input groups=2 Reduce shuffle bytes=56 Reduce input records=4 Reduce output records=0 Spilled Records=8 Shuffled Maps =2 Failed Shuffles=0 Merged Map outputs=2 GC time elapsed (ms)=172 CPU time spent (ms)=2990 Physical memory (bytes) snapshot=803618816 Virtual memory (bytes) snapshot=8354324480 Total committed heap usage (bytes)=760217600 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=236 File Output Format Counters Bytes Written=97 Job Finished in 19.96 seconds Estimated value of Pi is 4.00000000000000000000 [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]#

以上這個例子計算了一個PI值,下面咱們再來演示一個hadoop中比較經典的例子:wordcount ,這是一個經典的詞頻統計的例子。首先建立好用於測試的文件:

[root@localhost ~]# mkdir /tmp/input [root@localhost ~]# cd /tmp/input/ [root@localhost /tmp/input]# echo "hello word" > file1.txt [root@localhost /tmp/input]# echo "hello hadoop" > file2.txt [root@localhost /tmp/input]# echo "hello mapreduce" >> file2.txt [root@localhost /tmp/input]# hdfs dfs -mkdir /wc_input [root@localhost /tmp/input]# hdfs dfs -put ./file* /wc_input [root@localhost /tmp/input]# hdfs dfs -ls /wc_input Found 2 items -rw-r--r-- 1 root supergroup 11 2018-03-27 23:11 /wc_input/file1.txt -rw-r--r-- 1 root supergroup 29 2018-03-27 23:11 /wc_input/file2.txt [root@localhost /tmp/input]# 

而後執行如下命令:

[root@localhost /tmp/input]# cd /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# hadoop jar ./hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wc_input /wc_output

在yarn頁面上顯示的階段信息:
分佈式資源調度——YARN框架
分佈式資源調度——YARN框架
分佈式資源調度——YARN框架

終端輸出信息以下:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# hadoop jar ./hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wc_input /wc_output 18/03/27 23:12:54 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 18/03/27 23:12:55 INFO input.FileInputFormat: Total input paths to process : 2 18/03/27 23:12:55 INFO mapreduce.JobSubmitter: number of splits:2 18/03/27 23:12:55 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1522162696272_0002 18/03/27 23:12:56 INFO impl.YarnClientImpl: Submitted application application_1522162696272_0002 18/03/27 23:12:56 INFO mapreduce.Job: The url to track the job: http://localhost:8088/proxy/application_1522162696272_0002/ 18/03/27 23:12:56 INFO mapreduce.Job: Running job: job_1522162696272_0002 18/03/27 23:13:02 INFO mapreduce.Job: Job job_1522162696272_0002 running in uber mode : false 18/03/27 23:13:02 INFO mapreduce.Job: map 0% reduce 0% 18/03/27 23:13:06 INFO mapreduce.Job: map 50% reduce 0% 18/03/27 23:13:07 INFO mapreduce.Job: map 100% reduce 0% 18/03/27 23:13:11 INFO mapreduce.Job: map 100% reduce 100% 18/03/27 23:13:12 INFO mapreduce.Job: Job job_1522162696272_0002 completed successfully 18/03/27 23:13:12 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=70 FILE: Number of bytes written=334375 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=260 HDFS: Number of bytes written=36 HDFS: Number of read operations=9 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=2 Launched reduce tasks=1 Data-local map tasks=2 Total time spent by all maps in occupied slots (ms)=5822 Total time spent by all reduces in occupied slots (ms)=1992 Total time spent by all map tasks (ms)=5822 Total time spent by all reduce tasks (ms)=1992 Total vcore-seconds taken by all map tasks=5822 Total vcore-seconds taken by all reduce tasks=1992 Total megabyte-seconds taken by all map tasks=5961728 Total megabyte-seconds taken by all reduce tasks=2039808 Map-Reduce Framework Map input records=3 Map output records=6 Map output bytes=64 Map output materialized bytes=76 Input split bytes=220 Combine input records=6 Combine output records=5 Reduce input groups=4 Reduce shuffle bytes=76 Reduce input records=5 Reduce output records=4 Spilled Records=10 Shuffled Maps =2 Failed Shuffles=0 Merged Map outputs=2 GC time elapsed (ms)=157 CPU time spent (ms)=2290 Physical memory (bytes) snapshot=800239616 Virtual memory (bytes) snapshot=8352272384 Total committed heap usage (bytes)=762314752 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=40 File Output Format Counters Bytes Written=36 [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# 

查看輸出的結果文件:

[root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# hdfs dfs -ls /wc_output Found 2 items -rw-r--r-- 1 root supergroup 0 2018-03-27 23:13 /wc_output/_SUCCESS -rw-r--r-- 1 root supergroup 36 2018-03-27 23:13 /wc_output/part-r-00000 [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]# hdfs dfs -cat /wc_output/part-r-00000 # 實際輸出結果在part-r-00000中 hadoop 1 hello 3 mapreduce 1 word 1 [root@localhost /usr/local/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce]#