76 votes

fusionner les fichiers de sortie après la phase de réduction

Dans mapreduce, chaque tâche de réduction écrit sa sortie dans un fichier nommé partie-r-nnnnnnnnnn est un ID de partition associé à la tâche de réduction. Est-ce que map/reduce fusionner ces fichiers ? Si oui, comment ?

121voto

diliop Points 3208

Au lieu d'effectuer vous-même la fusion des fichiers, vous pouvez déléguer l'intégralité de la fusion des fichiers de sortie réduits en appelant :

hadoop fs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt

Note Cela combine les fichiers HDFS localement. Assurez-vous d'avoir suffisamment d'espace disque avant d'exécuter

16 votes

Y a-t-il un moyen de faire cela mais sur le dfs ? Je veux dire que je veux les fusionner en un seul fichier sur le dfs ?

10 votes

Cela ne semble pas fonctionner avec le dfs, le fichier fusionné est écrit sur le système de fichiers local. Bien sûr, vous pourriez simplement le réécrire, mais cela semble inutile.

4 votes

NB : ceci n'est pas sûr avec les fichiers non-textuels. getMerge fait une simple concaténation de fichiers, ce qui, avec quelque chose comme un SequenceFile, ne donnera pas une sortie saine.

28voto

Niels Basjes Points 3768

Non, ces fichiers ne sont pas fusionnés par Hadoop. Le nombre de fichiers que vous obtenez est le même que le nombre de tâches de réduction.

Si vous en avez besoin pour un prochain travail, ne vous inquiétez pas d'avoir des fichiers séparés. Il suffit de spécifier le répertoire entier comme entrée pour le prochain travail.

Si vous avez besoin des données en dehors du cluster, je les fusionne généralement à l'extrémité réceptrice lors de l'extraction des données du cluster.

Je veux dire quelque chose comme ça :

hadoop fs -cat /some/where/on/hdfs/job-output/part-r-* > TheCombinedResultOfTheJob.txt

0 votes

Merci pour votre réponse buf dans le fichier de configuration de map/reduce ( mapred-default.xml ), il existe un attribut nommé io.sort.facteur à quoi sert-il ? à quoi sert-il ? à quoi sert-il ?

2 votes

Le facteur io.sort a à voir avec le traitement entre la carte et l'étape de réduction. Pas la sortie de la réduction.

0 votes

Comment savez-vous que l'ordre dans lequel le fichier partie-r-* sera fusionné est le bon ?

8voto

Mervyn Points 91

C'est la fonction que vous pouvez utiliser pour fusionner des fichiers dans HDFS.

public boolean getMergeInHdfs(String src, String dest) throws IllegalArgumentException, IOException {
    FileSystem fs = FileSystem.get(config);
    Path srcPath = new Path(src);
    Path dstPath = new Path(dest);

    // Check if the path already exists
    if (!(fs.exists(srcPath))) {
        logger.info("Path " + src + " does not exists!");
        return false;
    }

    if (!(fs.exists(dstPath))) {
        logger.info("Path " + dest + " does not exists!");
        return false;
    }
    return FileUtil.copyMerge(fs, srcPath, fs, dstPath, false, config, null);
}

8voto

Gaurav Kumar Points 173

Pour les fichiers texte uniquement et HDFS comme source et destination, utilisez la commande suivante :

hadoop fs -cat /input_hdfs_dir/* | hadoop fs -put - /output_hdfs_file

Cela concaténera tous les fichiers de la section input_hdfs_dir et écrira la sortie sur HDFS à output_hdfs_file . Gardez à l'esprit que toutes les données seront ramenées sur le système local puis à nouveau téléchargées vers hdfs, bien qu'aucun fichier temporaire ne soit créé et que cela se passe à la volée en utilisant UNIX pe.

En outre, cela ne fonctionnera pas avec les fichiers non textuels tels que Avro, ORC, etc.

Pour les fichiers binaires, vous pourriez faire quelque chose comme ceci (si vous avez des tables Hive mappées sur les répertoires) :

insert overwrite table tbl select * from tbl

En fonction de votre configuration, cela pourrait également créer plus que des fichiers. Pour créer un seul fichier, il faut soit définir le nombre de réducteurs à 1 explicitement en utilisant mapreduce.job.reduces=1 ou définir la propriété de la ruche comme hive.merge.mapredfiles=true .

0 votes

Avec cette solution, il faut également tenir compte de l'entrée possible de stdin dans la destination finale. En particulier, j'ai rencontré une situation où, dans un cluster HA, il y a un message d'avertissement lorsque l'un des nœuds est en mode veille. Dans cette situation, ma sortie contenait ce message d'avertissement, par ailleurs innocent. lien

4voto

Aniruddha Sinha Points 749

Les fichiers part-r-nnnnn sont générés après la phase de réduction désignée par 'r' entre les deux. Maintenant, le fait est que si vous avez un réducteur en cours d'exécution, vous aurez un fichier de sortie comme part-r-00000. Si le nombre de réducteurs est de 2, alors vous aurez partie-r-00000 et partie-r-00001 et ainsi de suite. Ecoutez, si le fichier de sortie est trop grand pour tenir dans la mémoire de la machine, puisque le framework hadoop a été conçu pour fonctionner sur Machines à produits puis le fichier est divisé. Selon le MRv1, vous avez une limite de 20 réducteurs pour travailler sur votre logique. Vous pouvez en avoir plus mais cela doit être personnalisé dans les fichiers de configuration. mapred-site.xml . Pour répondre à votre question, vous pouvez soit utiliser getmerge, soit définir le nombre de réducteurs à 1 en intégrant l'instruction suivante dans le code du driver

job.setNumReduceTasks(1);

J'espère que cela répond à votre question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X