阅读Hadoop speculative task execution之后我试图使用新的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
答案 0 :(得分:2)
“16 file = 16 Mappers”这是一个错误的假设。
“16个文件=最少16个Mappers”这是正确的。
如果16个文件中的某些文件大于块大小,则会将它们拆分为多个映射器。因此,生成26个Mappers的16个文件可能不是因为推测性执行。
在Conf中设置值肯定有效。您可以通过检查job.xml来验证
答案 1 :(得分:0)
你的设置'没有地图任务的推测执行'是好的。设置运行时的另一种方法(使实验/测试更容易)是通过在命令行中传递相应的参数(-s)。因此,例如,对于设置为关闭的地图的推测执行,但是对于减速器启用:
bin/hadoop jar -Dmapreduce.map.speculative=false \
-Dmapreduce.reduce.speculative=true <jar>