it-swarm.com.de

Unterschied zwischen hadoop fs -put und hadoop fs -copyFromLocal

-put und -copyFromLocal sind als identisch dokumentiert, während die meisten Beispiele die ausführliche Variante -copyFromLocal verwenden. Warum?

Gleiches für -get und -copyToLocal

47
snappy
  • copyFromLocal ähnelt dem Befehl put, mit der Ausnahme, dass die Quelle auf eine lokale -Datenreferenz beschränkt ist.

Im Grunde können Sie mit put alles tun, was Sie mit copyFromLocal tun, aber nicht umgekehrt.

Ähnlich, 

  • copyToLocal ähnelt dem Befehl get, mit der Ausnahme, dass das Ziel auf eine lokale Datei beschränkt ist.

Daher können Sie get anstelle von copyToLocal verwenden, jedoch nicht umgekehrt.

Referenz: Hadoops Dokumentation .

Update: Für die neueste Version vom Oktober 2015 siehe diese Antwort unten.

57
Ozair Kafray

Nehmen wir ein Beispiel: Wenn Ihr HDFS den Pfad enthält: /tmp/dir/abc.txt Und wenn Ihre lokale Festplatte auch diesen Pfad enthält, weiß die HDFS-API nicht, welche Sie meinen, sofern Sie kein Schema wie file:// oder hdfs:// angeben. . Vielleicht wählt es den Pfad, den Sie nicht kopieren wollten.

Daher haben Sie -copyFromLocal, der Sie daran hindert, versehentlich die falsche Datei zu kopieren, indem Sie den Parameter, den Sie angeben, auf das lokale Dateisystem beschränken.

Put ist für fortgeschrittene Benutzer gedacht, die wissen, welches Schema sie verwenden sollen. 

Für neue Hadoop-Benutzer ist es immer etwas verwirrend, in welchem ​​Dateisystem sie sich derzeit befinden und wo sich ihre Dateien tatsächlich befinden.

37
Thomas Jungblut

Ungeachtet dessen, was von der Dokumentation behauptet wird (Stand Oktober 2015), sind sowohl -copyFromLocal als auch -put gleich.

Aus der Online-Hilfe:

[[email protected] ~]$ hdfs dfs -help copyFromLocal 
-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst> :
  Identical to the -put command.

Und dies wird bestätigt durch beim Betrachten der Quellen , wo Sie sehen können, dass die CopyFromLocal-Klasse die Put-Klasse erweitert, ohne jedoch neues Verhalten hinzuzufügen:

  public static class CopyFromLocal extends Put {
    public static final String NAME = "copyFromLocal";
    public static final String USAGE = Put.USAGE;
    public static final String DESCRIPTION = "Identical to the -put command.";
  }

  public static class CopyToLocal extends Get {
    public static final String NAME = "copyToLocal";
    public static final String USAGE = Get.USAGE;
    public static final String DESCRIPTION = "Identical to the -get command.";
  }

Wie Sie vielleicht bemerken, ist dies für get/copyToLocal genau dasselbe.

17
Sylvain Leroux
  • beide sind gleich, außer 
  • copyFromLocal darf nur von lokalen kopiert werden, put kann Dateien von jedem beliebigen (anderen hdfs/local filesystem/..)
2
Manish Agrawal

Die beiden Befehle put und copyFromLocal funktionieren genau gleich. Sie können den Befehl 'put' nicht verwenden, um Dateien von einem HDFS-Verzeichnis in ein anderes zu kopieren. Sehen wir uns dies mit einem Beispiel an: Nehmen wir an, Ihr Root hat zwei Verzeichnisse mit den Namen 'test1' und 'test2'. Wenn 'test1' eine Datei 'customer.txt' enthält und Sie versuchen, sie in das Verzeichnis test2 zu kopieren
$ hadoop fs -put /test1/customer.txt /test2Dies führt zu einem Fehler "Keine solche Datei oder Verzeichnis", da "put" die Datei im lokalen Dateisystem und nicht in HDFS sucht. Sie sind beide nur zum Kopieren von Dateien (oder Verzeichnissen) vom lokalen Dateisystem in hdfs gedacht.

0
Roney J