在Hadoop中同时在同一文件上使用两个Mapper

时间:2013-05-27 07:31:24

标签: hadoop mapreduce hdfs distributed-computing

假设有一个文件和两个不同的独立映射器并行执行该文件。为此,我们需要使用该文件的副本。

我想知道的是“是否可以为两个映射器使用相同的文件”,这反过来会降低资源利用率并使系统时间有效。

此领域是否有任何研究或Hadoop中的任何现有工具可以帮助克服这一点。

2 个答案:

答案 0 :(得分:3)

假设两个Mappers都有相同的K,V签名,您可以使用委托映射器,然后调用两个映射器的map方法:

public class DelegatingMapper extends Mapper<LongWritable, Text, Text, Text> {
    public Mapper<LongWritable, Text, Text, Text> mapper1;
    public Mapper<LongWritable, Text, Text, Text> mapper2;

    protected void setup(Context context) {
        mapper1 = new MyMapper1<LongWritable, Text, Text, Text>();
        mapper1.setup(context);

        mapper2 = new MyMapper1<LongWritable, Text, Text, Text>();
        mapper2.setup(context);
    }

    public void map(LongWritable key, Text value, Context context) {
        // your map methods will need to be public for each class
        mapper1.map(key, value, context);
        mapper2.map(key, value, context);
    }

    protected void cleanup(Context context) {
        mapper1.cleanup(context);
        mapper2.cleanup(context);
    }
}

答案 1 :(得分:0)

在很高的层面上,我手边的问题可以想象出两种情况。

案例1:

如果您尝试在两个Mapper类中编写 SAME 实现来处理相同的输入文件,其唯一目的是有效利用资源,这可能不是正确的方法。因为,当文件保存在群集中时,它会被分成块并在数据节点之间复制。 这基本上为您提供了最有效的资源利用率,因为同一输入文件的所有数据块都在PARALLEL中处理。

案例2:

如果您正在尝试编写两个 DIFFERENT Mapper实现(具有自己的业务逻辑),则可以根据业务需求执行某些特定工作流。是的,您可以使用 MultipleInputs 类将相同的输入文件传递给两个不同的映射器。

MultipleInputs.addInputPath(job, file1, TextInputFormat.class, Mapper1.class);
MultipleInputs.addInputPath(job, file1, TextInputFormat.class, Mapper2.class);

这可能只是基于您要实现的内容的解决方法。

感谢。