2016-05-17 10 views
2

Ich möchte einen Wert in der Map-Aufgabe auf der lokalen Festplatte in jedem Datenknoten speichern. Zum BeispielSchreiben von Daten auf die lokale Festplatte in jedem Datenknoten

public void map (...) { 
    //Process 
    List<Object> cache = new ArrayList<Object>(); 
    //Add value to cache 
    //Serialize cache to local file in this data node 
} 

Wie kann ich speichern diese Cache-Objekt auf der lokalen Festplatte in jedem Datenknoten, denn wenn ich diesen Cache in Map-Funktion speichern, wie oben, dann wird die Leistung, da I/O-Task schrecklich sein?

Ich meine, gibt es eine Möglichkeit, auf Map-Task in diesem Datenknoten vollständig zu laufen warten und dann werden wir diesen Cache in lokalen Datenträger speichern? Oder hat Hadoop eine Funktion, dieses Problem zu lösen?

+0

bitte unten Antwort sehen, Hoffnung es hilft. –

Antwort

2

Im folgenden Beispiel wird die erstellte Datei irgendwo unter den Verzeichnissen angezeigt, die von NodeManager für Container verwendet werden. Dies ist Konfigurationseigenschaft yarn.nodemanager.local-dirs in Garn-site.xml oder der Standard von Garn-default.xml geerbt, die unter /tmp

ist Please see @Chris Nauroth answer, Which says that Its just for debugging purpose and It's not recommended as a permanent production configuration. It was clearly described why it was not recommended.

public void map(Object key, Text value, Context context) 
     throws IOException, InterruptedException { 
    // do some hadoop stuff, like counting words 
    String path = "newFile.txt"; 
    try { 
     File f = new File(path); 
     f.createNewFile(); 
    } catch (IOException e) { 
     System.out.println("Message easy to look up in the logs."); 
     System.err.println("Error easy to look up in the logs."); 
     e.printStackTrace(); 
     throw e; 
    } 
} 
+0

Vielen Dank, dass Sie erfahren haben, wie Sie eine lokale Datei im Datenknoten erstellen können. Aber wie wäre es, diese Datei mit einem Datenknoten zu serialisieren, wie ich es in meiner Frage erwähnt habe? Wenn wir es in map function() serialisieren, dann zum Beispiel, wenn inputsplit 1000 Datensätze hat, dann ruft das Programm 1000 mal serialize funciton() auf? Gibt es irgendwelche, um ein Objekt zu serialisieren, wenn Aufgabenfunktion() vollständig in jedem Knoten fertig ist – nd07

+1

Wie ich verstand, dass Sie 1000 Datensätze oder die Anzahl der Datensätze, die Sie durch map-Methode verarbeiten möchten. Ich denke, Sie können Dateihandle in Setup öffnen und in Cleanup-Methoden schließen. In map-Methode können Sie alle Ihre Datensätze im Append-Modus schreiben. Wäre das für Ihre Anforderung in Ordnung? nochmal! Punkte, die in der Antwort von Chris Nauroth erwähnt werden, sind anwendbar. Du kannst es versuchen. Thx –

+0

Danke für Ihre Unterstützung! – nd07