Ich habe ein MapReduce-Programm, das lokal korrekt ausgeführt wird.Übergabe einer Datei an Hadoop mit dem Argument -files
Es verwendet eine Datei neu positions.csv im Setup() -Methode der Mapper-Klasse namens eine Hash-Tabelle im Speicher zu füllen:
public void setup(Context context) throws IOException, InterruptedException {
newPositions = new Hashtable<String, Integer>();
File file = new File("new-positions.csv");
Scanner inputStream = new Scanner(file);
String line = null;
String firstline = inputStream.nextLine();
while(inputStream.hasNext()){
line = inputStream.nextLine();
String[] splitLine = line.split(",");
Integer id = Integer.valueOf(splitLine[0].trim());
// String firstname = splitLine[1].trim();
// String surname = splitLine[2].trim();
String[] emails = new String[4];
for (int i = 3; i < 7; i++) {
emails[i-3] = splitLine[i].trim();
}
for (String email : emails) {
if (!email.equals("")) newPositions.put(email, id);
}
// String position = splitLine[7].trim();
inputStream.close();
}
}
Das Java-Programm in eine ausführbare JAR exportiert wurde. JAR und full-positions.csv werden beide im selben Verzeichnis in unserem lokalen Dateisystem gespeichert.
Dann, während in diesem Verzeichnis wir folgende am Terminal ausführen (wir haben versucht, es auch mit dem vollständigen Pfadnamen für eine neue positions.csv):
hadoop jar MR2.jar Reader2 -files new-positions.csv InputDataset OutputFolder
Es führt in Ordnung, aber wenn es bekommt zum Mapper erhalten wir:
Error: java.io.FileNotFoundException: new-positions.csv (No such file or directory)
Diese Datei auf jeden Fall vor Ort vorhanden ist, und wir werden auf jeden Fall die Ausführung von in diesem Verzeichnis.
Wir folgen den Anweisungen in Hadoop: The Definitive Guide (4. Ausgabe), p. Ab 274 und kann nicht sehen, wie sich unser Programm und unsere Argumente in der Struktur unterscheiden.
Könnte es etwas mit der Hadoop-Konfiguration zu tun haben? Wir wissen, dass es Problemumgehungen gibt, z. B. das Kopieren der Datei nach HDFS und die anschließende Ausführung von dort, aber wir müssen verstehen, warum dieses Argument "-files" nicht wie erwartet funktioniert.
EDIT: Im Folgenden finden Sie einige Code aus dem Treiberklasse, die auch die Ursache des Problems sein kann:
public int run (String [] args) throws IOException, InterruptedException, ClassNotFoundException { if (args. Länge! = 5) { printUsage (this, ""); zurück 1; }
Configuration config = getConf();
FileSystem fs = FileSystem.get(config);
Job job = Job.getInstance(config);
job.setJarByClass(this.getClass());
FileInputFormat.addInputPath(job, new Path(args[3]));
// Delete old output if necessary
Path outPath = new Path(args[4]);
if (fs.exists(outPath))
fs.delete(outPath, true);
FileOutputFormat.setOutputPath(job, new Path(args[4]));
job.setInputFormatClass(SequenceFileInputFormat.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
job.setMapOutputKeyClass(EdgeWritable.class);
job.setMapOutputValueClass(NullWritable.class);
job.setMapperClass(MailReaderMapper.class);
job.setReducerClass(MailReaderReducer.class);
job.setJar("MR2.jar");
boolean status = job.waitForCompletion(true);
return status ? 0 : 1;
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new Reader2(), args);
System.exit(exitCode);
}
Neuer Befehl sieht so aus: hadoop jar MR2.jar Reader2-Dateien file: ///home/local/xxx360/FinalProject/new-positions.csv InputDataset OutputFolder ... und ich bekomme den gleichen Fehler beim Zugriff " new-positions.csv "im Java-Programm. Ist es wahrscheinlich etwas in unserer Hadoop-Konfiguration? – ajrwhite
Geben Sie den gesamten Pfad in Anführungszeichen –
Immer noch nicht funktioniert - ich frage mich, ob das Problem in meiner Treiberklasse ist. Ich werde die Hauptfrage mit zusätzlichen Informationen bearbeiten. – ajrwhite