1

我最近开始学习hadoop。现在,我想在本地磁盘中打开一个文件,并在 reduce 函数中将一些数据写入该文件,但我找不到关闭该文件的好方法。

据我所知,关闭并重新打开它不是一个好主意,所以我不想这样做。

public class MyClass extends Configured implements Tool{
    main(){
         //all configurations here
         job.setMapperClass(MyMapper.class);
         job.setReducerClass(MyReducer.class);
    }
    static class MyMapper extends Mapper <LongWritable,Text,Text,Text>{
      //does something
    }
    static class MyReducer extends Reducer <LongWritable,Text,Text,Text>{
         //create file, filewriter etc here
         public MyReducer() {
              //open a file here
         }
         public reduce(){
              //write to file here
              bw.write("entered the reduce task for " + key); 
              while(there is more item)
                  bw.write( value + " will be written to my file \n");
         }
    }
}

工作流程将如下所示(如果我错了,请纠正我):

for(each reduce task)
    write to file "entered the reduce task for " + *key*
        for each *value* for that *key*
            write *value*

我想将键/值对写入本地磁盘上写入的 myfile,然后想关闭该文件,但我找不到解决该问题的好方法。或者这会是一个问题,如果我不关闭文件,我的意思是,hadoop 会处理这个问题吗?

谢谢,

4

1 回答 1

1

您要扩展的映射器和化简器类都有在处理数据之前和之后运行代码的方法。

  • 要在 map/reduce 运行之前运行代码,请扩展该setup(Context context)方法
  • 要在 map/reduce 任务完成后运行代码,请扩展该cleanup(Context context)方法

因此,在您的情况下,您可以扩展 close 方法以关闭文件。(您需要在 reducer 中为打开的流维护一个实例变量)。

请注意,在您的 reduce 方法失败/异常时,您的 close 方法将不会被调用(除非您覆盖 reduce 方法本身以捕获异常,运行 close 方法然后重新抛出异常)。

于 2013-03-19T10:50:18.577 回答