两个具有多个数据源的映射器

时间:2016-04-18 15:48:46

标签: java hadoop mapreduce hbase mapper

我写了2个映射器Map1和Map2

Map1-读取HDFS中的seq文件并进行处理。

Map2-从HBASE读取并生成与Map1相同的键值对。

最后我将它们合并到ReducerAll中。

问题是只有一个映射器正在运行,并且作业完成没有任何错误。只有最后一个映射器正在运行(即TableMapReduceUtil)。如果我更换了行TableMapReduceUtilMultipleInputs,那么最后一行即MultipleInputs映射器就会运行。

我在这里做错了什么?两种方案都不会引发错误。我还使用addCacheFile()读取了2个文件进行处理,但我认为这无关紧要。

Job job3 = Job.getInstance(config, "Test");
if (true) {


  job3.setJarByClass(Main.class);


  job3.setMapOutputKeyClass(ImmutableBytesWritable.class);
  job3.setMapOutputValueClass(ImmutableBytesWritable.class);
  job3.setOutputKeyClass(ImmutableBytesWritable.class);
  job3.setOutputValueClass(ImmutableBytesWritable.class);


  job3.getConfiguration().set("StartDate", c_startDate);
  job3.getConfiguration().set("EndDate", c_endDate);


  job3.addCacheFile(new URI(args[8]));
  job3.getConfiguration().set("abc", args[8].substring(args[8].lastIndexOf("/") + 1));

  job3.addCacheFile(new URI(args[9]));
  job3.getConfiguration().set("xyz", args[9].substring(args[9].lastIndexOf("/") + 1));
  job3.setReducerClass(ReducerAll.class);
  job3.setOutputFormatClass(SequenceFileOutputFormat.class);

  job3.setNumReduceTasks(10);

  Scan scan = new Scan();
  scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, Bytes.toBytes("hbasetable"));
  scan.setCaching(300);
  scan.setCacheBlocks(false);

  MultipleInputs.addInputPath(job3, new Path(args[6]), SequenceFileInputFormat.class, Map1.class);
  TableMapReduceUtil.initTableMapperJob(
          "hbasetable",
          scan,
          Map2.class,
          ImmutableBytesWritable.class,
          ImmutableBytesWritable.class,
          job3);


  FileOutputFormat.setOutputPath(job3, new Path(args[7]));
  job3.waitForCompletion(true);
  if (!job3.waitForCompletion(true)) {
    return (1);
  }

1 个答案:

答案 0 :(得分:0)

我认为这种行为是由于以下两行: -

MultipleInputs.addInputPath(job3, new Path(args[6]), SequenceFileInputFormat.class, Map1.class);
 TableMapReduceUtil.initTableMapperJob(
      "hbasetable",
      scan,
      Map2.class,
      ImmutableBytesWritable.class,
      ImmutableBytesWritable.class,
      job3); 
  1. 只有一份工作 job3
  2. 虽然您已经提到有两个映射器,但请查看映射器类型。 Map1中的映射器与Map2不同Map1MapperMap2TableMapper
  3. 将两个语句保持在一起并不意味着它们基本上在 job3 的MultipleInputs 设置中进行了分组。 MultipleInputs仍然只有一个Map1的设置。 Map2的其他设置仍然是独立的。
  4. 现在执行。两个配置中的后一个MultipleInputs或TableMapReduceUtil覆盖 job3 中的前一个配置,因此只执行一个映射器
  5. PS: - 如果这不正确,请告诉我,我还要验证我在机器上提供的理解。