MapReduce原理


Map階段
- 檔案在被讀取(呼叫read())的是用Inputformat方法讀入的,在這里讀入一行,回傳一個key-vlaue(K,V)對,key是行號的偏移量,value的值是這一行的內容,
- 在上述程序中,在第4步呼叫map()方法后,將以上內容真正轉換成(key,value)的形式,key為值,value為1,然后呼叫context.write方法將該資料寫出來
- 經過outputcollector收集器之后會寫入環形緩沖區,在環形緩沖區會做如下幾件事
- 排序,呼叫的是快速排序法
- 磁區,呼叫的 hashpartitioner磁區,達到80%之后會溢位將檔案寫到磁盤,相同的hash值會分到一個磁區中,可以認為設定磁區數,排序的時候是依據partition和key兩個來作為依據的,同一個partition中是按照key進行排序的
- 第7步:環形緩沖區spill溢寫到磁盤中,會溢位多次到不同的磁區中,之后會進行merge,并進行歸并排序,將多個小檔案合并成大檔案,所以合并之后的大檔案還是磁區,并且磁區內部是有序的
- Combiner階段是可選項,形式上也是一種reduce操作,在這個程序中可以直接讓相同key的value進行聚合(相加等),減少資料量以及在網路中傳輸的開銷,能大大提高效率
Reduce階段
- Reduce階段會去map階段merge之后的檔案中拿資料,按照相同的磁區去取資料,reduce中有磁區號,將資料拿過來之后會存盤在本地磁盤,此程序會進行I/O讀寫,并有相應的網路傳輸
- 拿到資料后,會按照相同的磁區,再將取過來的資料進行merge歸并排序,大檔案的內容按照key有序進行排序
- 之后會呼叫 groupingcomparator 進行分組,之后的reduce中會按照這個分組,每次取出一組資料,呼叫reduce中自定義方法進行處理
- 最后呼叫outputformat將內容寫入到檔案中
Shuffle階段
- 核心機制:資料磁區,排序,快取,分發

針對MR原理進行HIVE優化
- 優化總體思路就是減少資料傾斜,降低I/O,降低網路傳輸量
- 資料傾斜:是指在shuffle的程序中,把大量相同的key分到了一個Reduce節點上進行處理,其他的key分到其他Reduce節點上,導致Reduct Task處理完后,還有一個Reduct Task節點還在處理資料,最終導致整個Reduce的延遲情況
- 采用分而治之的方式,在Sql層面,通過改寫Sql進行優化
環形緩沖區默認100M,mr.sort.mb=100M
參考鏈接:
- 參考鏈接1-CSDN
- 參考鏈接2-CSDN
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/251615.html
標籤:大數據
