如何构造一个用户定义的计数器来在Map器中生成唯一的数字

cvxl0en2  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(261)

在MapReduce程序中,我希望每个Map器生成一个唯一的数字(这与其他Map器中的数字不同)。我认为这可以使用用户定义的计数器来完成。但是,正如我从counter中了解到的,当Map器完成时,计数器的值被发送到任务跟踪器。我有点困惑,如果这是真的,我怎么能在Map器中生成一个唯一的数字。

6fe3ivhb

6fe3ivhb1#

为什么不在每个Map器中使用通用唯一标识符(uuid)?
请检查这个链接,java有这个内置的。
评论后编辑:
如果希望uuid在分割中的所有记录中只生成一次,可以重写mapper类的setup方法,该方法在Map任务开始时只调用一次。生成的uuid可以存储在一个变量中,用于map()函数中的每条记录。
如果您使用的是mapreduceapi,下面介绍了如何做到这一点--

public static class SampleMapper extends
            Mapper<LongWritable, Text, Text, Text> {

   String uuid;

   /**
    * This method will be called once at the beginning
    * of each map task
    */
    @Override
    protected void setup(Context context) throws IOException,
            InterruptedException {
        //generate your uuid here
        uuid = generateUUID();
    }

    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {

        //use uuid here
    }

}
在mapredapi的情况下,下面是如何做到这一点的--

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { 

     String uuid;

     @override
     public void configure(JobConf job) {
         uuid = gernerateUUID();
     }

     public void map(LongWritable key, Text value, 
        OutputCollector<Text, IntWritable> output, Reporter reporter)
              throws IOException { 

          //use uuid here
     }

}

这是链接。

相关问题