Hadoop的核心思想之一是mapreduce(分布式計算框架)
Compute:計算層(處理層)
HDFS:分治
一彬呻、What? 什么是MR
1灵妨、過濾性別為0的
循環(huán)處理每行記錄解阅,切割性別列,進行過濾
2泌霍、轉換碼值為字典值
read line货抄,切割性別列述召,進行轉換
3、展開字段為復合值
read line蟹地,切割性別列积暖,進行轉換
簡單概括:
MAP:以一條記錄為單位做映射。
REDUCE:以一組記錄為單位做計算怪与。
什么叫一組夺刑?分組!
分組依賴一種數(shù)據(jù)格式:key:value
k,v的實現(xiàn):MAP實現(xiàn)的
1分别、思考:為啥叫MapReduce?
- Map:
映射遍愿、變換、過濾
一進N出- Reduce:
分解耘斩、縮小沼填、歸納
一組進N出- (KEY,VAL)
鍵值對的鍵劃分數(shù)據(jù)分組
2、MapReduce邏輯架構
1)藍色框(方法)
2)虛線框(任務task)
3)part分區(qū)(包含若干組)
4)Split分片:邏輯劃分括授,不包含具體數(shù)據(jù)坞笙,只包含這些數(shù)據(jù)的位置信息,一個Split只會包含一個File的block荚虚,不會跨文件
塊薛夜、切片、map版述、reduce梯澜、組、分區(qū)的關系:
1)bloock:split=1:1,1:N,N:1,
2)split:map=1:1
3)map:reduce=N:1,1:1,N:N,1:N
4)group(key):partiton=1:1,N:1,N:N
總結:
MR:數(shù)據(jù)以一條記錄為單位院水,經(jīng)過map方法映射成kv鍵值對腊徙,相同的key為一組,這一組數(shù)據(jù)調用一次reduce方法檬某,在方法內迭代計算一組數(shù)據(jù)撬腾。(迭代器模式)
經(jīng)驗:數(shù)據(jù)集一般是用迭代計算的方式
詳情:map到reduce線性發(fā)展順序關系。map并行度恢恼,由計算層切片split的數(shù)量決定(可調的窗口機制民傻,split默認=Block(文件),一般不會調)场斑,split與map為1:1的關系漓踢,切片split里面要格式化format出一條記錄,以一條記錄為單位調用一次map方法(map方法以記錄為單位調用)漏隐,map的輸出是k,v(kv完成分組的事情喧半,相同的k為一組,一組數(shù)據(jù)調用一次reduce方法青责,一組數(shù)據(jù)不能被破壞)挺据,每個reduce拉取屬于自己的分區(qū)的數(shù)據(jù)(一個reduce任務一個分區(qū)取具,每個分區(qū)包含若干組),reduce的個數(shù)由人決定(reduce并行度)扁耐。
1.一個map只會處理一個Split
2.map處理完的數(shù)據(jù)會分成不同的partition
3.一類partition對應一個reduce
那么一個mr程序中 map的數(shù)量是由split的數(shù)量決定的暇检,reduce的數(shù)量是由partiton的數(shù)量決定的。
3婉称、MapReduce執(zhí)行過程
1块仆、input split:切片會格式化出記錄,以記錄為單位調用map方法
2王暗、map:map的輸出映射成kv悔据,kv會參與一次分區(qū)計算,拿著key算出P分區(qū)號瘫筐,最終輸出k,v,p(相同的k蜜暑,p是一樣的)
3铐姚、buffer內存緩沖區(qū):默認為100M策肝,分區(qū)排序,內部有序外部無序隐绵,先快速排序后歸并排序
4之众、內存緩沖區(qū)溢寫磁盤時做一個2次排序,分區(qū)有序依许,且分區(qū)內key有序棺禾,未來相同的一組key會相鄰的排在一起。一次寫入(一次用戶態(tài)與內核態(tài)的切換)
5峭跳、map Task的輸出是一個文件膘婶,存在本地文件系統(tǒng)中
6、reduce的歸并排序其實可以和reduce方法的計算同時進行蛀醉,盡量減少IO悬襟,因為有迭代器模式的支持。
迭代器模式是批量計算中非常優(yōu)美的實現(xiàn)形式拯刁。
Mapreduce的執(zhí)行步驟:
MapReduce的執(zhí)行過程主要包含是三個階段:Map階段脊岳、Shuffle階段、Reduce階段
一垛玻、Map任務處理
1)讀取HDFS中的文件割捅,每一行解析成一個。每一個鍵值對調用一次map函數(shù)帚桩。
2)覆蓋map(),接收1.1產生的亿驾,進行處理,轉換為新的輸出账嚎。
3)對1.2輸出的進行分區(qū)莫瞬。默認分為一個區(qū)参淹。
4)對不同分區(qū)中的數(shù)據(jù)進行排序(按照k)、分組乏悄。分組指的是相同的key的value放到一個集合中浙值。排序后<hello,1> <hello,1> <me,1> <you,1> 分組后:<hello,{1,1}><me,{1}><you,{1}>
5)(可選)對分組后的數(shù)據(jù)進行歸約。
二檩小、Shuffle
Shuffle,翻譯成中文是混洗开呐。mr沒有排序是沒有靈魂的,shuffle是mr中非常重要的一個過程规求。他在Map執(zhí)行完筐付,Reduce執(zhí)行前發(fā)生。Shuffle階段橫跨Map端和Reduce端阻肿,在Map端包括Spill過程瓦戚,在Reduce端包括copy和merge/sort過程。通常認為Shuffle階段就是將map的輸出作為reduce的輸入的過程丛塌。
1较解、Map階段的shuffle
數(shù)據(jù)經(jīng)過用戶自定的map函數(shù)處理完成之后,數(shù)據(jù)會放入內存中的環(huán)形緩沖區(qū)之內赴邻,他分為兩個部分印衔,數(shù)據(jù)區(qū)和索引區(qū)。數(shù)據(jù)區(qū)是存放用戶真實的數(shù)據(jù)姥敛,索引區(qū)存放數(shù)據(jù)對應的key值奸焙,partition和位置信息。當環(huán)形緩沖區(qū)數(shù)據(jù)達到一定的比例后彤敛,會將數(shù)據(jù)溢寫到一個文件之中与帆,即途中的spill(溢寫)過程。
在溢寫前墨榄,會將數(shù)據(jù)根據(jù)key和partition進行排序玄糟,排好序之后會將數(shù)據(jù)區(qū)的數(shù)據(jù)按照順序一個個寫入文件之中。這樣就能保證文件中數(shù)據(jù)是按照key和parttition進行排序的渠概。最后會將溢寫出的一個個小文件合并成一個大的文件茶凳,并且保證在每一個partition中是按照Key值有序的。總結:
Collect階段將數(shù)據(jù)放進環(huán)形緩沖區(qū)播揪,緩沖區(qū)分為數(shù)據(jù)區(qū)和索引區(qū)贮喧。
Sort階段對在同一partition內的索引按照key排序。
Spill階段跟胡排好序的索引將數(shù)據(jù)按照順序寫到文件中猪狈。
Merge階段將Spill生成的小文件分批合并排序成一個大文件箱沦。2、Reduce階段的shuffle
reduce節(jié)點會將數(shù)據(jù)拷貝到自己的buffer緩存區(qū)中雇庙,當緩存區(qū)中的數(shù)據(jù)達到一定的比例的時候谓形,同樣會發(fā)生溢寫過程灶伊,我們任然要保證每一個溢寫的文件是有序的。與此同時寒跳,后臺會啟一個線程聘萨,將這些小文件合并成一個大文件,經(jīng)過一輪又一輪的合并童太,最后將這些文件合并成一個大的數(shù)據(jù)集米辐。在這個數(shù)據(jù)集中,數(shù)據(jù)是有序的书释,相同的key值對應的value值是挨在一起的翘贮。最后,將這些數(shù)據(jù)交給reduce程序進行聚合處理爆惧。總結:
Copy階段將Map端的數(shù)據(jù)分批拷貝到Reduce的緩沖區(qū)狸页。
Spill階段將內存緩存區(qū)的數(shù)據(jù)按順序寫到文件中。
Merge階段將溢出的文件合并成一個排序的數(shù)據(jù)集扯再。
三芍耘、Reduce任務處理
1)多個map任務的輸出,按照不同的分區(qū)叔收,通過網(wǎng)絡copy到不同的reduce節(jié)點上齿穗。
2)對多個map的輸出進行合并傲隶、排序饺律。覆蓋reduce函數(shù),接收的是分組后的數(shù)據(jù)跺株,實現(xiàn)自己的業(yè)務邏輯复濒,
處理后,產生新的輸出乒省。
3)對reduce輸出的寫到HDFS中巧颈。
參考資料:
https://www.cnblogs.com/lfxiao/p/10770051.html
http://www.reibang.com/p/d1e7b4ff3810