我正在使用 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:我设置的max split size小于min(一开始我设置错了后来发现了)
并且,根据输入拆分计算逻辑
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
谢谢,
最佳答案
在您指定的代码中:
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
关于Hadoop2.4.0 创建 39063 映射任务以在具有无效 Inputsplit 配置的本地模式下处理 10MB 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31437165/