01 我們一起學大資料
大家好,今天分享的是大資料YRAN的核心知識點,老劉儘量用通俗易懂的話來講述YARN知識點,爭取做到大家看完後能夠用口語化的形式將它們表達出來,做到真正的看完就會!(如果覺得老劉寫的不錯,給老劉點個贊)
02 YARN核心知識點
第1點:什麼是YARN?
YARN是Hadoop架構中的資源排程引擎模組,從這個模組名字就可以看出來,YARN是用來為應用提供資源管理和排程的。
類似於HDFS,YARN也是經典的主從架構。架構的內容放在第2點講,如果面試介紹YARN的話,老劉建議第一點和第二點一起講。
第2點:YRAN架構
先看這張架構圖,就可以知道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常用命令
啟動YARN start-yarn.sh 停止RM和NM stop-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知識點就講的差不多了,老劉儘量用通俗易懂的口語化形式將這些知識點表達出來了,希望能夠對大資料感興趣的同學有幫助,也希望能夠得到大佬們的批評和指點。
覺得老劉寫的不錯的,給老劉點個贊吧!
最後,有事,聯絡公眾號:努力的老劉;沒事,就和老劉一起學大資料。