hadoop的組件yarn
YARN分佈式資源管理框架:
hadoop1.0
hadoop2.0
Scheduler :調度器(容量調度,公平調度。FIFO)
container:資源容器(抽象概念)
ApplicationsManager(job-submissions)
negotion the frist container for executing the application spectify ApplicationMaster(4次重啓(容錯),單個任務的管理者,資源申請者,追蹤狀態,監控任務)
resourcemanager:源碼
resourcemanager:nodemanager:心跳告訴resourcemanager資源彙報
nodemanager:負責當前節點的資源,接受appmaster resourcemanager的信息,resourcemanager資源彙報
appmaster:申請資源
container:資源抽象 1個切片 在nodemanager
10%冗餘(一個片最多容納148M數據)
scheduler:
applicationsManager
YARN的通信協議rpc
yarn:
resourcemanager
applicationmanager
applicationmaster(4次分配)
切片對應一個maptask container(資源容器)
reducetask
reduce的數量是由分區決定的
nodemanager
yarn的基本思想是將資源管理和作業調度/監視功能劃分爲單獨的守護進程。其思想是擁有一個全局ResourceManager (RM)和每個應用程序的ApplicationMaster (AM)。應用程序可以是單個作業,也可以是一組作業
ResourceManager和NodeManager構成數據計算框架。ResourceManager是在系統中的所有應用程序之間仲裁資源的最終權威。NodeManager是每臺機器的框架代理,負責監視容器的資源使用情況(cpu、內存、磁盤、網絡),並向ResourceManager/Scheduler報告相同的情況
每個應用程序ApplicationMaster實際上是一個特定於框架的庫,它的任務是與ResourceManager協商資源,並與NodeManager一起執行和監視任務
yarn的提交job的流程
ResourceMangager:管理nodemanger ,管理全局的資源,
Appmaster:對作業的調度做一個追蹤,作業的老大
Container:虛擬的管理資源,cpu ,內存,磁盤等。
[外鏈圖片轉存失敗(img-rfIIS95l-1568966471715)(1568966453289.png)]
1、基本架構
(1)組成:YARN 主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等組件構成
(2)ResourceManager作用
1)處理客戶端請求
2)監控NodeManager
3)啓動或監控ApplicationMaster
4)資源的分配與調度
(3)NodeManager作用
1)管理單個節點上的資源
2)處理來自ResourceManager的命令
3)處理來自ApplicationMaster的命令
(4)ApplicationMaster 作用
1)負責數據的切分
2)爲應用程序申請資源並分配給內部的任務
3)任務的監控與容錯
(5)Container :Container是YARN中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等。
解析:
第一步:客戶端機器,提交作業的機器,查看自己的yarn-site.xml裏的yarn-resourceManager.hostname,與ResourceManager通信,用的是RPC的方式。
1.首先客戶端機器(程序提交的機器,yarn 的客戶端程序)向ResourceMangaer提出申請運行一個mr的job
2.Resourcemanager接收到請求之後,給客戶端返回一個jobid,以及提交資源用的stagingdir的文件hdfs://xue01/tmp/hadoop-yarn/stagingdir
3.客戶端收到消息後,開始向hdfs://xue01/tmp/hadoop-yarn/stagingdi下提交mr程序的相關資源文件包括
(a)job.jar (b)job.conf(裏面有各種組件的配置信息) ©job.split (任務的切片信息)
4.然後客戶端再次通知resourceManager,job的資源文件提交完畢
5.RM將用戶的請求打包爲task,放置調度隊列,根據當前yarn的調度模式進行調度(YARN提供的三種任務調度策:FIFO Scheduler,Capacity Scheduler 和 Fair Scheduler)。
6.客戶端資源文件提交完畢,向RM申請運行applicationMaster(後續簡稱AM)。
7.然後ResourceManager得到請求,找了一臺nodeManager讓它開啓開啓AppMaster
8.那臺nodemanager 在resoucemanger的任務隊列中獲取到任務task,創建了contianer容器啓動Appmaster,然後去hdfs://xue01/tmp/hadoop-yarn/stagingdir下載資源文件
9.Appmaster再向Resourecmanager申請Maptask運算的資源(就是其他節點上運行任務的container)
10.RM將請求再打包爲task放置調度隊列
11.其它nodeManger獲取到maptask後會再創建contianer容器並去hdfs://xue01/tmp/hadoop-yarn/stagingdir下載資源文件,contianer中的mapTask任務由AM負責監控和調度。
12.Appmaster向maptask(就是nodemanager開啓的container)發送程序啓動命令,
13.除了有Appmaster外的,contianer運行mapTask
14.當各節點mapTask運行完畢後,Appmaster再向ResourceManager申請運行reduceTask容器,resourcemanager將請求再打包爲task放置調度隊列。
15.其它NM獲取到task後會再創建contianer容器並下載資源文件,contianer中的reduceTask任務由AM負責監控和調度。
16.Appmaster向reducetask(就是nodemanager開啓的container)發送程序啓動命令,先去maptask執行完放結果的地方拉取屬於自己的數據,然後再進行運算
17.程序運行完成後,AM向RM註銷自己。讓RM回收所有的資源。
切片:
(client來執行、inputformat---->getspilts()–>不同輸入文件有不同的實現)
10%冗餘(文本類型)
數據庫中(大概130行一個分片)
查找數據類型:
文件類型:
數據庫:
壓縮 文件(不可切割的文件)直接添加片
查看源碼創建分片信息的集合splits,用於存放分片信息
遍歷目錄下文件
FileInputFormat.setInputDirRecursive(job,true);//遞歸遍歷
循環取出每一個文件,然後做如下操作
獲取文件大小及位置
計算每個分片的大小
FileInputFormat.setMaxInputSplitSize(job,100);
FileInputFormat.setMinInputSplitSize(job,1);
long minSize = Math.max(getFormatMinSplitSize()//1
, getMinSplitSize(job));//配置文件中可設置
long maxSize = getMaxSplitSize(job);//可在運行時指定-D mapreduce.input.fileinputformat.split.maxsize=300M,默認是long的最大值
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
return Math.max(minSize, Math.min(maxSize, blockSize));
判斷文件是否可以分片(壓縮格式有的可以進行分片,有的不可以,)
剩餘文件的大小/分片大小>1.1時,循環執行封裝分片信息的方法,具體如下
封裝一個分片信息(包含文件的路徑,分片的起始偏移量,要處理的大小,分片包含的塊的信息,分片中包含的塊存在哪兒些機器上)
剩餘文件的大小/分片大小<=1.1且 不等於0時,封裝一個分片信息(包含文件的路徑,分片的起始偏移量,要處理的大小,分片包含的塊的信息,分片中包含的塊存在哪兒些機器上)
分片的注意事項:1.1倍的冗餘。260M文件分幾個片?
考慮Hadoop應用處理的數據集比較大,因此需要藉助壓縮。按照效率從高到低排列的
(1)使用容器格式文件,例如:順序文件、RCFile、Avro數據格式支持壓縮和切分文件。另外在配合使用一些快速壓縮工具,例如:LZO、LZ4或者Snappy.
(2)使用支持切分壓縮格式,例如gzip2
(3)在應用中將文件切分成塊,對每塊進行任意格式壓縮。這種情況確保壓縮後的數據庫接近HDFS塊大小。
(4)存儲未壓縮文件,以原始文件存儲。
讀取分片的細節:如果有多個分片
- 第一個分片讀到末尾再多讀一行
- 既不是第一個分片也不是最後一個分片第一行數據捨棄,末尾多讀一行
- 最後一個分片捨棄第一行,末尾多讀一行
client appmaster
MapReduce: setup僅在map函數執行之前執行一次(適用於初始化和表頭)
map階段求總人數(傳遞,跨節點傳遞 )
後的數據庫接近HDFS塊大小。
(4)存儲未壓縮文件,以原始文件存儲。
讀取分片的細節:如果有多個分片
- 第一個分片讀到末尾再多讀一行
- 既不是第一個分片也不是最後一個分片第一行數據捨棄,末尾多讀一行
- 最後一個分片捨棄第一行,末尾多讀一行
client appmaster
MapReduce: setup僅在map函數執行之前執行一次(適用於初始化和表頭)
map階段求總人數(傳遞,跨節點傳遞 )
cleanup僅在所有map函數執行之後執行一次(適用於關閉對象,關閉流)