如何編寫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
相關文章
- 如何編寫高效的Android程式碼Android
- 如何編寫簡潔的程式碼?
- python如何換行編寫程式碼Python
- 如何學習用Java編寫程式碼?Java
- Sublime 編寫編譯 swift程式碼編譯Swift
- 如何使用 Laravel Collections 類編寫神級程式碼Laravel
- golang如何優雅的編寫事務程式碼Golang
- 如何讓Java編譯器幫你寫程式碼Java編譯
- 如何編寫高質量的C#程式碼(一)C#
- Hbuilder快速程式碼編寫技巧UI
- Model 編寫程式碼智慧提醒
- 02 | 編寫Model層程式碼
- vue3程式碼編寫Vue
- 如何在 SAP Spartacus 中編寫 ASM-Compatible 的程式碼ASM
- 如何寫好程式碼
- 如何寫好程式碼?
- 🐒編寫高質量程式碼(手撕程式碼)
- Java程式碼編寫、程式碼優化技巧總結Java優化
- iOS程式碼編寫利器AppCode 2022iOSAPP
- 使用 xunit 編寫測試程式碼
- Django開發——003程式碼編寫Django
- 程式設計師筆記|如何編寫高效能的Java程式碼程式設計師筆記Java
- 如何編寫高效的 Shell 指令碼指令碼
- 如何使用zx編寫shell指令碼指令碼
- Python如何使用tkinter編寫GUI程式PythonGUI
- 我們應該如何編寫高質量的前端程式碼前端
- 如何編寫優秀的測試程式碼|單元測試
- python加法程式碼如何寫Python
- IEDA編寫程式碼常用的快捷鍵
- 前端進階-編寫測試程式碼前端
- Storm的wordcount程式碼編寫與分析ORM
- 編寫更優雅的 JavaScript 程式碼JavaScript
- 編寫簡單的Java程式碼:HelloWoridJava
- 編寫高效能的Java程式碼Java
- 使用 Source Generators 快速編寫 MVVM 程式碼MVVM
- 使用pycharm or vscode來編寫python程式碼?PyCharmVSCodePython
- AppCode 2022 for Mac(iOS程式碼編寫利器)APPMaciOS
- 程式碼規範之前端編寫碼規範前端
- PEP 8 程式程式碼的編寫風格指南