Hadoop2.4.0创建39063 Map任务,在本地模式下处理10MB文件,Inputsplit配置无效



我使用hadoop-2.4.0,除了下面的所有默认配置:

FileInputFormat.setInputPaths(job, new Path("in")); //10mb file;  just one file.
FileOutputFormat.setOutputPath(job, new Path("out"));
job.getConfiguration().set("mapred.max.split.size", "64");
job.getConfiguration().set("mapred.min.split.size", "128");

PS:我设置的最大分割大小小于最小(最初我设置错误,我意识到)

并且,根据inputsplit计算逻辑

max(minimumSize, min(maximumSize, blockSize))

max(128,min(64,128) --> 128MB,它比文件大小大,所以它应该只创建一个inputsplit(一个映射器)

我只是好奇框架如何计算39063映射每次当我在eclipse中运行这个程序?

日志:

2015-07-15 12:02:37 DEBUG LocalJobRunner Starting mapper thread pool executor.
2015-07-15 12:02:37 DEBUG LocalJobRunner Max local threads: 1
2015-07-15 12:02:37 DEBUG LocalJobRunner Map tasks to process: 39063
2015-07-15 12:02:38 INFO  LocalJobRunner Starting task: 
attempt_local192734774_0001_m_000000_0

谢谢,

在您的代码中指定:

job.getConfiguration().set("mapred.max.split.size", "64");
job.getConfiguration().set("mapred.min.split.size", "128");

以字节为单位计算。因此,您将获得高数量的Mapper。

我认为你应该这样写:

job.getConfiguration().set("mapred.min.split.size", 67108864);

67108864的值为64MB

计算:64*1024*1024 = 67108864

mapred.max.split.size基本上是用来组合小文件来定义分割大小,你正在处理大量的小文件和mapred.min.split.size是用来定义分割,你正在处理的大文件。

如果你使用的是YARN或MR2,那么你应该使用mapreduce.input.fileinputformat.split.minsize

相关内容

  • 没有找到相关文章

最新更新