2012-01-12 64 views
2

我是Hadoop和MapReduce的新手。我有这个范围内某些目录和文件(每个文件10 MB大和N可能是100文件可以压缩或解压缩),如: MyDir1 /文件1 MyDir1 /文件2 ... MyDir1/fileN一个映射器或一个reducer来处理一个文件或目录

MyDir2 /文件1 MyDir2 /文件2 ... MyDir3/fileN

我想设计一个MapReduce的应用程序,其中一个映射或减速将处理整个MyDir1即我不想让MyDir1在多个映射器进行分割。同样,我希望MyDir2可以完全由其他映射器/缩减器进行处理而不会分裂。

关于如何去做这件事的任何想法?我是否需要编写自己的InputFormat并读取输入文件?

+0

我其实有两个相同的要求。我需要不要拆分文件,因为文件顶部有标题信息。我需要一个每个映射器的目录,以便我可以处理该目录中的文件,以便排序文件(按日期/时间)比排序单个行要高效得多。 – MikeKulls 2014-08-29 04:55:55

回答

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。否则,创建一个待处理的目录列表,并将每个目录传递给每个映射器以进行处理,同样由于节点之间的数据混排,效率不高。

回到还原器,它们对映射器的输出KV对进行操作,而不是输入文件/目录。

+0

如果这个类是在另一个类中定义的,看起来像是MR的标准,那么它将需要被标记为静态。 – MikeKulls 2014-09-02 00:22:32

+0

@Praveen:你能告诉我为什么在这种情况下会有大量的数据混洗? – 2015-11-17 04:20:14

+0

@vishnu:因为在这种特定的方法中,不能保证地图正在运行的节点中存在数据。所以,地图处理最有可能从另一个节点获取数据 – Bala 2016-06-29 10:30:07

相关问题