1. 程式人生 > >大資料開發之Hadoop篇----YARN設計架構

大資料開發之Hadoop篇----YARN設計架構

1,Yarn架構設計

在hadoop當中無論是hdfs還是yarn都是服從主從設計的架構的,就是一個主節點用於管理整個叢集,而一堆的從節點就是實際工作者了。而在yarn當中,主節點程序為ResourceManager,從節點程序為NodeManager。我們簡單回顧一下提交作業到yarn上面的流程,client先將作業提交的RM上的ApplicationManager,ApplicationManager根據需求分配一個container給這個作業,同時ApplicationManager向對應的NM進行rpc通訊要求其啟動一個container並在裡面放置這個作業相關的ApplicationMaster程式,隨後ApplicationMaster反向向ApplicationManager進行註冊,並想ResourceScheduler申請資源列表,當ApplicationMaster拿到資源列表後就向相關的NM通訊要求啟動container給task進行執行。

那麼這裡當container是個什麼東西呢?我們可以將它當作一個容器,裝的是我們機器上的資源,比如:cpu,記憶體,磁碟等。由於在作業運算的過程當中,一個NM中可能不止一個task需要運算,不同task需要不同的資源,為了避免task之間的資源上的混亂,我們使用container來承載一個task同時這個container也將封裝起這個task所需要的資源。所以我們就這麼理解吧,container是一個資源的抽象封裝好了。

2,yarn的常用命令

我們直到hadoop jar是提交一個jar包到yarn上面去執行的。那麼也存在這樣的命令yarn jar用於提交jar到yarn上執行,這兩個命令是一樣的。用於對當下執行的作業進行管理的命令也又兩個:yarn application 和 mapred job 一般在生產上面我們都是使用前者,因為能在yarn上面跑的可不止mapred,還有什麼spark等等。

3,yarn上的調優

既然container是yarn上面對資源的封裝,那麼我們對yarn的調優其實就是對container上一些細節進行優化了唄。

記憶體:

這裡我先給出三個引數:yarn.nodemanager.resource.memory-mb,yarn.scheduler.minimum-allocation-mb,yarn.scheduler.maximum-allocation-mb。

現在我假設我的這個節點上的記憶體有48G,其中25%是要給Linux的,而剩餘的75%給大資料程序。其中,我們一般習慣把DN和NM放置在同一個機器上(資料本地化)。預設的DN是給到4個G,而NM是給到3個G,這兩個引數分別是在hadoop-env.sh和yarn-env.sh兩個shell腳本當中設定(這個引數以後我們再具體地來講)。

通過上面的設定,我們現在還剩多少個G的記憶體可以用呢?48*0.75-4-3=29G,也就是說我們的容器contanier最多也就可以有29個G了,這個時候你要考慮的是這29個G是否都要全給container使用呢?這個引數就是上面我所給出的三個引數的第一個引數: yarn.nodemanager.resource.memory-mb,當這個引數設定成剩餘全部記憶體時意味著我們的NM在執行tasks的時候可以使用到29個G。而第二個引數所決定的是單一一個contnaier最小將分配多少的G,我們生產上一般是設定成2個G,要是你機器上剩餘的記憶體達不到2個G就不再在這個機器上開啟container了。而最後一個引數是設定單一個container的最大記憶體分配,為什麼要這樣設定呢?因為當一個container開啟以後,在上面放置的task不是一下子就使用到最大記憶體極限的,一般會先個2個G(就是最小記憶體限制),如果不夠了就是繼續增加,再不夠再增,直到最大記憶體限制,還不夠就報錯。所以最大記憶體設定一般和整個節點的contanier可用記憶體設定是一樣大的,這樣當一個contanier佔用了大部分資源時,如果再來一個container萬一不夠記憶體就糟了。

當記憶體超出的時候,我們也可以設定兩個引數來控制自動將這個記憶體超出的程序殺死,然後讓ApplicationMaster再行分配其他節點上的container給他,yarn.nodemanager.pmen-check-enable 和 yarn.nodemanager.vmen-check-enable,將這兩個引數都設定成true就可以了。

cpu:

vcore:虛擬cpudcoure yarn自己引入的新概念,因為不同的物理core的效能不同,所以為了是的每個core的計算能力能一致點,這個時候設定了一個vcore。

一般1個物理core對應2個vcore,當然也有寫公司是1:1的。

而cpu同樣也有三組引數:yarn.nodemanager.resource.cpu-vcores,yarn.scheduler.minimum-allocation-vcores 和 yarn.scheduler.maximum-allocation-vcores,三組預設值分別是8,1,8。假如:你的物理core是8個話,你要考慮究竟要個多少個core給大資料使用,如果是給了6個core預留2個core給其他程序,這樣你的vcore將有12個。

4,yarn的排程器

當我們同時提交兩個job到yarn上面的時候,yarn的排程器是怎麼執行。分為三種情況:a,佇列式的先進先出,當你先後提交了兩個job到lyarn上的時候,無論時間上的差異是多少,yarn都是將所有的資源先給第一個job讓其完成後才開始第二個job的執行。b,計算模式下,yarn在計算的時候會事先預留一定的資源出來,無論你是否提交了多個job,第一個需求資源較多的job將使用主要的資源,但是這個時候也同時有一定的資源被閒置下來,當有其他的job被提交時才使用這部分資源來計算(這個模式下在多工時可能還好,但是在單個job的時候將浪費了一定的資源)。c,這中是公平式的資源分配,也是我們在生產上常用的模式。合理分配資源給正在執行的所有job,如果只有一個job的時候,那麼這個job就佔用所有的資源,如果job的數量不止兩個的時候就公平分配唄,直到有一個job先完成了。