學習Hadoop(1)mapreduce

最近在研究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的。


完成這些,我們就可以將代碼跑起來了。



接下來的一些問題和要點,如果沒有懶死的話,會隨之更新的^^.






發佈了10 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章