2014-07-22 34 views
0

這裏是source code的映射在Map-reduce Hadoop中使用Mapper類的run方法中使用上下文對象?

public void run(Context context) throws IOException, InterruptedException { 
    setup(context); 
    while (context.nextKeyValue()) { 
     map(context.getCurrentKey(), context.getCurrentValue(), context); 
    } 
    cleanup(context); 
    } 
} 

正如你可以看到,contextreadwrite同時使用。這怎麼可能? 即context.getCurrentKey()context.getCurrentValue()用於從上下文中檢索鍵和值對並傳遞給映射函數。輸入和輸出是否使用相同的context

+0

'這怎麼可能?'爲什麼不可能? –

回答

4

是的,同樣的context用於輸入和輸出。它存儲對RecordReaderRecordWriter的引用。每當使用context.getCurrentKey()context.getCurrentValue()來檢索密鑰和值對時,請求將委託給RecordReader。當調用context.write()時,它被委託給RecordWriter

請注意,RecordReaderRecordWriter實際上是抽象類。

更新:

org.apache.hadoop.mapreduce.Mapper$Context實現org.apache.hadoop.mapreduce.MapContext,這再次子類org.apache.hadoop.mapreduce.TaskInputOutputContext

看的org.apache.hadoop.mapreduce.task.MapContextImpl源。這又是org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl的子類,以查看Context代表輸入和輸出到RecordReaderRecordWriter的確切位置。

+0

你可以指示我的代碼上下文同時引用RecordReader和RecordWrier嗎? –

+1

是的,'Mapper.Context'實現了'MapContext',它又是子類'TaskInputOutputContext'。 http://hadoop.apache.org/docs/r2.4.1/api/org/apache/hadoop/mapreduce/TaskInputOutputContext.html –

+0

我仍然沒有看到如何引用RecordReader和RecordWriter?也就是說,Context對象應該包含這些,以便可以調用讀取和寫入。源代碼可能會有所幫助..? –

相關問題