如何将不同的数据集传递给同一作业的两个不同的映射器

时间:2015-09-23 10:35:31

标签: hadoop mapreduce apache-pig bigdata

我有一个Single Mapper,比如SingleGroupIdentifierMapper.java

现在,这是一个通用映射器,它根据使用缓存从驱​​动程序类传递给它的属性文件(包含过滤器和键值字段索引)对单行mapper输入值/记录进行所有过滤。

只有reducer业务逻辑是不同的,并且已经实现,保持映射器逻辑通用,并使用上面提到的PropertyFile实现。

现在我的问题陈述是我现在有来自多个来源的输入,具有不同的格式。这意味着我必须做一些像

这样的事情
 MultipleInputs.addInputPath(conf, new Path("/inputA"),TextInputFormat.class, SingleGroupIdentifierMapper.class);
MultipleInputs.addInputPath(conf, new Path("/inputB"),TextInputFormat.class, SingleGroupIdentifierMapper.class);

但是我从驱动程序类传递给映射器以实现基于字段索引的过滤器的缓存属性文件很常见,那么如何将两个不同的属性文件传递给同一个映射器,如果它处理,则输入A ,然后它将使用PropertyFileA(过滤和创建键值对),如果它处理,比如输入B,那么它将使用PropertyFileB(过滤并创建键值对)。

可以更改Mapper的通用代码来处理这种情况但是如何在Generic Class中解决这个问题,以及如果输入是来自inputA / inputB,如何在同一个Mapper类中识别并相应地应用dataFile配置数据。

我们可以将参数传递给此映射器类的构造函数,以指定它来自inputB,还是需要读取缓存中的哪个属性文件。?

例如:

MultipleInputs.addInputPath(conf,new Path(" / inputB"),TextInputFormat.class, args [] ,SingleGroupIdentifierMapper.class);

其中args []被传递给SingleGroupIdentifierMapper类的构造函数,我们将其定义为输入并将其设置为attribure。

欢迎任何想法或专业知识。

希望我能够清楚地表达我的问题,请问我,以防问题需要更清晰。

先谢谢, 干杯:)

1 个答案:

答案 0 :(得分:1)

不幸的是,MultipleInputs并不灵活。但是有一种解决方法可以将InputSplit路径与Mapper的setup方法中的属性文件相匹配。如果您没有使用任何类型的Combine * Format,则单个映射器将处理单个文件中的单个拆分:

  1. 将prop文件添加到缓存中时使用/ propfile_1#PROPS_A和/ propfile_2#PROPS_B
  2. 将输入路径添加到job.getConfiguration()。set(“PROPS_A”,“/ inputA”)和job.getConfiguration()。set(“PROPS_B”,“/ inputB”)
  3. 在Mapper.setup(Context context)方法中,使用context.getInputSplit()。toString()来获取拆分路径。比较它与context.getConfiguration()中保存的路径匹配.get(“PROPS_A”)或PROPS_B
  4. 如果您正在使用某些Combine * Format,而不是扩展它,请覆盖使用JobContext中的信息构建PathFilter []并调用createPool的getSplits,这将创建包含来自同一组文件的拆分( inputA或inputB)。