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

sun*_*llp 2 hadoop mapreduce

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

MyDir2/file1 MyDir2/file2 ... MyDir3/fileN

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

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

Pra*_*ati 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当前的API不允许单个映射器处理整个目录.您可能必须编写自己的InputFormat.或者创建一个要处理的目录列表,并将一个目录传递给每个要处理的映射器,由于节点之间的数据混乱,这也是无效的.

回到Reducer,它们操作来自映射器的输出KV对而不是输入文件/目录.