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

Java 具有多个数据源的两个映射器,java,hadoop,mapreduce,hbase,mapper,Java,Hadoop,Mapreduce,Hbase,Mapper,我是两个地图绘制者Map1和Map2 Map1-读取HDFS中的seq文件并对其进行处理 Map2-读取HBASE并生成与Map1相同的键、值对 最后我将它们合并到Reduceral中 问题是只有一个映射器正在运行,并且作业完成时没有任何错误。只有最后一个映射程序正在运行(即TableMapReduceUtil)。如果我交换行TableMapReduceUtil和MultipleInputs,则最后一行即MultipleInputsmapper将运行 我做错了什么?两种情况下都不会引发错误。我还

我是两个地图绘制者Map1和Map2

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

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

最后我将它们合并到Reduceral中

问题是只有一个映射器正在运行,并且作业完成时没有任何错误。只有最后一个映射程序正在运行(即
TableMapReduceUtil
)。如果我交换行
TableMapReduceUtil
MultipleInputs
,则最后一行即
MultipleInputs
mapper将运行

我做错了什么?两种情况下都不会引发错误。我还使用
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);
  }

我相信这种行为是由以下两方面造成的:

MultipleInputs.addInputPath(job3, new Path(args[6]), SequenceFileInputFormat.class, Map1.class);
 TableMapReduceUtil.initTableMapperJob(
      "hbasetable",
      scan,
      Map2.class,
      ImmutableBytesWritable.class,
      ImmutableBytesWritable.class,
      job3); 
  • 只有一个作业job3
  • 尽管您提到有两种映射器,但请查看映射器类型。
    Map1
    中的映射器将不同于
    Map2
    Map1
    是一个
    Mapper
    Map2
    是一个
    TableMapper
  • 将这两条语句放在一起并不意味着它们本质上是在job3的多输入设置中组合在一起的。对于Map1,多个输入仍然只有一个设置。Map2的另一个设置仍然是独立的
  • 现在执行死刑。两种配置MultipleInputs或TableMapReduceUtil中的后一种配置覆盖了job3中的前一种配置,因此只执行一个映射器

  • PS:-如果这不正确,请让我知道,我尚未验证我在我的机器上展示的理解

    啊!!我现在明白了。因此,如果我想运行两个映射程序并将其定向到同一个映射程序,我应该定义另一个作业吗?但是,那我怎么才能把它交给同一个减速机呢?直接交给同一个减速机吧*@gambit我想我们可以用三份工作。前两个作业只有映射器,第三个作业(合并步骤)有一个普通映射器,该映射器实际将输入写入“原样”输出,然后是一个减速机,该减速机实际对这些文件执行合并任务。我仍在努力想一个更好的方法来做这件事(这会有更好的表现)。请让我知道这是否有帮助。如果我找到更好的,我会发帖的。答案应该是有效的,OP使用了相同的工作。该评论有一位用户面临我的问题。你知道吗?我的错。你的情况不同。一时间,他的解决方案似乎也可以用于这种情况。删除旧注释以避免任何混淆。