2011-10-18 38 views
42

-put y -copyFromLocal se documentan como idénticos, mientras que la mayoría de los ejemplos utilizan la variante verbose -copyFromLocal. ¿Por qué?La diferencia entre hadoop fs -put y hadoop fs -copyFromLocal

Lo mismo para -get y -copyToLocal

+0

Por favor, consulte este enlace que menciona los detalles en el nivel del código fuente http://hakunamapdata.com/why-put-is-better-han-copyfromlocal-when-coping-files-to-hdfs/ –

Respuesta

53
  • copyFromLocal es similar a poner de comandos, excepto que la fuente está restringida a una referencia archivo local.

Así que, básicamente, se puede hacer con poner, todo lo que hacen con copyFromLocal, pero no viceversa.

Del mismo modo,

  • copyToLocal es similar a obtener de comandos, excepto que el destino se restringido a un archivo de referencia local.

Por lo tanto, se puede utilizar obtener en lugar de copyToLocal, pero no a la inversa.

Referencia: Hadoop's documentation.

Actualización: Para la última a partir de octubre de 2015, por favor vea this respuesta a continuación.

35

Vamos a hacer un ejemplo: Si su HDFS contiene la ruta: /tmp/dir/abc.txt Y si el disco local también contiene este camino entonces el API hdfs no sabrá cuál quiere decir, a menos que especifique un esquema como file:// o hdfs:// . Quizás escoja el camino que no quisiste copiar.

Por lo tanto, tiene -copyFromLocal que le impide copiar accidentalmente el archivo incorrecto, limitando el parámetro que le da al sistema de archivos local.

Put es para usuarios más avanzados que saben qué esquema para poner delante.

Siempre es un poco confuso para los nuevos usuarios de Hadoop qué sistema de archivos que se encuentran actualmente en sus archivos y donde realmente son.

+1

¿A qué se refiere? por "la API hdfs no sabrá a cuál te refieres"? Para '-put' la fuente siempre es el primer argumento. ¿O quiere decir que algunos usuarios pueden confundir '-put' con '-get'? – snappy

+0

No, de ninguna manera. Estamos hablando de dos sistemas de archivos diferentes aquí. HDFS y el sistema de archivos local (digamos ext4). Al usar 'bin/hadoop fs -put/tmp/somepath/user/hadoop/somepath' el comando en realidad no sabe si'/tmp/somepath' existe en ambos sistemas de archivos, o simplemente en el sistema de archivos local. Lo mismo con la ruta de destino. –

+7

Así que el primer parámetro no es siempre una ruta fs local, por así decirlo. Puede 'poner' de un HDFS a otro si lo desea. '-copyFromLocal' se asegurará de que solo seleccione desde el disco local y cargue en HDFS. –

2
  • ambos son iguales, excepto
  • copyFromLocal se limita a copiar desde el local, mientras que put puede tomar de cualquier archivo (otros hdfs/sistema de ficheros local/..)
10

A pesar de lo que se afirma en la documentación , a partir de ahora (Oct. 2015), tanto -copyFromLocal y -put son los mismos.

De la ayuda en línea:

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

Y esto es confirmado por looking at the sources, donde se puede ver que la clase CopyFromLocal extiende la clase Put, pero sin añadir ningún nuevo comportamiento:

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

Como puede notar, esto es exactamente lo mismo para get/copyToLocal.

0

Ambos comandos 'put' & 'copyFromLocal' funcionan exactamente igual. No puede usar el comando 'poner' para copiar archivos de un directorio hdfs a otro. Veamos esto con un ejemplo: digamos que tu raíz tiene dos directorios, llamados 'test1' y 'test2'. Si 'test1' contiene un archivo 'customer.txt' e intenta copiarlo en el directorio test2
$ hadoop fs -put /test1/customer.txt/test2 Esto dará como resultado el error 'no existe tal archivo o directorio' desde ' put 'buscará el archivo en el sistema de archivos local y no en hdfs. Ambos están destinados a copiar archivos (o directorios) desde el sistema de archivos local a hdfs, únicamente.

+0

¿Tal vez si especifica el sistema de archivos en el primer argumento, no leería el local? 'hadoop fs -put hdfs: ///test1/customer.txt hdfs: /// test2'? –