MapReduce框架Mapper和Reducer類原始碼分析
一:Mapper類
在Hadoop的mapper類中,有4個主要的函式,分別是:setup,cleanup,map,run。程式碼如下:
- protected void setup(Context context) throws IOException, InterruptedException {
- // NOTHING
- }
- protected void map(KEYIN key, VALUEIN value,
- Context context) throws IOException, InterruptedException {
- context.write((KEYOUT) key, (VALUEOUT) value);
- }
- protected void cleanup(Context context) throws IOException, InterruptedException {
- // NOTHING
- }
- public void run(Context context) throws IOException, InterruptedException {
- setup(context);
- while (context.nextKeyValue()) {
- map(context.getCurrentKey(), context.getCurrentValue(), context);
- }
- cleanup(context);
- }
- }
二:Reducer類
在Hadoop的reducer類中,有3個主要的函式,分別是:setup,clearup,reduce。程式碼如下:
- /**
- * Called once at the start of the task.
- */
- protected void setup(Context context
- ) throws IOException, InterruptedException {
- // NOTHING
- }
- /**
- * This method is called once for each key. Most applications will define
- * their reduce class by overriding this method. The default implementation
- * is an identity function.
- */
- @SuppressWarnings("unchecked")
- protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
- ) throws IOException, InterruptedException {
- for(VALUEIN value: values) {
- context.write((KEYOUT) key, (VALUEOUT) value);
- }
- }
- /**
- * Called once at the end of the task.
- */
- protected void cleanup(Context context
- ) throws IOException, InterruptedException {
- // NOTHING
- }
在使用者的應用程式中呼叫到reducer時,會直接呼叫reducer裡面的run函式,其程式碼如下:
- /*
- * control how the reduce task works.
- */
- @SuppressWarnings("unchecked")
- public void run(Context context) throws IOException, InterruptedException {
- setup(context);
- while (context.nextKey()) {
- reduce(context.getCurrentKey(), context.getValues(), context);
- // If a back up store is used, reset it
- ((ReduceContext.ValueIterator)
- (context.getValues().iterator())).resetBackupStore();
- }
- cleanup(context);
- }
- }
由上面的程式碼,我們可以瞭解到,當呼叫到reduce時,通常會先執行一個setup函式,最後會執行一個cleanup函式。而預設情況下,這兩個函式的內容都是nothing。因此,當reduce不符合應用要求時,可以試著通過增加setup和cleanup的內容來滿足應用的需求。
相關文章
- Mapreduce中的Mapper&reducerAPP
- Redux原始碼分析–Reducer篇Redux原始碼
- Java類集框架 —— ArrayList原始碼分析Java框架原始碼
- Java類集框架 —— HashMap原始碼分析Java框架HashMap原始碼
- Java容器類框架分析(5)HashSet原始碼分析Java框架原始碼
- Java容器類框架分析(1)ArrayList原始碼分析Java框架原始碼
- MapReduce 詳解與原始碼分析原始碼
- Java類集框架 —— LinkedList原始碼分析Java框架原始碼
- Java類集框架 —— LinkedHashMap原始碼分析Java框架HashMap原始碼
- Java容器類框架分析(2)LinkedList原始碼分析Java框架原始碼
- Mapreduce原始碼分析分片、處理流程原始碼
- Java類集框架 —— HashSet、LinkedHashSet原始碼分析Java框架原始碼
- Hadoop2原始碼分析-MapReduce篇Hadoop原始碼
- workerman 框架原始碼核心分析和註解框架原始碼
- CI框架原始碼解讀--ROUTE和URL類框架原始碼
- MapReduce——客戶端提交任務原始碼分析客戶端原始碼
- MapReduce —— MapTask階段原始碼分析(Input環節)APT原始碼
- MapReduce —— MapTask階段原始碼分析(Output環節)APT原始碼
- mapreduce job提交流程原始碼級分析(三)原始碼
- Mapreduce Job提交流程原始碼和切片原始碼詳解原始碼
- MapReduce job在JobTracker初始化原始碼級分析原始碼
- MJRefresh原始碼框架分析原始碼框架
- MapReduce框架排序和分組框架排序
- mapreduce job提交流程原始碼級分析(二)(原創)原始碼
- 通用mapper和分類實現APP
- Java 集合框架------ArrayList原始碼分析Java框架原始碼
- Uber RIBs框架原始碼分析框架原始碼
- mybatis通用mapper原始碼解析(二)MyBatisAPP原始碼
- mybatis通用mapper原始碼解析(一)MyBatisAPP原始碼
- Laravel 請求類原始碼分析Laravel原始碼
- JDK 原始碼分析(1) Object類JDK原始碼Object
- DRF之排序類原始碼分析排序原始碼
- DRF之分頁類原始碼分析原始碼
- Uncode-Schedule框架原始碼分析框架原始碼
- TOMCAT原始碼分析(啟動框架)Tomcat原始碼框架
- workerman 網路框架原始碼核心分析和註解 over 篇框架原始碼
- [原始碼解析] PyTorch 分散式(11) ----- DistributedDataParallel 之 構建Reducer和Join操作原始碼PyTorch分散式Parallel
- Mybatis原始碼分析(四)mapper介面方法是怎樣被呼叫到的MyBatis原始碼APP