一个映射器或一个reducer来处理一个文件或目录

时间:2012-01-12 07:05:44

标签: hadoop mapreduce

我是Hadoop和MapReduce的新手。我有一些目录和文件(每个文件10 MB大,N可以是100.文件可以压缩或未压缩),如: MyDir1 /文件1 MyDir1 /文件2 ... MyDir1 / fileN

MyDir2 / file1的 MyDir2 /文件2 ... MyDir3 / fileN

我想设计一个MapReduce应用程序,其中一个mapper或reducer将处理整个MyDir1,即我不希望MyDir1被分割为多个映射器。同样地,我希望MyDir2完全由其他mapper / reducer处理而不会分裂。

关于如何解决这个问题的任何想法?我是否需要编写自己的InputFormat并读取输入文件?

1 个答案:

答案 0 :(得分:5)

实施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。或者创建一个要处理的目录列表,并将一个目录传递给每个要处理的映射器,由于节点之间的数据混乱,这也是无效的。

回到Reducer,它们依赖于映射器的输出KV对,而不是输入文件/目录。