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 ?

3voto

adamax Points 2798

Vous pouvez exécuter une tâche supplémentaire de map/reduce, où map et reduce ne modifient pas les données, et où partitioner attribue toutes les données à un seul reducer.

1 votes

Pas si vous devez fusionner plus de données que la machine locale ne peut en gérer.

1voto

Aniruddha Sinha Points 749

En plus de ma réponse précédente, j'ai une autre réponse pour vous que j'essayais il y a quelques minutes. Vous pouvez utiliser CustomOutputFormat qui ressemble au code donné ci-dessous

public class VictorOutputFormat extends FileOutputFormat<StudentKey,PassValue> {

    @Override
    public RecordWriter<StudentKey,PassValue> getRecordWriter(
            TaskAttemptContext tac) throws IOException, InterruptedException {
        //step 1: GET THE CURRENT PATH
        Path currPath=FileOutputFormat.getOutputPath(tac);

        //Create the full path
        Path fullPath=new Path(currPath,"Aniruddha.txt");

        //create the file in the file system
        FileSystem fs=currPath.getFileSystem(tac.getConfiguration());
        FSDataOutputStream fileOut=fs.create(fullPath,tac);
        return new VictorRecordWriter(fileOut);
    }

}

Regardez juste la quatrième ligne à partir de la dernière. J'ai utilisé mon propre nom comme nom de fichier de sortie et j'ai testé le programme avec 15 réducteurs. Le fichier reste toujours le même. Il est donc possible d'obtenir un seul fichier de sortie au lieu de deux ou plus, mais pour être très clair, la taille du fichier de sortie ne doit pas dépasser la taille de la mémoire primaire, c'est-à-dire que le fichier de sortie doit tenir dans la mémoire de la machine de base, sinon il pourrait y avoir un problème avec la division du fichier de sortie. Merci !

0 votes

Getmerge peut résoudre votre problème mais c'est une alternative. mais c'est utile

0voto

Masih Points 671

Si les fichiers ont un en-tête, vous pouvez vous en débarrasser en faisant ceci :

hadoop fs -cat /path/to/hdfs/job-output/part-* | grep -v "header" > output.csv

puis ajouter l'en-tête manuellement pour output.csv

0voto

Ravindra babu Points 5571

. Est-ce que map/reduce fusionne ces fichiers ?

Non. Il ne fusionne pas.

Vous pouvez utiliser IdentityReducer pour atteindre votre objectif.

N'effectue aucune réduction, en écrivant toutes les valeurs d'entrée directement sur la sortie.

public void reduce(K key,
                   Iterator<V> values,
                   OutputCollector<K,V> output,
                   Reporter reporter)
            throws IOException

Ecrit toutes les clés et valeurs directement sur la sortie.

Jetez un coup d'œil aux messages SE connexes :

hadoop : différence entre 0 reducer et identity reducer ?

0voto

Ian Points 1

Pourquoi ne pas utiliser un script comme celui-ci pour fusionner les fichiers de partition :

stuff = load "/path/to/dir/*"

store stuff into "/path/to/mergedir"

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