最近在研究Hadoop,所以在這裏和大家分享一下,共同學習。
先說點廢話,首先,環境配置,我在這裏就不無視各位看官智商了,大家用百度google一下,很多,很全。可能有的人才剛剛聽說這個,不過hadoop已經發展很久很久了~不過,不用灰心啦,畢竟一種成熟的技術需要時間和事件去檢驗其生存能力和穩定性,這樣,雖然我們沒有走在技術的最前沿,但至少,我們不會走彎路。當技術有一定量的普及之後,會有很多牛給我們提供很多現成的技術支持,比起go語言之類的,我們或許會幸福一些吧?
首先,學習Hadoop,首先要明白這個map reduce理念,可能有的公司的分佈式沒有應用hadoop,但多少在文件分佈式或者數據分佈式上,或多或少會有一些借鑑,畢竟google的牛們,還在地上跑的很歡實。
首先,大家先看一眼下圖:
給你30s,看懂了什麼?沒看懂就繼續往下看吧。
該圖從左到右,是數據的流向,從海量字碼到我們整理出的數據。
按照數據框,我們也分6部分介紹:
1 分佈式獲取的數據;
2 數據框內collection的數據類型(我們可以理解成set、map之類),左側的是地址偏移量,右側的是數據;
3 整理的map 左側是key 右側是value;
4 將map數據合併成collection,也就是一個key,多個value,即values;
5 通過篩選,得到我們要的一組set,每個key,對應唯一的value(此處爲充分不必要事件,數學不好的自己補補);
6 通過整理,得到我們需要的數據;
是不是很簡單呢?
第一個圖到第二個圖不用我們考慮;
第二個框圖開始,就是我們需要做的了。
這裏我們會需要構建一個mapper 繼承MapReduceBase並實現Mapper接口:
MapReduceBase:
繼承這個類,主要是實現jobconfigurable接口的Configure方法,這個會在其後用到;其中還有一個close接口,這個在2.6就不推薦使用了。
Mapper:
實現這個接口,主要實現其map(k,v,o,r)方法,這個函數是其最主要的部分。
輸入部分:
k:key值,這裏類型爲LongWritable,該類型是hadoop自己封裝的流數據類型,我們可以理解成java裏的long;
v:value值,這裏是Text類型,也是hadoop裏自己封裝的類,類似於String;
輸出部分:
o:輸出的結果,OutputCollector<k,v>,這裏,是一個可添加的類似與map的結構,源碼裏只有一句話,可以添加值,你懂的;
r:reporter,這個類型爲返回值類型。
雖然有些源碼沒有看,如果你學過C#或者C/C++,這裏的o我們可以理解爲&o,如果你沒有學過,我們可以理解成通過調用反射,具體可能會用到jdk代理吧?反正,怎樣,你就理解成,這個Out的值,是返回值就OK了。
然後,就是Reducer了,其繼承了MapReduceBase這個類,實現了Reducer這個接口:
這裏我們就只講一下Reducer:
這裏主要實現reduce(k,v,o,r):
輸入部分:
k:mapper部分傳遞過來的key,與之類型匹配;
v:mapper部分傳遞過來的values,類型爲Iterator<k>,與之類型匹配;
輸出部分:
o:輸出值,類型爲OutputCollector<k,v>;
r:輸出類型。
這樣,最基本的mapreduce結構,我們就可以通過代碼來實現了.
當我們調用的時候,你就應該想起來MapReduceBase這個父類了吧?
通過JobConf調用主進程,由於Hadoop分佈式特性,在使用資源之前,會被壓縮成jar,這裏我們只要調用其class,Hadoop就會爲我們自動調用了;
FileInputformat和FileOutputformat用於控制數據的輸入和輸出。其會對分佈式磁盤進行搜索,對資源進行調用及輸出(PS:這裏需要注意的是,輸出文件不要存在,否則會拒絕進程執行);
這裏注入的時候,根據輸入值、輸出值,我們調用的注入函數可能不一樣,這裏需要根據具體情況,查閱相關文檔即可;當然,如果合適的話,用默認的也是ok的。
完成這些,我們就可以將代碼跑起來了。
接下來的一些問題和要點,如果沒有懶死的話,會隨之更新的^^.