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);
}
}
2条答案
按热度按时间bvk5enib1#
在高层次上,有两种情况我可以想象的问题在手。
案例1:
如果您试图在两个Map器类中编写相同的实现来处理相同的输入文件,而仅仅是为了有效地利用资源,那么这可能不是正确的方法。因为,当一个文件保存在集群中时,它会被划分成块并跨数据节点复制。这基本上为您提供了最有效的资源利用率,因为同一输入文件的所有数据块都是并行处理的。
案例2:
如果您正尝试编写两个不同的Map器实现(使用它们自己的业务逻辑),那么对于您希望根据业务需求执行的特定工作流。是的,您可以使用multipleinputs类将相同的输入文件传递给两个不同的Map器。
这只能是一个基于您想要实现的解决方案。
谢谢。
nkkqxpd92#
假设两个Map器具有相同的
K,V
签名时,可以使用委派Map器,然后调用两个Map器的Map方法: