Hadoop: Comment fusionner les sorties du réducteur dans un seul fichier?

Je sais que la commande “getmerge” en shell peut faire ce travail.

Mais que dois-je faire si je veux fusionner ces sorties après le travail par l’API HDFS pour java?

Ce que je veux réellement, c’est un seul fichier fusionné sur HDFS.

La seule chose à laquelle je peux penser est de commencer un travail supplémentaire après cela.

Merci!

Mais que dois-je faire si je veux fusionner ces sorties après le travail par l’API HDFS pour java?

Deviner, car je ne l’ai pas essayé moi-même, mais je pense que la méthode que vous recherchez est FileUtil.copyMerge , qui est la méthode invoquée par FsShell lorsque vous exécutez la commande -getmerge . FileUtil.copyMerge prend deux objects FileSystem comme arguments – FsShell utilise FileSystem.getLocal pour récupérer le système de fichiers de destination, mais je ne vois aucune raison pour laquelle vous ne pourriez pas utiliser Path.getFileSystem sur la destination pour obtenir un OutputStream.

Cela dit, je ne pense pas que cela vous gagne beaucoup – la fusion se produit toujours dans la JVM locale; vous -getmerge donc pas beaucoup sur -getmerge suivi par -put .

Vous obtenez un seul fichier de sortie en définissant un seul réducteur dans votre code.

 Job.setNumberOfReducer(1); 

Travaillera pour vos besoins, mais coûteux


OU


 Static method to execute a shell command. Covers most of the simple cases without requiring the user to implement the Shell interface. Parameters: env the map of environment key=value cmd shell command to execute. Returns: the output of the executed command. 

 org.apache.hadoop.util.Shell.execCommand(Ssortingng[])