Existe-t-il une API HDFS capable de copier un répertoire local complet sur HDFS? J'ai trouvé une API pour copier des fichiers, mais existe-t-il une pour les répertoires?
Utilisez le Hadoop FS Shell . Plus précisément:
$ hadoop fs -copyFromLocal /path/to/local hdfs:///path/to/hdfs
Si vous voulez le faire par programme, créez deux FileSystems (un Local et un HDFS) et utilisez la classe FileUtil
J'ai essayé de copier depuis le répertoire en utilisant
/hadoop/core/bin/hadoop fs -copyFromLocal /home/grad04/lopez/TPCDSkew/ /export/hadoop1/lopez/Join/TPCDSkew
Cela m'a donné une erreur en disant que la cible est un répertoire. Je l'ai ensuite modifié pour
/hadoop/core/bin/hadoop fs -copyFromLocal /home/grad04/lopez/TPCDSkew/*.* /export/hadoop1/lopez/Join/TPCDSkew
Ça marche .
Dans la version Hadoop:
Hadoop 2.4.0.2.1.1.0-390
(Et probablement plus tard, je n'ai testé que cette version spécifique car c'est celle que j'ai)
Vous pouvez copier des répertoires entiers de manière récursive sans aucune notation spéciale à l'aide de copyFromLocal
, par exemple:
hadoop fs -copyFromLocal /path/on/disk /path/on/hdfs
qui fonctionne même lorsque /path/on/disk
est un répertoire contenant des sous-répertoires et des fichiers.
Vous pouvez également utiliser la commande put
:
$ hadoop fs -put /local/path hdfs:/path
Pour le programmeur, vous pouvez également utiliser copyFromLocalFile. Voici un exemple:
import org.Apache.hadoop.conf.Configuration
import org.Apache.hadoop.fs.FileSystem
import org.Apache.hadoop.fs.Path
val hdfsConfig = new Configuration
val hdfsURI = "hdfs://127.0.0.1:9000/hdfsData"
val hdfs = FileSystem.get(new URI(hdfsURI), hdfsConfig)
val oriPath = new Path("#your_localpath/customer.csv")
val targetFile = new Path("hdfs://your_hdfspath/customer.csv")
hdfs.copyFromLocalFile(oriPath, targetFile)