我使用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