1

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

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

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

4

2 回答 2

3

假设两个映射器具有相同的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);
    }
}
于 2013-05-27T11:04:47.690 回答
0

在较高的层次上,我可以想象手头的问题有两种情况。

情况1:

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

案例二:

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

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

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

谢谢。

于 2016-05-20T15:26:27.653 回答