【轉】mapper類中SetUp函數詳解


------------------------------
轉自:http://f.dataguru.cn/thread-151742-1-1.html
------------------------------

hadoop中的MapReduce框架里已經預定義了相關的接口,其中如Mapper類下的方法setup()和cleanup()。

----setup()

此方法被MapReduce框架僅且執行一次,在執行Map任務前,進行相關變量或者資源的集中初始化工作。

若是將資源初始化工作放在方法map()中,導致Mapper任務在解析每一行輸入時都會進行資源初始化工作,導致重復,程序運行效率不高!

----cleanup()

此方法被MapReduce框架僅且執行一次,在執行完畢Map任務后,進行相關變量或資源的釋放工作。

若是將釋放資源工作放入方法map()中,也會導 致Mapper任務在解析、處理每一行文本后釋放資源,

而且在下一行文本解析前還要重復初始化,導致反復重復,程序運行效率不高!

 
所以,建議資源初始化及釋放工作,分別放入方法setup()和cleanup()中進行。
 
-------------------------
轉自:http://f.dataguru.cn/thread-23148-1-1.html
-------------------------
下面主要對Setup函數進行深入探討:首先看下兩個程序的區別:
 
區別在於第一個程序把context 這個上下文對象作為map 函數的參數傳到map 函數中,
第二個程序則是在setup 函數中處理了context 對象,
從這個角度講,在Map 類的實例中是可以拿到Context 這個上下文對象的,這一點是毋庸置疑的, 不管是在類內部的哪個函數中使用都可以,
既然是這樣,那么討論的重點就是map 這個類中方法的聲明及執行了,所以分析下Mapper 類的源代碼:
 
mapper 類中,只對這個方法進行了聲明,也就是說它的子類可以重新實現這個方法,這一點很容易理解的。
下面從源碼級分析下整個mapper 類的結構和hadoop 在設計這個類時的巧妙之處:
Map 的主要任務就是把輸入的key value 轉換為指定的中間結果(其實也是key value ),這個類主要包括了四個函數:
Setup 一般是在執行map 函數前做一些准備工作,
map 是主要的數據處理函數,
cleanup 則是在map 執行完成后做一些清理工作和finally 字句的作用很像,
下面看一下run 方法:
這個方法調用了上面的三個函數,組成了setup-map-cleanup 這樣的執行序列,這一點和設計模式中的模版模式很類似,
當然在這里我們也可以改寫它的源碼,比如可以在map 的時候增加多線程,這樣可以對map 任務做進一步的優化,
從以上的分析可以很清楚的知道setup 函數的作用了。
那么還有一個小問題,我們上文中提到的Context 對象是怎么回事呢?

原來它是mapper的一個內部類,至於Context的繼承樹,這里就不再多解釋了,

簡單的說頂級接口是為了在map或是reduce任務中跟蹤task的狀態,很自然的MapContext就是記錄了map執行的上下文,

mapper類中,這個context可以存儲一些job conf的信息,如的運行時參數等,

我們可以在map函數中處理這個信息,這也是hadoop中參數傳遞中一個很經典的例子,

同時context作為了mapreduce執行中各個函數的一個橋梁,這個設計和java web中的session對象、application對象很相似。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM