2011-10-18 4 views
42

-put et -copyFromLocal sont documentées comme identiques, alors que la plupart des exemples utilisent la variante verbeuse -copyFromLocal. Pourquoi?La différence entre hadoop fs -put et hadoop fs -copyFromLocal

Même chose pour -get et -copyToLocal

+0

s'il vous plaît vérifier ce lien qui a mentionné les détails dans le niveau du code source http://hakunamapdata.com/why-put-is-better-than-copyfromlocal-when-coping-files-to-hdfs/ –

Répondre

53
  • copyFromLocal est similaire à mettre commande, sauf que la source est limitée à une référence de fichier local.

Donc, fondamentalement, vous pouvez le faire avec mis, tout ce que vous faites avec copyFromLocal, mais pas vice-versa.

De même,

  • copyToLocal est similaire à obtenir la commande, sauf que la destination est limitée à un fichier local référence.

Par conséquent, vous pouvez utiliser obtenir au lieu de copyToLocal, mais pas l'inverse.

Référence: Hadoop's documentation.

Mise à jour: Pour le plus récent en date d'octobre 2015, veuillez voir this answer ci-dessous.

35

Faisons un exemple: Si votre HDFS contient le chemin: /tmp/dir/abc.txt Et si votre disque local contient également ce chemin alors l'API hdfs ne saura pas celui que vous voulez dire, sauf si vous spécifiez un système comme file:// ou hdfs:// . Peut-être qu'il choisit le chemin que vous ne vouliez pas copier.

Par conséquent vous avez -copyFromLocal qui vous empêche de copier accidentellement le mauvais fichier, en limitant le paramètre que vous donnez au système de fichiers local.

Put est pour les utilisateurs plus avancés qui savent quel schéma mettre en avant.

Il est toujours un peu déroutant pour les nouveaux utilisateurs de Hadoop le système de fichiers dans lequel ils se trouvent actuellement et où se trouvent réellement leurs fichiers.

+1

Que voulez-vous dire? par "l'API hdfs ne saura pas lequel vous voulez dire"? Pour '-put', la source est toujours le premier argument. Ou vous voulez dire que certains utilisateurs peuvent confondre '-put' avec '-get'? – snappy

+0

Non, ni l'un ni l'autre. Nous parlons ici de deux systèmes de fichiers différents. HDFS et système de fichiers local (disons ext4). En utilisant 'bin/hadoop fs -put/tmp/un chemin/utilisateur/hadoop/un chemin ', la commande ne sait pas vraiment si'/tmp/somepath' existe dans les deux systèmes de fichiers, ou seulement dans le système de fichiers local. Même chose avec le chemin de destination. –

+7

Donc, le premier paramètre n'est pas toujours un chemin fs local pour ainsi dire. Vous pouvez «passer» d'un HDFS à un autre si vous le souhaitez. '-copyFromLocal' s'assurera qu'il ne fait que sélectionner le disque local et le télécharger sur HDFS. –

2
  • les deux sont identiques, sauf
  • copyFromLocal est limitée à copier du local tout en put peut prendre le fichier de tout (autres hdfs/système de fichiers local/..)
10

Malgré ce qu'affirme la documentation , à ce jour (oct. 2015), les deux -copyFromLocal et -put sont identiques.

De l'aide en ligne:

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

Et cela est confirmé par looking at the sources, où vous pouvez voir que la classe CopyFromLocal étend la classe Put, mais sans ajouter de nouveaux comportements:

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

Comme vous pouvez le remarquer, c'est exactement la même chose pour get/copyToLocal.

0

Les commandes 'copyFromLocal' de 'put' & 'fonctionnent' exactement de la même façon. Vous ne pouvez pas utiliser la commande 'put' pour copier des fichiers d'un répertoire hdfs à un autre. Voyons cela avec un exemple: disons que votre racine a deux répertoires, nommés 'test1' et 'test2'. Si 'test1' contient un fichier 'customer.txt' et que vous essayez de le copier dans le répertoire test2
$ hadoop fs -put /test1/customer.txt/test2 Il en résultera une erreur 'aucun fichier ou répertoire' depuis ' put 'va chercher le fichier dans le système de fichiers local et non pas hdfs. Ils sont tous les deux destinés à copier des fichiers (ou des répertoires) du système de fichiers local vers hdfs, uniquement.

+0

Peut-être que si vous spécifiez le système de fichiers dans le premier argument, il ne lirait pas le local? 'hadoop fs -put hdfs: ///test1/customer.txt hdfs: /// test2'? –