2011-10-18 7 views
42

-put e -copyFromLocal sono documentati come identici, mentre la maggior parte degli esempi utilizza la variante verbose -copyFromLocal. Perché?Differenza tra hadoop fs -put e hadoop fs -copyFromLocal

Stessa cosa per -get e -copyToLocal

+0

si prega di controllare questo collegamento che ha menzionato i dettagli nel livello di codice sorgente http://hakunamapdata.com/why-put-is-better-than-copyfromlocal-when-coping-files-to-hdfs/ –

risposta

53
  • copyFromLocal è simile a mettere comando, tranne che la sorgente sia limitato a un riferimento file locale.

Quindi, in pratica si può fare con mettere, tutto quello che si fa con copyFromLocal, ma non viceversa.

Allo stesso modo,

  • copyToLocal è simile a ottenere comando, salvo che la destinazione è limitato a un file riferimento locale.

Quindi, è possibile utilizzare ottenere invece di copyToLocal, ma non viceversa.

Riferimento: Hadoop's documentation.

Aggiornamento: per l'ultimo a ottobre 2015, vedere la risposta this di seguito.

35

Facciamo un esempio: Se il HDFS contiene il percorso: /tmp/dir/abc.txt E se il vostro disco locale contiene anche questa strada quindi l'API HDFS non saprà quale vuoi dire, se non si specifica uno schema simile file:// o hdfs:// . Forse scegli il percorso che non volevi copiare.

Pertanto si ha -copyFromLocal che impedisce di copiare accidentalmente il file errato, limitando il parametro assegnato al file system locale.

Put è per gli utenti più esperti che conoscono quale schema mettere di fronte.

È sempre un po 'di confusione per i nuovi utenti di Hadoop quali sono i filesystem in cui si trovano attualmente e dove sono effettivamente i loro file.

+1

Cosa intendi da "l'API hdfs non saprà quale intendi"? Per "-put" la fonte è sempre il primo argomento. O vuoi dire che alcuni utenti potrebbero confondere '-put' con '-get'? – snappy

+0

No, nessuno dei due modi. Stiamo parlando di due diversi file system qui. HDFS e file system locale (ad esempio ext4). Usando 'bin/hadoop fs -put/tmp/somepath/user/hadoop/somepath' il comando in realtà non sa se'/tmp/somepath' esiste in entrambi i filesystem, o solo nel filesystem locale. Stessa cosa con il percorso di destinazione. –

+7

Quindi il primo parametro non è sempre un percorso fs locale, per così dire. Puoi "mettere" da un HDFS a un altro, se lo desideri. '-copyFromLocal' farà in modo che prelevi dal disco locale e carichi su HDFS. –

2
  • entrambi sono uguali, tranne
  • copyFromLocal è limitato a copiare da locale mentre put può prendere file da qualsiasi (altri HDFS/filesystem locale/..)
10

Nonostante quanto sostenuto dalla documentazione , a partire da ora (ottobre 2015), sia -copyFromLocal e -put sono gli stessi.

Dalla guida in linea:

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

E questo è confermato dal looking at the sources, dove si può vedere che la classe CopyFromLocal estende la classe Put, ma senza aggiungere alcun nuovo comportamento:

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."; 
    } 

Come puoi notare, questo è esattamente lo stesso per get/copyToLocal.

0

Entrambi i comandi 'put' & 'copyFromLocal' funzionano esattamente allo stesso modo. Non è possibile utilizzare il comando 'put' per copiare i file da una directory hdfs a un'altra. Vediamolo con un esempio: diciamo che la tua root ha due directory, chiamate 'test1' e 'test2'. Se 'test1' contiene un file 'customer.txt' e si prova a copiarlo nella directory test2
$ hadoop fs -put /test1/customer.txt/test2 Ciò causerà 'nessun errore di file o directory' dal ' mettere 'cercherà il file nel file system locale e non hdfs. Entrambi sono pensati per copiare solo file (o directory) dal file system locale a hdfs.

+0

Forse se specifichi il filesystem nel primo argomento, non leggerà il locale? 'hadoop fs -put hdfs: ///test1/customer.txt hdfs: /// test2'? –