2016-04-18 8 views
0

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); 
} 

Antwort

0

Nehmen wir an, dass Ihre "new-positions.csv" im Verzeichnis vorhanden ist: H:/HDP/, dann müssen Sie diese Datei passieren, wie:

file:///H:/HDP/new-positions.csv

Sie benötigen Pfad zu qualifizieren mit file:///, um anzuzeigen, dass es sich um einen lokalen Dateisystempfad handelt. Außerdem müssen Sie den vollständig qualifizierten Pfad übergeben.

Das funktioniert perfekt für mich.

Zum Beispiel gebe ich die lokale Datei myini.ini wie folgt:

yarn jar hadoop-mapreduce-examples-2.4.0.2.1.5.0-2060.jar teragen -files "file:///H:/HDP/hadoop-2.4.0.2.1.5.0-2060/share/hadoop/common/myini.ini" -Dmapreduce.job.maps=10 10737418 /usr/teraout/

+0

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

+0

Geben Sie den gesamten Pfad in Anführungszeichen –

+0

Immer noch nicht funktioniert - ich frage mich, ob das Problem in meiner Treiberklasse ist. Ich werde die Hauptfrage mit zusätzlichen Informationen bearbeiten. – ajrwhite

0

denke ich Manjunath Ballur gab dir eine richtige Antwort, aber die URI, die Sie übergeben, file:///home/local/xxx360/FinalProject/new-positions.csv kann nicht aus dem Hadoop auflösbar sein Arbeiter Maschine.

Dieser Pfad sieht wie ein absoluter Pfad auf einer Maschine aus, aber welche Maschine enthält home? Fügen Sie dem Pfad einen Server hinzu und ich denke, dass es funktionieren könnte.

Wenn Sie alternativ die Einzahl -file verwenden, sieht es so aus, als ob Hadoop die Datei kopiert, anstatt eine symbolische Verknüpfung zu erstellen, wie es bei -files der Fall ist.

Siehe Dokumentation here.

Verwandte Themen