如何在mapreduce作业开始使用jobcontrol之前执行操作

jhdbpxl9  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(405)

我有一个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);

我想清理输出目录只和只在每个作业开始前;但是在初始化作业时,不能清除目录。我目前的解决方案是将清除代码放在map阶段,这大大降低了执行速度。

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);
        }

有没有更合适的方法?

ttygqcqt

ttygqcqt1#

初始化作业时,可以将输出存储到临时目录中。作业完成后,可以删除临时目录。
然后您可以检查,输出是否需要提交?如果是,那么使用outputcommitter可以提交输出。
请查看以下链接:
https://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/outputcommitter.html

wwodge7n

wwodge7n2#

您可以使用mapper.setup()方法进行相同的操作。它是在任何节点上启动任何Map任务之前执行的方法。我相信您在代码中初始化文件系统时使用的是hdfs。
无论如何,代码应该以同样的方式工作。但它被执行的次数将等于生成的Map器任务数,而不是每个Map器任务被执行的次数!

相关问题