在Hadoop中同时在同一文件上使用两个映射器

在Hadoop中同时在同一文件上使用两个映射器,hadoop,mapreduce,hdfs,distributed-computing,Hadoop,Mapreduce,Hdfs,Distributed Computing,假设有一个文件和两个不同的独立映射器并行地在该文件上执行。为此,我们需要使用该文件的副本 我想知道的是“两个映射器是否可以使用同一个文件”,这反过来会降低资源利用率,并使系统具有时间效率 Hadoop中是否有任何这方面的研究或现有工具可以帮助克服这一问题。假设两个映射器具有相同的K,V签名,您可以使用一个委派映射器,然后调用两个映射器的映射方法: public class DelegatingMapper extends Mapper<LongWritable, Text, Text, T

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

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


Hadoop中是否有任何这方面的研究或现有工具可以帮助克服这一问题。

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

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);
    }
}
public类DelegatingMapper扩展了Mapper{
公共地图绘制者1;
公共制图员mapper2;
受保护的无效设置(上下文){
mapper1=新的MyMapper1();
mapper1.设置(上下文);
mapper2=新的MyMapper1();
mapper2.设置(上下文);
}
公共void映射(可长写键、文本值、上下文){
//对于每个类,您的映射方法都需要是公共的
mapper1.map(键、值、上下文);
mapper2.map(键、值、上下文);
}
受保护的空洞清理(上下文){
mapper1.cleanup(上下文);
mapper2.cleanup(上下文);
}
}

从更高的层面上讲,我可以想象有两种情况下这个问题在手

案例1:

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

案例2:

如果您正试图编写两个不同的映射器实现(使用它们自己的业务逻辑),则针对您希望根据业务需求执行的特定工作流。是的,您可以使用多输入类将同一输入文件传递给两个不同的映射器

MultipleInputs.addInputPath(job, file1, TextInputFormat.class, Mapper1.class);
MultipleInputs.addInputPath(job, file1, TextInputFormat.class, Mapper2.class);
这只能是基于您想要实现的解决方案


谢谢。

我不知道你在问什么。一个大文件被分成多个块,每个块都由不同的映射器处理。你能澄清你的问题吗?你的两个不同的独立映射器的输出是什么?如果类型相同。通过将两个映射器打包到一个映射器中,很容易做到这一点。