面試題: Yarn的工作流程
MR 架構設計
一定數量的cpu+memory
RM:(Applications Manager+Scheduler)
Applications Manager:應用程序管理器,應用程序管理器負責管理整個系統中所有應用程序,包括應用程序提交、與調度器協商資源以啓動AM、監控AM運行狀態並在失敗時重新啓動等,跟蹤分給的Container的進度、狀態也是其職責。
Scheduler:先進先出調度器,計算調度器,公平調度器。
調度器根據容量、隊列等限制條件(如每個隊列分配一定的資源,最多執行一定數量的作業等),將系統中的資源分配給各個正在運行的應用程序。調度器僅根據各個應用程序的資源需求進行資源分配,而資源分配單位是Container,從而限定每個任務使用的資源量。Shceduler不負責監控或者跟蹤應用程序的狀態,也不負責任務因爲各種原因而需要的重啓(由ApplicationMaster負責)。總之,調度器根據應用程序的資源要求,以及集羣機器的資源情況,爲應用程序分配封裝在Container中的資源。
調度器是可插拔的,例如CapacityScheduler、FairScheduler。
NM:
NM是每個節點上的資源和任務管理器。它會定時地向RM彙報本節點上的資源使用情況和各個Container的運行狀態;同時會接收並處理來自AM的Container啓動/停止等請求。
APP MASTER:一個job只有一個,相當於主程序(spark driver)
用戶提交的應用程序job均包含一個AM,負責應用的監控,跟蹤應用執行狀態,重啓失敗任務等。ApplicationMaster是應用框架,它負責向ResourceManager協調資源,並且NodeManager協同工作完成Task的執行和監控。MapReduce就是原生支持的一種框架,可以在YARN上運行Mapreduce作業。有很多分佈式應用都開發了對應的應用程序框架,用於在YARN上運行任務,例如Spark,Storm等。如果需要,我們也可以自己寫一個符合規範的YARN application。
Yarn平臺一般運行job>=0
Contariner:運行在NM上。
是YARN中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等,當AM向RM申請資源時,RM爲AM返回的資源便是用Container 表示的。 YARN會爲每個任務分配一個Container且該任務只能使用該Container中描述的資源。
離開安全模式:
hdfs dfsadmin -safemode leave
刪除已有的/wordcount目錄下的所有文件:
hdfs dfs -rm -r /wordcount
重新創建:
hdfs dfs -mkdir -p /wordcount/input
將準備好的文件上傳到/input:
hdfs dfs -put HBinz.log /wordcount/input
(1)yarn jar /opt/software/hadoop-2.8.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar wordcount /wordcount/input /wordcount/output1
(2)發現running錯了,如何通過命令停止
yarn application -list
yarn application -kill application_1534945138947_0003
同時,執行的頁面也會返回結果「job被kill掉」
yarn application -list
yarn application -kill appId
yarn jar
1:用戶向YARN中提交應用程序,其中包括ApplicationMaster程序、啓動ApplicationMaster的命令、用戶程序等。
2:ResourceManager爲該應用程序分配第一個Container,並與對應的Node-Manager通信,要求它在這個Container中啓動應用程序的ApplicationMaster。
3:ApplicationMaster首先向ResourceManager註冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態,然後它將爲各個任務申請資源,並監控它的運行狀態,直到運行結束,即重複步驟4~7。
4:ApplicationMaster採用輪詢的方式通過RPC協議向ResourceManager申請和領取資源。
5:一旦ApplicationMaster申請到資源後,便與對應的NodeManager通信,要求它啓動任務。
6:NodeManager爲任務設置好運行環境(包括環境變量、JAR包、二進制程序等)後,將任務啓動命令寫到一個腳本中,並通過運行該腳本啓動任務。
7:各個任務通過某個RPC協議向ApplicationMaster彙報自己的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務。在應用程序運行過程中,用戶可隨時通過RPC向ApplicationMaster查詢應用程序的當前運行狀態。
8:應用程序運行完成後,ApplicationMaster向ResourceManager註銷並關閉自己。
簡而言之:
當用戶向 YARN 中提交一個應用程序後, YARN 將分兩個階段運行該應用程序:
a. 第一個階段是啓動ApplicationMaster;
b. 第二個階段是由ApplicationMaster創建應用程序,爲它申請資源,並監控它的整個運行過程,直到運行完成。
先進先出調度器:FIFO
在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中 ResourceManager中的調度器負責資源的分配,而NodeManager則負責資源的供給和隔離。
ResourceManager將某個NodeManager上資源分配給任務(這就是所謂的 資 源調 度)後,NodeManager需按照要求爲任務提供相應的資源,甚至保證這些資源應具有獨佔性,爲任務運行提供基礎的保證,這就是所謂的資源隔離。
基於以上考慮,YARN允許用戶配置每個節點上可用的物理內存資源,注意,這裏是「可用的」,因爲一個節點上的內存會被若干個服務共享,比如一部分給YARN,一部分給HDFS,一部分給HBase等,YARN配置的只是自己可以使用的,配置參數如下:
(1) yarn.nodemanager.resource.memory- - mb
表示該節點上YARN可使用的物理內存總量,默認是8192(MB),注意,如果你的節點內存資源不夠8GB,則需要調減小這個值,而YARN不會智能的探測節點的物理內存總量。
(2) yarn.nodemanager.vmem- - pmem- - ratio
任務每使用1MB物理內存,最多可使用虛擬內存量,默認是2:1。
(3) yarn.nodemanager.pmem- - check- - enabled
是否啓動一個線程檢查每個任務正使用的物理內存量,如果任務超出分配值,則直接將其殺掉,默認是true。
(4) yarn.nodemanager.vmem- - check- - enabled
是否啓動一個線程檢查每個任務正使用的虛擬內存量,如果任務超出分配值,則直接將其殺掉,默認是true。
(5) yarn.scheduler.minimum- - allocation- - mb
單個任務可申請的最少物理內存量,默認是1024(MB),如果一個任務申請的物理內存量少於該值,則該對應的值改爲這個數。
(6) yarn.scheduler.maximum- - allocation- - mb
單個任務可申請的最多物理內存量,默認是8192(MB)。
CPU的主要配置參數:
(1) yarn.nodemanager.resource.cpu- - vcores
表示該節點上YARN可使用的虛擬CPU個數,默認是4,注意,目前推薦將該值設值爲與物理CPU核數數目相同。如果你的節點CPU核數不夠4個,則需要調減小這個值,而YARN不會智能的探測節點的物理CPU總數。
(2 )yarn.scheduler.minimum- - allocation- - vcores
單個任務可申請的最小虛擬CPU個數,默認是1,如果一個任務申請的CPU個數少於該數,則該對應的值改爲這個數。
(3 )yarn.scheduler.maximum- - allocation- - vcores
單個任務可申請的最多虛擬CPU個數,默認是32。
默認情況下,YARN是不會對CPU資源進行調度的,你需要配置相應的資源調度器。
(1)計算及時性要求比較高: memory不夠 快速出結果 cpu足夠的
(2)反正:cpu不夠
5分鐘出1個job : job運行1分鐘oom memory+2G 在計算只需1分鐘,比如在第4分鐘完成
CDH 動態資源池
生產場景總結:
memory不夠 cpu夠 : oom錯誤 作業停止(memory不夠的話,會停止作業,進而增加memory,由於cpu足夠,所以計算快)
memory夠 cpu不夠: 作業慢(由於memory夠,因此會低cpu執行,所以會計算慢)
因爲內存或者cpu不夠修改過以上配置後,記得要重啓yarn!!!