我是Hadoop和MapReduce的新手。我在里面有一些目录和文件(每个文件10MB大,N可以是100。文件可能被压缩或未压缩),如:MyDir1/file1MyDir1/file2。。。MyDir1/fileN
MyDir2/file1MyDir2/file2。。。MyDir3/fileN
我想设计一个MapReduce应用程序,其中一个映射器或reducer将处理整个MyDir1,即我不希望MyDir1在多个映射器之间拆分。类似地,我希望MyDir2由其他映射器/还原器完全处理,而不进行拆分。
你知道怎么做吗?我需要编写自己的InputFormat并读取输入文件吗?
实现FileInputFormat#isSplitable()。然后,输入文件不会被分割,而是每个映射处理一个。请注意,尽管映射程序是并行执行的,但完成作业的时间取决于处理最大输入文件的时间。此外,这可能效率不高,因为会有大量数据在节点之间混洗。
import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapred.TextInputFormat;
public class NonSplittableTextInputFormat extends TextInputFormat {
@Override
protected boolean isSplitable(FileSystem fs, Path file) {
return false;
}
}
当前的API不允许单个映射器处理整个目录。您可能需要编写自己的InputFormat。或者创建一个要处理的目录列表,并将一个目录传递给每个要处理的映射器,同样,由于节点之间的数据混乱,这是无效的。
回到减速器,它们对映射器的输出KV对进行操作,而不是对输入文件/目录进行操作。