01 我們一起學大數據
大家好,今天分享的是大數據YARN的核心知識點,老劉儘量用通俗易懂的話來講述YARN知識點,爭取做到大家看完後能夠用口語化的形式將它們表達出來,做到真正的看完就會!(如果覺得老劉寫的不錯,給老劉點個讚)
02 YARN核心知識點
第1點:什麼是YARN?
YARN是Hadoop架構中的資源調度引擎模塊,從這個模塊名字就可以看出來,YARN是用來為應用提供資源管理和調度的。
類似於HDFS,YARN也是經典的主從架構。架構的內容放在第2點講,如果面試介紹YARN的話,老劉建議第一點和第二點一起講。
第2點:YARN架構
先看這張架構圖,就可以知道YARN是非常典型的主從架構。YARN由一個ResourceManager(RM)和多個NodeManager(NM)構成,RM是主節點,NM是從節點。
什麼是ResourceManager?
RM是一個全局的資源管理器,集群只有一個,它主要負責整個系統的資源管理和分配,啟動監控ApplicationMaster,監控NodeManager以及資源的分配和調度。
RM主要由兩個組件構成:調度器和應用程式管理器。
什麼是調度器(Scheduler)?
調度器就是根據容量 、隊列一些限制條件,將系統中的資源分配給各個正在運行的應用程式,這裡有一句話想說,調度器是一個純調度器,就是它只管資源分配,不參與具體應用程式相關的工作。
什麼是應用程式管理器(ApplicationMaster)?
應用程式管理器它主要負責監控管理整個系統的所有應用程式,同時負責向RM申請資源、返還資源等。
什麼是NodeManager?
NodeManager是一個從服務,整個集群有多個。它負責接收RM的資源分配請求,分配具體的Container給應用,它也負責監控並報告Container的使用信息給RM。
什麼是Contaienr?
Container是yarn中分配資源的一個單位,包括內存、CPU等資源,YARN以Container為單位分配資源。
第3點:YARN應用提交過程
老劉這裡簡單講講YARN的應用提交過程,主要想講的是MapReduce On Yarn這個內容。
根據上面的圖,就可以看出來YARN的應用提交過程。
第一步是用戶將應用程式提交到 ResourceManager 上;
第二步是ResourceManager為應用程式 ApplicationMaster 申請資源,並與某個 NodeManager 通信啟動第一個 Container,以啟動ApplicationMaster;
第三步是ApplicationMaster 與 ResourceManager 註冊進行通信,為內部要執行的任務申請資源,一旦得到資源後,就會和 NodeManager 通信,從而啟動對應的 Task;
第四步是所有任務運行完成後,ApplicationMaster會向 ResourceManager 進行註銷,整個應用程式就運行結束了。
下面就是重點內容,詳細講講MapReduce On Yarn。
第4點:MapReduce On Yarn
這一點,很重要,第3點就是說說了皮毛,第4點是詳細的描述整個過程,老劉儘量講的通俗易懂點,MapReduce On Yarn運行過程如下:
1、先把程序打成Jar包,接著客戶端運行hadoop jar命令,就會把job提交到集群中運行。在這個過程中,程序裡的job.waitForCompletion()會調用Job裡的submit()方法。
2、接著會遠程調用ResourceManager的getId,就會得到一個MR作業的id。同時也會檢查輸出目錄是否存在,如果沒有指定輸出目錄或者目錄已經存在,就會報錯;也會計算作業分片,若無法計算分片,也會報錯。
3、接下裡,會把Job相關的配置文件,jar包,分片信息,上傳到HDFS。
4、客戶端將應用程式提交給RM,任務開始真正運行。
5、當RM收到任務提交的通知後,它會與指定的NodeManager通信,通知NodeManager啟動容器,NodeManager會創建佔據特定資源的Container,並且在這個Container中運行MRAppMaster進程。
6、MRAppMaster進程會初始化job,創建多個簿記對象,記錄各map任務,reduce任務的進度信息,狀態信息。
這裡面的簿記對象要說一下,很多地方都沒解釋它是什麼,就一筆忽略,在老劉看來這就有點不太好。
老劉搜了一下後,是這樣介紹的:MapReduce 作業的 application master 是一個 Java 應用,它的主類是 MRAppMaster。它通過創建一定數量的簿記對象(bookkeeping object)跟蹤作業進度來初始化作業,該簿記對象接受任務報告的進度和完成情況。
7、AppMaster接下裡要啟動Task任務了,但它不知道啟動多少個map task以及在哪個節點上啟動等信息,所以這個時候AppMaster就需要從HDFS獲取分片信息之類的。
8、獲取完信息,就要開始分配任務了,AppMaster會為了每個任務向RM請求資源分配Container。RM收到消息後,會進行資源的計算,計算什麼資源呢?一般是為map任務、reduce任務分配多大內存啊,幾個虛擬內核之類的啊。
這一步老劉想說的是在看資料中,大家可以嘗試反問下自己,比如就這個它會計算資源,你可以問問自己,它計算什麼資源,這對自身進步有很大幫助。
9、AppMaster收到這些計算資源信息的返回結果後,就會與NodeManager通信,NodeManager就會啟動一個JVM(容器)。
10、但是在容器中運行任務(YarnChild)之前,會將運行任務需要的資源拉取到本地(jar包,配置文件,分布式緩存文件)。
11、任務運行。
老劉儘量用口語化的形式表達出來了,希望大家能夠記住它。
第5點:YARN應用生命周期
1、Client向RM提交應用,包括AM程序及啟動AM的命令。
2、RM為AM分配第一個容器,並與對應的NM通信,令其在容器上啟動應用的AM。
3、AM啟動時向RM註冊,允許Client向RM獲取AM信息然後直接和AM通信。
4、AM通過資源請求協議,為應用協商容器資源。
5、如容器分配成功,AM要求NM在容器中啟動應用,應用啟動後可以和AM獨立通信。
6、應用程式在容器中執行,並向AM匯報。
7、在應用執行期間,Client和AM通信獲取應用狀態。
8、應用執行完成,AM向RM註銷並關閉,釋放資源。
第6點:YARN常用命令
啟動YARNstart-yarn.sh停止RM和NMstop-yarn.sh查看正在運行的任務yarn application -list殺掉正在運行任務yarn application -kill 任務id查看節點列表yarn node -list第7點:YARN調度器
大家先想想為什麼需要調度器?在現實生活中,絕對會遇到同時提交任務的場景,那這個時候到底如何分配資源滿足這些任務呢?誰先執行呢?都是有講究的!
所以在Yarn框架中,調度器是一塊很重要的內容。有了合適的調度規則,就可以保證多個應用可以在同一時間有條不紊的工作。
YARN中最原始的調度規則是FIFO,就是誰先提交任務誰先執行。但是這樣很可能會導致兩種情況:① 一個大任務獨佔資源,其他的資源需要不斷的等待大任務完成;② 一堆小任務佔用資源,大任務一直無法得到適當的資源。所以FIFO雖然很簡單,但是並不能滿足我們的需求。
所以在YARN中現在有三種調度器可以選擇:FIFO Scheduler ,Capacity Scheduler,FairS cheduler。
FIFO Scheduler是把應用按提交的順序排成一個隊列,這是一個先進先出隊列,在進行資源分配的時候,先給隊列中第一個應用進行分配資源,等到第一個的應用需求滿足後再給第二個分配。
FIFO Scheduler是最簡單也是最容易理解的調度器,也不需要任何配置,但它的缺點剛剛也說了。大的應用可能會佔用所有集群資源,這就導致其它應用被阻塞。所以如果在共享的集群中,更適合採用Capacity Scheduler或Fair Scheduler。
對於Capacity調度器,它會有一個專門的隊列用來運行小任務,但是為小任務專門設置一個隊列會預先佔用一定的集群資源,這就導致大任務的執行時間會落後於使用FIFO調度器時的時間。
但是在Fair調度器中,我們不需要預先佔用一定的系統資源,Fair調度器會為所有運行的job動態的調整系統資源。當第一個大job提交時,這時只有這一個job在運行,此時它獲得了所有集群資源;當第二個小任務提交後,Fair調度器會分配一半資源給這個小任務,讓這兩個任務公平的共享集群資源。小任務執行完成之後就會釋放自己佔用的資源,大任務又獲得了全部的資源,這樣就保證了Fair調度器既得到了高的資源利用率又能保證小任務的及時完成。
03 總結
好啦,YARN知識點就講的差不多了,老劉儘量用通俗易懂的口語化形式將這些知識點表達出來了,希望能夠對大數據感興趣的同學有幫助,也希望能夠得到大佬們的批評和指點。
覺得老劉寫的不錯的,給老劉點個讚吧!