设置和清理方法究竟用于什么?我试图找出他们的意思,但还没有人能够准确描述他们的所作所为。例如,设置方法如何使用输入拆分中的数据?它作为一个整体吗?还是一行一行?
答案 0 :(得分:24)
如前所述,setup()
和cleanup()
是您可以覆盖的方法(如果您选择),它们可以帮助您初始化和清理map / reduce任务。在这些阶段,您实际上无法直接访问输入拆分中的任何数据。 map / reduce任务的生命周期是(从程序员的角度来看):
设置 - >地图 - >清理
设置 - >减少 - >清理
在setup()
期间通常会发生的事情是您可以从配置对象中读取参数以自定义处理逻辑。
cleanup()
期间通常会发生的事情是您清理了可能已分配的任何资源。还有其他用途,即清除聚合结果的任何累积。
setup()
和cleanup()
方法只是"钩子"对于您,开发人员/程序员来说,有机会在地图/减少任务之前和之后做一些事情。
例如,在规范字数统计示例中,让我们假设您要排除某些字词(例如""," a&#34) ;," be"等...)。配置MapReduce作业时,可以将这些单词的列表(逗号分隔)作为参数(键值对)传递到配置对象中。然后在地图代码中,在setup()
期间,您可以获取停用词并将它们存储在某个全局变量(全局变量到地图任务)中,并在地图逻辑中排除计算这些单词。以下是http://wiki.apache.org/hadoop/WordCount的修改示例。
public class WordCount {
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
private Set<String> stopWords;
protected void setup(Context context) throws IOException, InterruptedException {
Configuration conf = context.getConfiguration();
stopWords = new HashSet<String>();
for(String word : conf.get("stop.words").split(",")) {
stopWords.add(word);
}
}
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if(stopWords.contains(token)) {
continue;
}
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("stop.words", "the, a, an, be, but, can");
Job job = new Job(conf, "wordcount");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
}
答案 1 :(得分:3)
setup: Called once at the beginning of the task.
您可以在此处进行自定义初始化。
cleanup: Called once at the end of the task.
你可以在这里放置资源。
答案 2 :(得分:3)
设置和清理。
例如,您有5个映射器正在运行,对于每个映射器,您要初始化某些值,然后您可以使用安装程序。您的设置方法被调用5次。
因此,对于每个mapreduce,调用第一个setup()
方法,然后调用map()/reduce()
方法,并在退出任务之前调用后来的cleanup()
方法。