假设有一个文件和两个不同的独立映射器并行执行该文件。为此,我们需要使用该文件的副本。
我想知道的是“是否可以为两个映射器使用相同的文件”,这反过来会降低资源利用率并使系统时间有效。
此领域是否有任何研究或Hadoop中的任何现有工具可以帮助克服这一点。
答案 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);
这可能只是基于您要实现的内容的解决方法。
感谢。