
🏃? HDFS
🏊? HDFS的組成架構:
這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode,下面我們分別介紹這四個組成部分,
1)Client:就是客戶端,
? (1)檔案切分,檔案上傳HDFS的時候,Client將檔案切分成一個一個的Block,然后進行存盤;
? (2)與NameNode互動,獲取檔案的位置資訊;
? (3)與DataNode互動,讀取或者寫入資料;
? (4)Client提供一些命令來管理HDFS,比如啟動或者關閉HDFS;
? (5)Client可以通過一些命令來訪問HDFS;
2)NameNode:就是Master,它是一個主管、管理者,
? (1)管理HDFS的名稱空間;
? (2)管理資料塊(Block)映射資訊;
? (3)配置副本策略;
? (4)處理客戶端讀寫請求,
3)DataNode:就是Slave,NameNode下達命令,DataNode執行實際的操作,
? (1)存盤實際的資料塊;
? (2)執行資料塊的讀/寫操作,
4)Secondary NameNode:并非NameNode的熱備,當NameNode掛掉的時候,它并不能馬上替換NameNode并提供服務,
? (1)輔助NameNode,分擔其作業量;
? (2)定期合并Fsimage和Edits,并推送給NameNode;
? (3)在緊急情況下,可輔助恢復NameNode,
HDFS檔案塊的大小怎么設定?
為什么塊的大小不能太大也不能太小,
1、HDFS的塊設定太小,會增加尋址時間,程式一直在找塊的開始位置,
2、如果塊設定太大,從磁盤傳輸資料的時間會明顯大于定位這個塊開始位置所需的時間,導致程式在處理這塊資料時,會非常慢,
HDFS塊的大小設定主要取決于磁盤傳輸速率,
1)NameNode啟動
(1)第一次啟動NameNode格式化后,創建Fsimage和Edits檔案,如果不是第一次啟動,直接加載編輯日志和鏡像檔案到記憶體,
(2)客戶端對元資料進行增刪改的請求,
(3)NameNode記錄操作日志,更新滾動日志,
(4)NameNode在記憶體中對元資料進行增刪改,
2)Secondary NameNode作業
(1)Secondary NameNode詢問NameNode是否需要CheckPoint,直接帶回NameNode是否檢查結果,
(2)Secondary NameNode請求執行CheckPoint,
(3)NameNode滾動正在寫的Edits日志,
(4)將滾動前的編輯日志和鏡像檔案拷貝到Secondary NameNode,
(5)Secondary NameNode加載編輯日志和鏡像檔案到記憶體,并合并,
(6)生成新的鏡像檔案fsimage.chkpoint,
(7)拷貝fsimage.chkpoint到NameNode,
(8)NameNode將fsimage.chkpoint重新命名成fsimage,
HDFS寫入流程
? 1)客戶端通過Distributed FileSystem模塊向NameNode請求上傳檔案,NameNode檢查目標檔案是否已存在,父目錄是否存在,
? 2)NameNode回傳是否可以上傳,
? 3)客戶端請求第一個 block上傳到哪幾個datanode服務器上,
? 4)NameNode回傳3個datanode節點,分別為dn1、dn2、dn3,
? 5)客戶端通過FSDataOutputStream模塊請求dn1上傳資料,dn1收到請求會繼續呼叫dn2,然后dn2呼叫dn3,將這個通信管道建立完成,
? 6)dn1、dn2、dn3逐級應答客戶端,
? 7)客戶端開始往dn1上傳第一個block(先從磁盤讀取資料放到一個本地記憶體快取),以packet為單位,dn1收到一個packet就會傳給dn2,dn2傳給dn3;
dn1每傳一個packet會放入一個應答佇列等待應答,
? 8)當一個block傳輸完成之后,客戶端再次請求NameNode上傳第二個block的服務器,
HDFS讀取流程
1)客戶端通過Distributed FileSystem向NameNode請求下載檔案,NameNode通過查詢元資料,找到檔案塊所在的DataNode地址,
2)挑選一臺DataNode(就近原則,然后隨機)服務器,請求讀取資料,
3)DataNode開始傳輸資料給客戶端(從磁盤里面讀取資料輸入流,以packet為單位來做校驗),
4)客戶端以packet為單位接收,先在本地快取,然后寫入目標檔案,
🏃? MapReduce
🏊? MapReduce的Shuffle程序
1)Map方法之后Reduce方法之前這段處理程序叫Shuffle
2)Map方法之后,資料首先進入到磁區方法,把資料標記好磁區,然后把資料發送到環形緩沖區;環形緩沖區默認大小100m,環形緩沖區達到80%時,進行溢寫;溢寫前對資料進行排序,排序按照對key的索引進行字典順序排序,排序的手段快排;溢寫產生大量溢寫檔案,需要對溢寫檔案進行歸并排序;對溢寫的檔案也可以進行Combiner操作,前提是匯總操作,求平均值不行,最后將檔案按照磁區存盤到磁盤,等待Reduce端拉取,
3)每個Reduce拉取Map端對應磁區的資料,拉取資料后先存盤到記憶體中,記憶體不夠了,再存盤到磁盤,拉取完所有資料后,采用歸并排序將記憶體和磁盤中的資料都進行排序,在進入Reduce方法前,可以對資料進行分組操作,
🏊? MapTask作業機制
MapTask有以下幾個階段:Read、Map,Collect、Spill、Combine
(1)Read階段:MapTask通過用戶撰寫的RecordReader,從輸入InputSplit中決議出一個個key/value,
(2)Map階段:該節點主要是將決議出的key/value交給用戶撰寫map()函式處理,并產生一系列新的key/value,
(3)Collect收集階段:在用戶撰寫map()函式中,當資料處理完成后,一般會呼叫OutputCollector.collect()輸出結果,在該函式內部,它會將生成的key/value磁區(呼叫Partitioner),并寫入一個環形記憶體緩沖區中,
(4)Spill階段:即“溢寫”,當環形緩沖區滿后,MapReduce會將資料寫到本地磁盤上,生成一個臨時檔案,需要注意的是,將資料寫入本地磁盤之前,先要對資料進行一次本地排序,并在必要時對資料進行合并、壓縮等操作,
? 溢寫階段詳情:
? 步驟1:利用快速排序演算法對快取區內的資料進行排序,排序方式是,先按照磁區編號Partition進行排序,然后按照key進行排序,這樣,經過排序后,資料以磁區為單位聚集在一起,且同一磁區內所有資料按照key有序,
? 步驟2:按照磁區編號由小到大依次將每個磁區中的資料寫入任務作業目錄下的臨時檔案output/spillN.out(N表示當前溢寫次數)中,如果用戶設定了Combiner,則寫入檔案之前,對每個磁區中的資料進行一次聚集操作,
? 步驟3:將磁區資料的元資訊寫到記憶體索引資料結構SpillRecord中,其中每個磁區的元資訊包括在臨時檔案中的偏移量、壓縮前資料大小和壓縮后資料大小,如果當前記憶體索引大小超過1MB,則將記憶體索引寫到檔案output/spillN.out.index中,
(5)Combine階段:當所有資料處理完成后,MapTask對所有臨時檔案進行一次合并,以確保最終只會生成一個資料檔案,
? 當所有資料處理完后,MapTask會將所有臨時檔案合并成一個大檔案,并保存到檔案output/file.out中,同時生成相應的索引檔案output/file.out.index,
? 在進行檔案合并程序中,MapTask以磁區為單位進行合并,對于某個磁區,它將采用多輪遞回合并的方式,每輪合并io.sort.factor(默認10)個檔案,并將產生的檔案重新加入待合并串列中,對檔案排序后,重復以上程序,直到最終得到一個大檔案,
? 讓每個MapTask最終只生成一個資料檔案,可避免同時打開大量檔案和同時讀取大量小檔案產生的隨機讀取帶來的開銷,
🏊? ReduceTask作業機制
MapTask有以下幾個階段:Copy,Merge,Sort,Reduce
(1)Copy階段:ReduceTask從各個MapTask上遠程拷貝一片資料,并針對某一片資料,如果其大小超過一定閾值,則寫到磁盤上,否則直接放到記憶體中,
(2)Merge階段:在遠程拷貝資料的同時,ReduceTask啟動了兩個后臺執行緒對記憶體和磁盤上的檔案進行合并,以防止記憶體使用過多或磁盤上檔案過多,
(3)Sort階段按照MapReduce語意,用戶撰寫reduce()函式輸入資料是按key進行聚集的一組資料,為了將key相同的資料聚在一起,Hadoop采用了基于排序的策略,由于各個MapTask已經實作對自己的處理結果進行了區域排序,因此,ReduceTask只需對所有資料進行一次歸并排序即可,
(4)Reduce階段reduce()函式將計算結果寫到HDFS上,
🏃?Yarn
🏊? MR作業提交Yarn全程序
(1)作業提交
第1步:Client呼叫job.waitForCompletion方法,向整個集群提交MapReduce作業,
第2步:Client向RM申請一個作業id,
第3步:RM給Client回傳該job資源的提交路徑和作業id,
第4步:Client提交jar包、切片資訊和組態檔到指定的資源提交路徑,
第5步:Client提交完資源后,向RM申請運行MrAppMaster,
(2)作業初始化
第6步:當RM收到Client的請求后,將該job添加到容量調度器中,
第7步:某一個空閑的NM領取到該Job,
第8步:該NM創建Container,并產生MRAppmaster,
第9步:下載Client提交的資源到本地,
(3)任務分配
第10步:MrAppMaster向RM申請運行多個MapTask任務資源,
第11步:RM將運行MapTask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務并創建容器,
(4)任務運行
第12步:MR向兩個接收到任務的NodeManager發送程式啟動腳本,這兩個NodeManager分別啟動MapTask,MapTask對資料磁區排序,
第13步:MrAppMaster等待所有MapTask運行完畢后,向RM申請容器,運行ReduceTask,
第14步:ReduceTask向MapTask獲取相應磁區的資料,
第15步:程式運行完畢后,MR會向RM申請注銷自己,
🏊?Yarn的默認調度器、調度器分類、以及他們之間的區別
調度器重要分為三類:FIFO 、Capacity Scheduler(容量調度器)和Fair Sceduler(公平調度器)
區別:
FIFO調度器:先進先出,同一時間佇列中只有一個任務在執行,
容量調度器:多佇列;每個佇列內部先進先出,同一時間佇列中只有一個任務在執行,佇列的并行度為佇列的個數,
公平調度器:多佇列;每個佇列內部按照缺額大小分配資源啟動任務,同一時間佇列中有多個任務執行,佇列的并行度大于等于佇列的個數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298906.html
標籤:其他
