2

在阅读了Hadoop 推测任务执行之后,我尝试使用新的 Java api 关闭推测执行,但它没有任何效果。

这是我的主要课程:

public class Main {

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();

    //old api:
    //conf.setBoolean("mapred.map.tasks.speculative.execution", false);
    //new api:
    conf.setBoolean("mapreduce.map.speculative", false);

    int res = ToolRunner.run(conf, new LogParserMapReduce(), args);
    System.exit(res);
  }
}

我的 MapReducer 是这样开始的:

@Override
public int run(String[] args) throws Exception {
    Configuration conf = super.getConf();

    /*
     * Instantiate a Job object for your job's configuration.  
     */
    Job job = Job.getInstance(conf);

但是当我查看日志时,我看到:

2014-04-24 10:06:21,418 INFO org.apache.hadoop.mapreduce.lib.input.FileInputFormat (main): Total input paths to process : 16
2014-04-24 10:06:21,574 INFO org.apache.hadoop.mapreduce.JobSubmitter (main): number of splits:26

如果我理解,那么这意味着推测执行仍在进行中,否则如果我只有 16 个输入文件,为什么会有 26 个拆分。我弄错了吗?

注意:我相信我使用了新的 api,因为我在日志中看到了这些警告:

2014-04-24 10:06:21,590 INFO org.apache.hadoop.conf.Configuration.deprecation (main): mapred.job.classpath.files is deprecated. Instead, use mapreduce.job.classpath.files
4

2 回答 2

2

“16 个文件 = 16 个映射器”这是一个错误的假设。

“16 个文件 = 最少 16 个映射器”这是正确的。

如果 16 个文件中的一些文件大于块大小,则将它们拆分为多个映射器。因此,您的 16 个文件生成 26 个映射器可能不是因为投机执行。

在 Conf 中设置值当然有效。您可以通过检查 job.xml 来验证

于 2014-04-24T11:50:08.267 回答
0

您的设置“地图任务不进行推测执行”很好。另一种设置它运行时(使实验/测试更容易)的方法是在命令行中传递相应的参数(-s)。因此,例如,以下映射的推测执行设置为关闭但对于 reducer 是打开的:

bin/hadoop jar -Dmapreduce.map.speculative=false \
               -Dmapreduce.reduce.speculative=true <jar>
于 2017-03-01T13:13:36.420 回答