web-dev-qa-db-fra.com

Différence entre hadoop fs -put et hadoop fs -copyFromLocal

-put et -copyFromLocal sont documentés comme identiques, alors que la plupart des exemples utilisent la variante détaillée -copyFromLocal. Pourquoi?

Même chose pour -get et -copyToLocal

47
snappy
  • copyFromLocal est similaire à la commande put, sauf que la source est restreinte à une référence de fichier local.

Donc, fondamentalement, vous pouvez faire avec put, tout ce que vous faites avec copyFromLocal, mais pas l'inverse.

De même, 

  • copyToLocal est similaire à la commande get, sauf que la destination est restreinte à une référence de fichier local.

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

Référence: Documentation Hadoop .

Mise à jour: pour octobre 2015 au plus tard, veuillez consulter ceci réponse ci-dessous.

57
Ozair Kafray

Prenons un exemple: Si votre HDFS contient le chemin: /tmp/dir/abc.txt Et si votre disque local contient également ce chemin, l’API hdfs ne saura pas lequel vous voulez dire, à moins que vous ne spécifiiez un schéma comme file:// ou hdfs:// . Peut-être que cela choisit le chemin que vous ne vouliez pas copier.

Donc 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 destiné aux utilisateurs plus avancés qui savent quel schéma mettre en avant. 

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

37
Thomas Jungblut

Malgré ce que prétend la documentation, à compter d’ici (octobre 2015), -copyFromLocal et -put sont identiques.

De l'aide en ligne:

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

Et ceci est confirmé par en regardant les sources , où vous pouvez voir que la classe CopyFromLocal étend la classe Put, mais sans ajouter de nouveau comportement:

  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 le remarquerez peut-être, il en va de même pour get/copyToLocal.

17
Sylvain Leroux
  • les deux sont identiques sauf 
  • copyFromLocal est limité à la copie depuis local alors que put peut prendre un fichier depuis n'importe quel (autre système de fichiers hdfs/local/..)
2
Manish Agrawal

Les commandes 'put' & 'copyFromLocal' fonctionnent exactement de la même manière. 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 /test2Il entraînera une erreur "aucun fichier ou répertoire de ce type", car "put" recherchera le fichier dans le système de fichiers local et non hdfs. Ils sont tous deux destinés à copier des fichiers (ou des répertoires) d’un système de fichiers local vers un fichier hdfs, uniquement.

0
Roney J