1.預設的textinputformat
場景: 普通的文字格式資料**
切片: 採用預設的切片策略,以檔案為單位,先判斷檔案是否可切,如果可切,迴圈以片大小為單位切片!
不可切,整個檔案作為1片!
rr : linerecordreader(將一行封裝為乙個key-value)
longwritable key: 行的偏移量
text value: 行的內容
2. nlineinputformat
場景: 適合一行的內容特別多,在map階段map()處理的邏輯非常複雜!
根據行數自定義切片的大小!
切片: 可以設定以檔案為單位,每n行作為乙個切片!
rr : linerecordreader(將一行封裝為乙個key-value)
longwritable key: 行的偏移量
text value: 行的內容
3. keyvaluetextinputformat
場景: 一行的內容的格式 為 key-value,方便地將key,value拆分封裝
切片: 採用預設的切片策略,以檔案為單位,先判斷檔案是否可切,如果可切,迴圈以片大小為單位切片!
不可切,整個檔案作為1片!
rr : keyvaluerecordreader(將一行封裝為乙個key-value)
text key: 行的分隔符之前的部分內容
text value: 行的分隔符之後的部分內容
4. combinetextinputformat
場景: 輸入目錄中小檔案過多,可以將多個小檔案設定到乙個切片中!
切片: ①根據maxsize對每個檔案進行邏輯切片,切分為若干part
②將多個part組合,知道超過maxsize,這些part作為乙個切片
rr : linerecordreader(將一行封裝為乙個key-value)
longwritable key: 行的偏移量
text value: 行的內容
三、切片和塊
切片: 對檔案進行邏輯切分,只有在執行mr任務時,才會對檔案切分!
切分時,切片的大小不同,每個檔案切分的結果也不同!
塊: 檔案在上傳到hdfs時,在hdfs上儲存的最小單位,物理儲存!
關係: maptask在讀取切片的內容時,需要根據切片的metainfo,獲取到當前切片屬於檔案的哪部分!
再根據此資訊去尋找對應的塊,讀取資料!
預設切片大小等於塊大小,主要為了減少在執行mr時,大量的跨機器讀取切片內容帶來額外的網路io!
shuffle機制1)
map方法之後
reduce
方法之前這段處理過程叫
shuffle 2
)map
方法之後,資料首先進入到分割槽方法,把資料標記好分割槽,然後把資料傳送到環形緩衝區;環形緩衝區預設大小
100m
,環形緩衝區達到
80%時,進行溢寫;溢寫前對資料進行排序,排序按照對
key的索引進行字典順序排序,排序的手段快排;溢寫產生大量溢寫檔案,需要對溢寫檔案進行歸併排序;對溢寫的檔案也可以進行
combiner
操作,前提是彙總操作,求平均值不行。最後將檔案按照分割槽儲存到磁碟,等待
reduce
端拉取。 3
)每個reduce
拉取map
端對應分割槽的資料。拉取資料後先儲存到記憶體中,記憶體不夠了,再儲存到磁碟。拉取完所有資料後,採用歸併排序將記憶體和磁碟中的資料都進行排序。在進入
reduce
方法前,可以對資料進行分組操作。
Mapper 元素和屬性
parametertype 輸入型別 傳遞簡單型別 使用 佔位符,或者 進行sql拼接,括號中的值可以任意,括號中的值為value。傳遞pojo物件 mybatis使用ognl表示式解析物件欄位的值,或者 括號中的值為pojo屬性名稱 而且必須有對應的set方法 resulttype 輸出型別 輸出...
reduce方法和reduceRight方法
什麼是reduce方法?先來看一下用用法 var arr 1,2,3,4 var sum a,b a b arr.reduce sum,0 10由上面 可以看出,reduce對陣列arr的每乙個成員執行了sum函式。sum的引數a是累積變數,引數b是當前的陣列成員。每次執行時,b會回到a,最後輸出a...
Repository和 Mapper的區別
repository是spring的註解 description field userservice in com.example.demo.three.controller.usercontroller required a bean of type com.example.demo.three....