如何編寫MapReduce程式碼
關於maperduce,可以參考:http://en.wikipedia.org/wiki/MapReduce
這裡假設你具備一定的hadoop程式設計經驗。
Mapper接受原始輸入,比如網站日誌,分析並輸出中間結果。經歷排序,分組成為Reducer的輸入,經過統計彙總,輸出結果。當然這個過程可以是多個。
其中Mapper比較簡單,但是需要對輸入具有深入的理解,不光是格式還包括意義。其中有如下注意:
- 一條輸入儘量不要擴充為多條輸出,因為這會增加網路傳輸
- 對於partition的key要仔細選擇,這會決定有多少reducer,確保這個的結果儘量均勻分佈
reducer其實有現實的模板,這個是我要重點介紹的。下面的例子都是基於Perl語言。
對於簡單的輸入,模板如下:
# read configuration
# initiate global vairables
# initiate key level counter
# initiate group level counter
# initiate final counter
### reset all key level counter
sub onBeginKey() {}
### aggregate count
sub onSameKey {}
### print out the counter
sub onEndKey() {}
### main loop
while (<STDIN>) {
chomp($_);
# step 1:filter input
# step 2: split input
# step 3: get group and key
# main logic
if ($cur_key) {
if ( $key ne $cur_key ) {
&onEndKey();
&onBeginKey();
}
&onSameKey();
}
else {
&onBeginKey();
&onSameKey();
}
}
if ($cur_key) {
&onEndKey();
}
對於複雜的輸入,模板如下:
# read configuration # initiate global vairables # initiate key level counter # initiate group level counter # initiate final counter ### reset all group level counter sub onBeginGroup() {} ### reset all key level counter sub onBeginKey() {} ### add count at key level sub onSameKey {} ### aggregate count from key level to group level sub onEndKey() {} ### aggregate count from group level to final result sub onEndGroup() {} ### main loop while (<STDIN>) { chomp($_); # step 1:filter input # step 2: split input # step 3: get group and key # main logic if ($cur_group) { if ( $group ne $cur_group ) { &onEndKey(); &onEndGroup(); &onBeginGroup(); &onBeginKey(); } else { if ( $key ne $cur_key ) { &onEndKey(); &onBeginKey(); } #else just the same key } &onSameKey(); } else { &onBeginGroup(); &onBeginKey(); &onSameKey(); } } if ($cur_key) { &onEndKey(); &onEndGroup(); } ### print out the final counter兩個版本的區別在於,多了一級的group,但是原理一樣。當然理論上還可以再巢狀更多的級別。
最後推薦一下市面上的hadoop程式設計書籍:
- Hadoop: The Definitive Guide
- Hadoop in Action
- Pro Hadoop
相關文章
- 如何編寫簡潔的程式碼?
- python如何換行編寫程式碼Python
- 如何學習用Java編寫程式碼?Java
- 如何編寫高效的Android程式碼Android
- 使用Python編寫MapReduce作業Python
- 如何編寫乾淨高效的CSS程式碼CSS
- 如何編寫富有表現力的程式碼?
- golang如何優雅的編寫事務程式碼Golang
- 如何讓Java編譯器幫你寫程式碼Java編譯
- 如何使用 Laravel Collections 類編寫神級程式碼Laravel
- 提高程式碼質量:如何編寫函式函式
- 如何編寫出擁抱變化的程式碼?
- Sublime 編寫編譯 swift程式碼編譯Swift
- 程式碼編寫提示配置
- 編寫良好的程式碼:如何減少程式碼的認知負荷
- 如何編寫高質量的C#程式碼(一)C#
- 如何編寫健壯的程式
- Model 編寫程式碼智慧提醒
- 02 | 編寫Model層程式碼
- vue3程式碼編寫Vue
- 編寫高質量程式碼
- 編寫更好的CSS程式碼CSS
- 編寫可讀的程式碼
- Hbuilder快速程式碼編寫技巧UI
- 🐒編寫高質量程式碼(手撕程式碼)
- 如何編寫更棒的程式碼:11個核心要點
- 如何編寫高質量和可維護的程式碼
- 如何編寫可維護的物件導向JavaScript程式碼物件JavaScript
- 如何寫好程式碼?
- 如何寫好程式碼
- 如何編寫高效的 Shell 指令碼指令碼
- 如何使用zx編寫shell指令碼指令碼
- 使用 xunit 編寫測試程式碼
- Django開發——003程式碼編寫Django
- 編寫更好的C#程式碼C#
- 使用 intern 編寫測試程式碼
- 編寫易於理解的程式碼
- 編寫程式碼的好習慣