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