### 4.1 實驗目的
了解什么是YARN框架,如何搭建YARN分布式集群,并能夠使用YARN集群提交一些簡單的任務,理解YARN作為Hadoop生態中的資源管理器的意義。
### 4.2 實驗要求
搭建YARN集群,并使用YARN集群提交簡單的任務。觀察任務提交的之后的YARN的執行過程。
### 4.3 實驗原理
#### 4.3.1 YARN概述
YARN是一個資源管理、任務調度的框架,采用master/slave架構,主要包含三大模塊:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster(AM)。其中,ResourceManager負責所有資源的監控、分配和管理,運行在主節點; NodeManager負責每一個節點的維護,運行在從節點;ApplicationMaster負責每一個具體應用程序的調度和協調,只有在有任務正在執行時存在。對于所有的applications,RM擁有絕對的控制權和對資源的分配權。而每個AM則會和RM協商資源,同時和NodeManager通信來執行和監控task。幾個模塊之間的關系如圖4-1所示:

圖4-1 模塊間的關系
4.3.2 YARN運行流程
YARN運行流程如圖4-2所示:

圖4-2 YARN運行流程如圖
client向RM提交應用程序,其中包括啟動該應用的ApplicationMaster的必須信息,例如ApplicationMaster程序、啟動ApplicationMaster的命令、用戶程序等。
ResourceManager啟動一個container用于運行ApplicationMaster。
啟動中的ApplicationMaster向ResourceManager注冊自己,啟動成功后與RM保持心跳。
ApplicationMaster向ResourceManager發送請求,申請相應數目的container。
ResourceManager返回ApplicationMaster的申請的containers信息。申請成功的container,由ApplicationMaster進行初始化。container的啟動信息初始化后,AM與對應的NodeManager通信,要求NM啟動container。AM與NM保持心跳,從而對NM上運行的任務進行監控和管理。
container運行期間,ApplicationMaster對container進行監控。container通過RPC協議向對應的AM匯報自己的進度和狀態等信息。
應用運行期間,client直接與AM通信獲取應用的狀態、進度更新等信息。
應用運行結束后,ApplicationMaster向ResourceManager注銷自己,并允許屬于它的container被收回。
### 4.4 實驗步驟
該實驗主要分為配置YARN的配置文件,啟動YARN集群,向YARN幾個簡單的任務從而了解YARN工作的流程。
#### 4.4.1 在master機上配置YARN
操作之前請確認HDFS已經啟動,具體操作參考之前的實驗內容。
指定YARN主節點,編輯文件“/usr/cstor/hadoop/etc/hadoop/yarn-site.xml”,將如下內容嵌入此文件里configuration標簽間:
~~~
<property><name>yarn.resourcemanager.hostname</name><value>master</value></property>
<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property>
~~~
yarn-site.xml是YARN守護進程的配置文件。第一句配置了ResourceManager的主機名,第二句配置了節點管理器運行的附加服務為mapreduce_shuffle,只有這樣才可以運行MapReduce程序。
在master機上操作:將配置好的YARN配置文件拷貝至slaveX、client。
~~~
[root@master ~]# cat ~/data/4/machines
slave1
salve2
slave3
client
[allen@cmaster ~]# for x in `cat ~/data/4/machines` ; do echo $x ; scp /usr/cstor/hadoop/etc/hadoop/yarn-site.xml $x:/usr/cstor/hadoop/etc/hadoop/ ; done;
~~~
#### 4.4.2 統一啟動YARN
確認已配置slaves文件,在master機器上查看:
~~~
[root@master ~]# cat /usr/cstor/hadoop/etc/hadoop/slaves
slave1
slave2
slave3
[root@master ~]#
~~~
YARN配置無誤,統一啟動YARN:
~~~
[root@master ~]# /usr/cstor/hadoop/sbin/start-yarn.sh
~~~
#### 4.4.3 驗證YARN啟動成功
讀者可分別在四臺機器上執行如下命令,查看YARN服務是否已啟動。
~~~
[root@master ~]# jps #jps查看java進程
~~~
你會在master上看到類似的如下信息:
~~~
2347 ResourceManager
~~~
這表明在master節點成功啟動ResourceManager,它負責整個集群的資源管理分配,是一個全局的資源管理系統。
而在slave1、slave2、slave3上看到類似的如下信息:
~~~
4021 NodeManager
~~~
NodeManager是每個節點上的資源和任務管理器,它是管理這臺機器的代理,負責該節點程序的運行,以及該節點資源的管理和監控。YARN集群每個節點都運行一個NodeManager。
查看Web界面
在當前的Windows機器上打開瀏覽器,地址欄輸入master的IP和端口號8088(例:10.1.1.7:8088),即可在Web界面看到YARN相關信息。
#### 4.4.4 在client機上提交DistributedShell任務
distributedshell,他可以看做YARN編程中的“hello world”,它的主要功能是并行執行用戶提供的shell命令或者shell腳本。-jar指定了包含ApplicationMaster的jar文件,-shell_command指定了需要被ApplicationMaster執行的Shell命令。
在xshell上再打開一個client 的連接,執行:
~~~
[root@client ~]# /usr/cstor/hadoop/bin/yarn
org.apache.hadoop.yarn.applications.distributedshell.Client -jar
/usr/cstor/hadoop/share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.7.1.jar
-shell_command uptime
~~~
#### 4.4.5 在client機上提交MapReduce型任務
(1)指定在YARN上運行MapReduce任務
首先,在master機上,將文件“/usr/cstor/hadoop/etc/hadoop/mapred-site.xml. template”重命名為“/usr/cstor/hadoop/etc/hadoop/mapred-site.xml”。
接著,編輯此文件并將如下內容嵌入此文件的configuration標簽間:
<property><name>mapreduce.framework.name</name><value>yarn</value></property>
最后,將master機的“/usr/local/hadoop/etc/hadoop/mapred-site.xml”文件拷貝到slaveX與client,重新啟動集群。
(2)在client端提交PI Estimator任務
首先進入Hadoop安裝目錄:/usr/cstor/hadoop/,然后提交PI Estimator任務。
命令最后兩個兩個參數的含義:第一個參數是指要運行map的次數,這里是2次;第二個參數是指每個map任務,取樣的個數;而兩數相乘即為總的取樣數。Pi Estimator使用Monte Carlo方法計算Pi值的,Monte Carlo方法自行百度。
~~~
[root@client hadoop]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar pi 2 10
~~~
#### 4.5 實驗結果
(1)yarn啟動之后在master上的web界面上能看到的界面。如圖4-3所示:

圖4-3 web界面總覽
(2)提交DistributedShell任務之后web界面看到的界面應該是。如圖4-4所示:

圖4-4 DistributedShell任務
(3)提交PI任務之后web界面上看到的。如圖4-5所示:

圖4-5 MR任務計算PI值
在終端能觀察到的界面。如圖4-6所示:

- GitHub---資源收集
- 【GitHub】收錄總榜單
- 【Office & Markdown & PDF】資源收集
- 【前端】資源收集
- 【開源項目】資源收集
- 【代碼備份】資源收集
- 【代碼加密】資源收集
- 【好文章推薦】資源收集
- GitHub---實踐方案
- 【Laradock】實踐方案
- 【開發規范】實踐方案
- 【laravel-snappy】實踐方案
- 【隊列---Laravel-Horizon 】實踐方案
- 【檢索---Elasticsearch】實踐方案---簡單了解
- 【Laravel-admin】實踐方案
- 技術選型
- 技術選型結果
- PHP開發流程
- Laravel自帶異常
- 技術選型問題 & 解決方法
- 修改(Admin)文件夾路徑
- 兩個用戶表合并
- 創建Token,獲取接口數據
- CreateFreshApiToken中間件使用
- Generator從表生成文件,不包括遷移文件
- 添加用戶的同時生產令牌
- 其它參考文章
- Laravel-admin常見問題
- form(),show()獲取對象數據
- Form右上角按鈕重寫
- form回調中的錯誤提醒,回調傳參
- 【小工具類】實踐方案
- 字符串
- 數組
- 無限級分類遞歸
- 時間
- 正則表達式
- 文件
- 經緯度、時區
- DataEdit快捷操作類庫
- 數據庫表結構管理
- 【Guzzle】實踐方案---工具類
- Java---大數據在線實驗
- 基礎實驗操作
- 【一】基礎操作實驗
- HDFS
- 【二】部署HDFS
- 【三】讀寫HDFS文件
- YARN
- 【四】部署YARN集群
- MapReduce
- 【五】單詞計數
- Hive
- 【十】部署Hive
- 【十一】新建Hive表
- 【十二】Hive分區
- ZooKeeper
- 【二十】部署ZooKeeper
- 【二十一】進程協作
- HBase
- 【二十二】部署HBase
- 【二十三】新建HBase表
- Storm
- 【二十四】部署Storm
- 【二十五】實時WordCountTopology
- Kafka
- 【二十七】Kafka訂閱推送示例
- Redis
- 【二十九】Redis部署與簡單使用
- 【三十】MapReduce與Spark讀寫Redis
- MongoDB
- 【三十一】讀寫MongoDB
- MySQL
- 關于最重要的參數選項調整建議
- 索引,Explain優化工具
- 事務級別
- sql好的書寫習慣
- limit(分頁)
- 趕集網Mysql36條軍規
- 分庫分表技術演進&最佳實踐
- MariaDB 和 MySQL 全面對比
- 永遠不要在 MySQL 中使用“utf8”
- 看云--推薦的Mysql優化
- 完整、詳細的MySQL規范
- 慢查詢日志
- pt-query-digest結果分析
- Redis
- 看云-推薦的redis學習
- Memcache和Redis不同
- 阿里云Redis開發規范
- Centos7
- 虛擬機配置網絡
- 硬盤掛載、分區、文件大小
- 防火墻(firewalld、firewalld-cmd、systemctl、iptables)
- 兩個機器互相拷貝文件
- 查進程、查端口
- 壓縮、解壓
- 查看物理CPU個數、CPU內核數、線程數
- apt-get源--阿里
- RAID磁盤陣列
- Docker
- Dockerfile制作常用命令
- registry私有倉庫
- PHP_7.2
- Dockerfile
- php.ini
- 使用說明
- Nginx_1.15
- Dockerfile
- nginx.conf
- prod_nginx.conf
- 使用說明
- MySql_5.7
- Dockerfile
- my.cnf
- 使用說明
- redmine_3.4
- Dockerfile
- 使用說明
- gitlab-ce_11.9.6-ce.0
- 使用說明
- Redis_5.0
- Dockerfile
- redis.conf
- 使用說明
- Jenkins
- Dockerfile
- 使用說明
- webssh--python3.7
- Dockerfile
- 使用說明
- 進階使用
- 高階使用
- minio
- 使用說明
- aws_cloud9_ide
- 使用說明
- VNC
- 使用說明
- jdk1.8——yum安裝
- tomcat9——安裝
- guacamole——0.9.13
- libreoffice
- Dockerfile
- 使用說明
- Kubernetes
- kubectl常用命令
- 環境搭建(1.9.6)
- kubernetes1.9.6墻內離線部署
- kubernetes1.9.6單機器部署
- helm安裝
- helm常用命令
- Swoole
- 環境的搭建
- swoole的簡單實例
- 服務端的cli方式運行
- 客戶端的運行方式
- 定時任務的入門
- 刪除定時任務
- 初始化定時任務
- 日志管理
- 具體任務的異常捕獲
- 手動重啟shell腳本
- 閱讀感受
- 【讀書】登天的感覺——岳曉東
- 【讀書】為何家會傷人——武志紅
- 【感受】箭扣,一次就好
- 【讀書】思考與致富——拿破侖-希爾
- 【感受】做事講方法
- 【感受】未來暢想
- 【素材】智力問答
- 【百家】曾國藩家訓
- 【百家】正說和珅
- 【感受】談判小技巧
- 【讀書】股票作手回憶錄——利弗莫爾
- 【感受】最幸福的人——工匠
- 【收藏】土味情話大合集
- 【讀書】解憂雜貨店——東野圭吾
- 【收藏】家鄉名人
- 【讀書】把時間當作朋友——李笑來
- 【感受】輿論和八卦
- 【讀書】老人與海——海明威
- 【讀書】必然——凱文凱利
- 【經典】逍遙游——莊周
- Git+PHPStorm+Composer
- Git命令
- .gitignore忽略規則
- PHPStorm第一次使用
- PHPStorm關聯gitlab
- Composer修改鏡像源
- Xdebug
- PHP進階
- 緩存在高并發場景下的常見問題
- 一、緩存一致性問題
- 二、緩存并發問題
- 三、緩存穿透問題
- 四、緩存顛簸問題
- 五、緩存的雪崩現象
- 六、緩存無底洞現象
- Laravel源碼解析(知識點)
- 閉包、IOC容器服務綁定延遲加載
- 延遲靜態綁定基類
- 反射,依賴注入
- __callStatic 魔術方法,Facade 工作原理
- array_reduce,中間件解析
- Eloquent核心
- Laravel框架加載流程
- 線程、進程、協程
- Linux進程、線程、協程
- poll、epoll
- epoll原理
- Liunx線程調度算法
- 紅黑樹
- 同步/異步、阻塞/非阻塞
- PHP-FPM
- Nginx
- Swoole
- Go
- 驚群問題
- 線程模型比較
- 并發模型比較
- Lua
- OpenResty
- 數據一致性
- 悲觀鎖--VS--樂觀鎖
- 事務--mysql VS redis
- 事務嵌套--Doctrine VS Laravel
- 單體應用中執行順序問題
- 數據一致性問題描述
- 分布式理論
- 數據一致性---接口冪等性
- 分布式事務---2PC VS 3PC
- 分布式事務---TCC
- 分布式事務---基于消息
- 接口安全性
- PHP & Nginx
- 請求超時問題
- 兩者之間的通信原理
- TCP三次握手
- Nginx常用優化
- PHP數組底層原理
- PHP排序函數sort底層原理
- PHP函數---trim()
- 樹形數據在關系型庫中存儲
- 標簽(Tag)的各種設計