關(guān)于MapReduce的相關(guān)知識點,因為學識淺薄,可能會有遺漏的的地方,歡迎各位補充! 下面是我個人認為非常值得注意的幾處知識點,希望能為大家的學習提供便利。 ![]() 1. HDFS上的文件以行讀取,其中key是行中首字母的起始位置,value是該行的文本內(nèi)容,一行為一對KV鍵值對。 2. 通過FileInputFormat將文件切分成split塊,F(xiàn)ileInputFormat只會劃分比block大的部分。切割完畢后通過TextInputFormat對split塊中的每行記錄解析為K1V1鍵值對。 3. 一個split塊對應一個mapper task任務,map接收K1V1鍵值對后執(zhí)行map方法,后輸出新的K2V2鍵值對。 4. K2V2鍵值對添加到環(huán)形緩沖區(qū)中,當數(shù)據(jù)量達到80%(默認數(shù)據(jù),可以使用參數(shù)mapreduce.map.sort.spill.percent修改)之后,這80%環(huán)形區(qū)會觸發(fā)溢出操作,然后被封鎖,mappertask會向剩余部分繼續(xù)寫入數(shù)據(jù)。同時會對寫完的數(shù)據(jù)執(zhí)行partitioner(分區(qū))操作,然后對不同分區(qū)中的數(shù)據(jù)進行排序分組(sort)操作,最后對分組后的數(shù)據(jù)歸約(combiner,通過Key進行歸并,減少reduce的負擔)。 ![]() 5. 每發(fā)生一次溢出操作就會在磁盤中生成換一個磁盤文件,當磁盤文件寫入完畢后,環(huán)形緩沖區(qū)中的封鎖區(qū)會清空數(shù)據(jù),繼續(xù)接收數(shù)據(jù)寫入。 6.mapper task的數(shù)據(jù)全部寫出完畢后,會將多個磁盤文件及內(nèi)存中多余的數(shù)據(jù)寫出到一個本地磁盤文件中。 7.此時會通知APPMaster完成map task,當完成數(shù)量達到5%時,就啟動reduce task任務。 8. reduce生成fetcher線程組(默認5個)將不同分區(qū)的的數(shù)據(jù)copy到不同的reduce節(jié)點上。(一個mapper上的分區(qū)可能會被發(fā)送到多個reduce,同樣一個reduce也會接收來自不同的mapper的分區(qū)) 9.fetcher線程組將數(shù)據(jù)寫入內(nèi)存的過程中,內(nèi)存滿75%時,也會發(fā)生溢出操作,觸發(fā)sort和merge操作,最后生成一個磁盤文件(merge操作一般是從內(nèi)存到磁盤,最后再從磁盤到磁盤) 10. 最后磁盤文件的數(shù)據(jù)會被分組group來提供給reduce方法處理。根據(jù) FileOutputFormat寫入目標文件里。 綜上,為MapReuce的細節(jié)部分,這部分操作大家比較了解,但是馬虎之下容易實現(xiàn)操作性的錯誤,簡要記錄十點,望大家多多留意,大數(shù)據(jù)時代,我們無法安然避世,就業(yè)的壓力擺在面前,只有金甲加身,付出汗水才能獲得高薪,最后送大家一句話,不忘初心,方得始終。 |
|