hadoop基礎與實踐--流程解惑
看過好多本hadoop的書,對整個過程始終存在一些疑問,今天終於搞清楚了。立個low-flag。
整體架構好復雜的感覺?其實不復雜
整體架構,namenode/metanode負責維護所有的元數據,datanode負責實際的物理存儲,同一份數據datanode上必定多個副本,從而保證高可用。
hdfs只是個文件系統,有那麽重要嗎?
hdfs,最核心組件,高可用,不適合處理碎片文件。所有存儲相關都是hdfs的職責範圍。
mapreduce感覺很簡單,但是具體背後的邏輯是什麽?
mapreduce,核心組件。一個任務會首先從hdfs取出被inputformat切分成多個<k,v>,然後分配到mapper程序運行,運行後輸出新的<k,v>,再由partioner處理mapper結果,成為<k,v list>,此處保證所有相同的k,必定會組織到一起,再傳給reducer處理,完成後輸出最終結果到hdfs。
inputformat,分片操作,根據splitsize決定將源文件進行劃分,數據格式化,將劃分好的inputsplit格式化為<k,v>,k為偏移量(已跳過的字符數),v為每一行的內容,並每次生成一個kv就調一次mapper。
shuffle,mapper到reducer之間,主要起到承上啟下的作用。(不然mapred怎麽工作?)
mapper的shuffle,sort,combine,pation.
mapper的shuffle,達到設置值的0.8就開始進行sort,spill溢寫文件,如果剩下的0.2緩存已寫滿,但是spill還沒完成,則會阻塞map操作。combine其實就是一次reduce的一個實現,預處理reduce。當某個map任務完成後,一般會有多個spill文件,會進行歸並排序,將spill合並為一個文件,並在合並時提供partion,存儲在index索引文件中。當reducer來取時,就會參照這個文件進行取用。
reducer的shuffle,當一個mapper完成時,就會通知tasktracker,然後,reducer就會通過http協議來取數據了。reducer取到partion後,會先放jvmheap,達到設定值後,也會進行sort寫入磁盤。和mapper的spill過程類似。reducerr把merge sort 完成後,就直接調用reduce函數了。
最後,是寫入hdfs。outputformat,描述數據的輸出形式,生成相應的類對象,調用write方法寫入到hdfs,默認調用文本寫入方法。
至此,mapred過程基本完成,總算捋清楚了。
理解了以上,寫起mapreduce的簡單函數,自然沒問題了,處理一些基本問題也順心了許多。同時,也只有在理解整個過程的前提上,才能找到適用場景。
後續其他技術,且等且實踐。(基礎很重要)
hadoop基礎與實踐--流程解惑