我正在使用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 calucaiton logic
max(minimumSize, min(maximumSize, blockSize))
max(128,min(64,128) --> 128MB
并且它比文件大小好,因此它应该只创建一个inputsplit(一个映射器)
我只是好奇每次在eclipse中运行这个程序时框架如何计算 39063 映射器?
日志:
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
谢谢,
答案 0 :(得分:2)
在您的代码中指定了:
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
是basicall用于将小文件与defint拆分大小组合在一起处理大量小文件,mapred.min.split.size
用于定义处理大文件的拆分。
如果您使用YARN或MR2,则应使用mapreduce.input.fileinputformat.split.minsize