mapreduce是乙個基於hdfs的分布式計算框架,是乙個可以將分布式計算抽象為map和reduce的程式設計模型,它的核心思想是分治,將大量資料分到不同機器上去分別計算最終彙總從而進行高效的資料處理,但是mapreduce不支援迭代和迴圈會有一定的侷限性,如果有需要迭代就會需要進行多倫的mapreduce。
1.1:何為分片
分片的主要作用就是將乙個大的檔案在邏輯上進行劃分,以此來將大量資料分配到不同的map任務中去進行分布的計算,inputformat對檔案根據塊大小進行劃分,之後recodereader會讀根據分片的資訊從hdfs中讀入資料到map任務中。
1.2:分片於block的關係
1.3:分片如何確定:
分片會根據塊大小來進行劃分,預設與塊大小一致,但是也可以通過設定hadoop屬性來確定。分片大小會由下面這個公式來確定,
max( minimunsize , min( maximusize , blocksize ));
2.1:作用:
根據key值將資料分到不同的reduce機器上。每個key
2.2:如何進行分割槽
1:預設通過hashpartitioner進行分割槽;
2:自定義分割槽類繼承partitioner重寫getpartitioner方法
3:使用其他內建分割槽器
分組是將reduce中相同key的資料放到同一批次中去處理。
為了減少寫入磁碟的資料量而進行combine操作,注意!只有當combine操作不會對最終結果產生影響時才可定義combine操作。並且只有當磁碟中的溢寫檔案大於預設值時才會進行combine操作。
將多個小的磁碟檔案歸併為大的已分割槽並且排序的磁碟檔案,map端歸併最終會歸併為乙個大檔案,reduce端歸併如果磁碟檔案過多可能會進行多倫歸併形成多個大檔案,這些檔案不再繼續進行歸併直接交給reduce端。通過配置屬性mapreduce.task.io.sort.factor控制每輪歸併檔案數量。
1:inputformat從hdfs中載入檔案,並且他會對檔案進行乙個邏輯上的劃分來切分成split:
2:recodereader根據分片的位置資訊讀取分片中的內容以key-value的形式輸出給map任務。
3:每個map任務對資料進行處理之後會輸出key-value,經過shuffle之後分發給reduce機器進行處理。
4:reduce進行資料處理之後會通過outputformat輸出到hdfs中。
全流程:
map端:
1:每個map任務對資料進行處理之後會輸出key-value到乙個環形緩衝區.
2:當緩衝區資料達到一定閾值之後會溢寫到磁碟形成多個磁碟檔案,這個過程會對資料進行分割槽,按照key值進行排序以及如果定義conbiner函式還要進行的合併。
3:當map所有資料都溢寫到磁碟之後,多個小的檔案磁碟檔案歸併為乙個大的磁碟檔案之後reduce取走相應分割槽的資料資料
reduce端:
4:從不同機器的相應分割槽拿到資料之後會先寫到快取之中。如果快取滿了則溢寫到磁碟形成磁碟檔案,如果有大量磁碟檔案會進行多倫歸併形成多個大檔案,之後每個大檔案進行合併操作交給reduce進行處理。如果快取還沒滿就已經讀完資料就不需要溢寫直接交給reduce。
前面提到過mapreduce主要是分支思想,通過分治來進行高效的資料處理,那麼資料的劃分則尤為重要。如果要是資料劃分不好導致有的機器需要處理非常多的資料從而造成的效率低下就發生了資料傾斜。這裡只對mapreduce資料傾斜進行討論。
mapreduce資料傾斜表現:
1:reduce卡在99%不動。
maprecuce資料傾斜罪魁禍首:
shuffle,shuffle過程中由於map任務輸出的key值分布不均在導致部分資料量非常大的相同的key-value拉去到一台reduce機器。
mapreduce:資料傾斜原因:
在mapreduce程式中造成資料傾斜的主要原因一般是原始資料本身就有問題,這樣一來map端輸出的key-value中部分key可能會遠遠多於其他的key-value,因為正常來講資料的分布很大概率是不均勻的。hive中業務邏輯也會造成資料傾斜。
mapreduce解決資料傾斜:
如果知道是那部分資料造成資料傾斜:
將造成傾斜部分資料的key後增加標記,使他們劃分到不同reduce。但這會對結果產生影響,所以還需在進行一次mapreduce操作。。
如果未知是哪部分資料造成資料傾斜:
在map端進行聚集操作,效率更高但會耗費更多記憶體。
將所有資料的key後增加標記再次進行劃分。
肯定會有其他的方法,總之,只要能夠解決reduce處理所資料的分布不均就可以緩解資料傾斜。
深入理解MapReduce
化簡 reducing 遍歷集合中的元素來返回乙個綜合的結果。即,輸出表單裡一列數字的和這個任務屬於reducing。input,資料讀入 123456 設定資料輸入 fileinputformat.setinputpaths job,args 0 fileinputformat.setinputd...
MapReduce理解 深入理解MapReduce
化簡 reducing 遍歷集合中的元素來返回乙個綜合的結果。即,輸出表單裡一列數字的和這個任務屬於reducing。input,資料讀入 123456 設定資料輸入 fileinputformat.setinputpaths job,args 0 fileinputformat.setinputd...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...