如何在使用JobControl启动MapReduce作业之前执行操作

时间:2015-04-15 15:34:25

标签: java hadoop mapreduce

我有JobControl控制n个作业链。

    for (int i = 0; i < iterations; i++) {
        Job eStep = EStepJob.createJob(config);
        Job mStep = MStepJob.createJob(config);
        emChain.add(new ControlledJob(eStep, getDeps(emChain)));
        emChain.add(new ControlledJob(mStep, getDeps(emChain)));
    }
    jobControl.addJobCollection(emChain);

我想仅在每个作业开始之前清理输出目录; 但是,在初始化作业时,不得清除目录。 我目前的解决方案是将清除代码放入映射阶段,这会大大减慢执行速度。

        public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        FileSystem fs = FileSystem.get(context.getConfiguration());
        if (fs.exists(new Path(context.getConfiguration().get(
                AR_PROBS_OUTPUT)))) {
            fs.delete(
                    new Path(context.getConfiguration()
                            .get(AR_PROBS_OUTPUT)), true);
        }

还有更适当的方法吗?

2 个答案:

答案 0 :(得分:1)

初始化作业时,可以将输出存储到临时目录中。 作业完成后,您可以删除临时目录。

然后你可以检查,输出是否需要提交?如果是,那么使用OutputCommitter可以提交输出。

请查看以下链接:

https://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/OutputCommitter.html

答案 1 :(得分:1)

您可以使用Mapper.setup()方法。它是在任何节点上启动任何映射任务之前执行的方法。 我相信您在代码中初始化FileSystem时正在使用HDFS。

无论如何,代码应该以相同的方式工作。但它执行的次数将等于生成的Mapper任务的数量,而不是每个Mapper任务执行的次数!