Java 具有多个数据源的两个映射器
我是两个地图绘制者Map1和Map2 Map1-读取HDFS中的seq文件并对其进行处理 Map2-读取HBASE并生成与Map1相同的键、值对 最后我将它们合并到Reduceral中 问题是只有一个映射器正在运行,并且作业完成时没有任何错误。只有最后一个映射程序正在运行(即Java 具有多个数据源的两个映射器,java,hadoop,mapreduce,hbase,mapper,Java,Hadoop,Mapreduce,Hbase,Mapper,我是两个地图绘制者Map1和Map2 Map1-读取HDFS中的seq文件并对其进行处理 Map2-读取HBASE并生成与Map1相同的键、值对 最后我将它们合并到Reduceral中 问题是只有一个映射器正在运行,并且作业完成时没有任何错误。只有最后一个映射程序正在运行(即TableMapReduceUtil)。如果我交换行TableMapReduceUtil和MultipleInputs,则最后一行即MultipleInputsmapper将运行 我做错了什么?两种情况下都不会引发错误。我还
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);
Map1
中的映射器将不同于Map2
Map1
是一个Mapper
,Map2
是一个TableMapper
PS:-如果这不正确,请让我知道,我尚未验证我在我的机器上展示的理解 啊!!我现在明白了。因此,如果我想运行两个映射程序并将其定向到同一个映射程序,我应该定义另一个作业吗?但是,那我怎么才能把它交给同一个减速机呢?直接交给同一个减速机吧*@gambit我想我们可以用三份工作。前两个作业只有映射器,第三个作业(合并步骤)有一个普通映射器,该映射器实际将输入写入“原样”输出,然后是一个减速机,该减速机实际对这些文件执行合并任务。我仍在努力想一个更好的方法来做这件事(这会有更好的表现)。请让我知道这是否有帮助。如果我找到更好的,我会发帖的。答案应该是有效的,OP使用了相同的工作。该评论有一位用户面临我的问题。你知道吗?我的错。你的情况不同。一时间,他的解决方案似乎也可以用于这种情况。删除旧注释以避免任何混淆。