Ich bin schrieb 2 Mapper Map1 und Map2Zwei Mapper mit mehreren Datenquellen
Map1- liest eine Seq-Datei in HDFS und verarbeitet sie.
Map2 - liest von HBASE und erzeugt denselben Schlüssel, Wertpaar wie Map1.
Schließlich füge ich sie in ReducerAll zusammen.
Das Problem ist, dass nur einer der Mapper ausgeführt wird und der Job ohne Fehler abgeschlossen wird. Nur der letzte Mapper läuft (d. H. TableMapReduceUtil
). Wenn ich die Zeilen TableMapReduceUtil
und MultipleInputs
austausche, dann läuft der letzte, d.h. MultipleInputs
Mapper.
Was mache ich hier falsch? Für beide Szenarien werden keine Fehler ausgegeben. Ich lese auch 2 Dateien mit addCacheFile()
für die Verarbeitung, aber das ist hier egal, denke ich.
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);
}
Ah! Ich verstehe jetzt. Also, wenn ich beide Mapper laufen lassen und sie zum selben Mapper leiten möchte, sollte ich dann einen anderen Job definieren? Aber dann, wie kann ich es demselben Reduzierer geben? – gambit
direkt auf den gleichen Reducer * – gambit
@gambit Ich denke, wir können drei Arbeitsplätze nutzen. Erste zwei Jobs mit nur Mappern und ein dritter Job (Merge-Schritt) mit einem einfachen Mapper, der praktisch die Eingabe so schreibt, wie sie ist, und dann einen Reduzierer, der tatsächlich eine Zusammenführungsaufgabe für diese Dateien durchführt. Ich versuche immer noch, einen Weg zu finden, es besser zu machen (was eine bessere Leistung bringt). Bitte lassen Sie mich wissen, ob das hilft. Wird posten wenn ich etwas besseres finde. – Amal