-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
Donc, fondamentalement, vous pouvez faire avec put, tout ce que vous faites avec copyFromLocal, mais pas l'inverse.
De même,
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.
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.
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
.
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/..)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.