MR的分片机制
分片機制
分片簡介
Hadoop將MapReduce的MapReduce的輸入數據劃分為等長的小數據塊,稱之為輸入分片(inputSpilt)或者簡稱“分片”Hadoop為為一個分片構建一個單獨的map任務,并由該任務來運行用戶自定義的map方法,從而處理分片的每一條數據分片大小的選擇
1. 擁有許多分片,每個分片所需時間小于整體的時間 2. 并行處理分片,且每個分片比較小,負載均衡,好的計算機處理更快,可以騰出時間做其他計算 3. 分片太小,管理分片的時間和構建map的時間將會決定整個作業執行使時間 4. 分片跨數據塊會使占用帶寬效率更低 5. 最佳分片大小應該和HDFS的塊大小一致。hadoop2.x默認128M創建分片的過程
1.獲取文件的位置以及大小 2.判斷文件是否可以分片(壓縮格式有的可以分片,有的不行) 3.獲取分片大小 4.剩余文件的大小/分片的大小>1.1時循環封裝分片的信息,1.封裝一個分片的信息(包含路徑,分片的起使偏移量,要處理的大小,分片包含的塊信息,分片中包含的塊在那些機器上)2.剩余文件<1.1且不為零形成一個分片,hadoop分片允許10%的冗余讀取分片的細節:如果有多個分片
- 第一個分片讀到末尾再多讀一行
- 因為一般來說讀到最后一行的時候有很大可能不是正好一行結束因此可以一般要多讀取一行。
- 既不是第一個分片也不是最后一個分片第一行數據舍棄,末尾多讀一行
- 舍棄是因為上一個塊已經讀過了
- 最后一個分片舍棄第一行,末尾多讀一行
MapTask的執行流程
1.根據分片機制將文件分為多個片每個分片對應一個container,map調用FileInputFormat的
getRecordReader讀取分片數據
2.MapTask每次讀取數據,讀取一行返回一個<K,V>鍵值對,其中K是偏移量,V是一行數據
3.將K,V對叫給MapTask處理,每讀取一行就要進行一次MapTask
4.每對鍵值對調用一次map(K,V,context)方法,然后使用context.write(K,V)寫出
5.寫出的數據通過收集器OutputCollector.collector()處理
6.寫到環形緩沖區中(環形緩沖區默認大小為100M,緩沖區中存儲的有原始數據從順時針方向寫入
,將原始數據的偏移量,結束位置,分片請況等逆時針寫入環形緩沖區中)
7.當到達閾值默認是80%時開始開始溢寫到磁盤,溢寫到磁盤時會進行一定的排序)方便使用,并且繼續寫入剩余的20%若是寫滿則阻塞。
8默認的分區規則是hashpatitioner,即key的hash%reduceNum
9. 默認的排序規則是key的字典順序,使用的是快速排序
10. 溢寫會形成多個文件,在maptask讀取完一個分片數據后,先將環形緩沖區數據刷寫到磁盤
11將數據多個溢寫文件進行合并,分區內排序(外部排序===》歸并排序)
reduce
若是數據小則放在內存暫時存儲等待處理,若是抓取的數據過多則需要溢寫在磁盤溢寫前會進行合,溢寫可能會形成多個文件,最終要將文件合并,合并時默認最后合并十個文件
總結
- 上一篇: 如何使用正则表达式验证电子邮件地址
- 下一篇: 如何将文字翻译成英文?简单教程讲解