在map-reduce程序中,我希望每个映射器生成一个唯一的数字(与其他映射器中的数字不同)。我认为这可以使用用户定义的计数器来完成。但是,正如我从计数器中了解到的那样,当映射器完成时,计数器的值将被发送到任务跟踪器。如果这是真的,我有点困惑如何在mapper中生成一个唯一的数字。
答案 0 :(得分:0)
为什么不在每个映射器中使用通用唯一标识符(UUID)?
Please check this link, Java has this inbuilt.
评论后修改:
如果希望UUID只生成分割中所有记录的一次,则可以覆盖Mapper类的设置方法,该方法在map任务的开头只调用一次。 然后可以将生成的UUID存储在变量中,以用于map()函数中的每个记录。
如果您使用 mapreduce API,请按以下步骤操作 -
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
}
}
如果是 mapred API,请按以下步骤操作 -
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
}
}