我写了2个映射器Map1和Map2
Map1-读取HDFS中的seq文件并进行处理。
Map2-从HBASE读取并生成与Map1相同的键值对。
最后我将它们合并到ReducerAll中。
问题是只有一个映射器正在运行,并且作业完成没有任何错误。只有最后一个映射器正在运行(即TableMapReduceUtil
)。如果我更换了行TableMapReduceUtil
和MultipleInputs
,那么最后一行即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);
}
答案 0 :(得分:0)
我认为这种行为是由于以下两行: -
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