假设有一个文件和两个不同的独立映射器要在该文件上并行执行。为此,我们需要使用该文件的副本。
我想知道的是“两个映射器是否可以使用相同的文件”,这反过来会降低资源利用率并提高系统时间效率。
是否有该领域的任何研究或 Hadoop 中的任何现有工具可以帮助克服这一点。
假设有一个文件和两个不同的独立映射器要在该文件上并行执行。为此,我们需要使用该文件的副本。
我想知道的是“两个映射器是否可以使用相同的文件”,这反过来会降低资源利用率并提高系统时间效率。
是否有该领域的任何研究或 Hadoop 中的任何现有工具可以帮助克服这一点。
假设两个映射器具有相同的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:
如果您尝试在两个 Mapper 类中编写相同的实现来处理相同的输入文件,其唯一目的是有效利用资源,那么这可能不是正确的方法。因为,当文件保存在集群中时,它会被分成块并跨数据节点复制。这基本上为您提供了最有效的资源利用,因为同一输入文件的所有数据块都在 PARALLEL 中处理。
案例二:
如果您尝试编写两个不同的 Mapper 实现(具有自己的业务逻辑),则对于您希望根据业务需求执行的某些特定工作流。是的,您可以使用MultipleInputs类将相同的输入文件传递给两个不同的映射器。
MultipleInputs.addInputPath(job, file1, TextInputFormat.class, Mapper1.class);
MultipleInputs.addInputPath(job, file1, TextInputFormat.class, Mapper2.class);
这只能是基于您想要实现的解决方法。
谢谢。