目前it基本都是一個套路,得到數據而後進行邏輯處理,存儲數據。java
基本上弄清楚整個的數據流向就等於把握了命脈。網絡
如今說說mapreduce的數據流spa
一、首先數據會按照TextInputFormat按照特定的文本輸入格式被處理成兩個InputSplit,固然通常是這樣,每增長一個塊分區(Block,簡單的說是幾個文件我是這麼理解的)就會加一個InputSplit。orm
二、而後將InputSplit分割的內容輸入到相應的Map中(map會讀取inputSplit指定位置的數據),有幾個InputSplit就有幾個Mapinput
三、在Map裏面進行處理的時候首先會將分割的內容放進去,並轉換成方便處理的格式而後寫入到本地磁盤中,簡單點說就是將標準的輸入格式,處理成標準的輸出格式(個人理解是,處理方式都是死的,是按照必定的格式才能進行處理,包括成爲key value對,也是一種格式。只有轉換成特定的格式,才能進行批處理。不然容易出問題)。而後進行Map處理成key/value 。 it
四、在Map處理成規定的key/value後,數據進入shuffle,裏面會自動進行歸類。好比說我讀入數據是(key,value)就會處理稱爲 (key,value_list),將相同的key進行合併,值組成一個列表。遍歷
五、而後傳入reduce處理,在reduce中會將數據進行整合,通常能夠在這裏將不一樣文件的數據進行笛卡爾積,說是這麼說,其實就是把數據對應的拿出來,按照key相同值處理的方式進行遍歷處理。這裏面通常key是兩個文件的數據的主外鍵,而後value是你想笛卡爾積得到的數據。官方說法是合併value。而後弄成標準輸出格式丟掉HDFS中落地成爲文件。這裏面的落地會佔用不少網絡寬帶,和上傳數據同樣的,主要和存儲機制nameNode和dataNode有關,簡單點原數據存儲地方不同,如今擼過來一塊兒處理加上裏面我用java寫的程序也是標準的文件輸入輸出流。這個是不可避免的。map