2016-02-16 7 views
0

J'ai besoin de traiter le fichier car il signifie que le contenu du fichier doit être traité tel qu'il apparaît dans le fichier.Comment forcer le traitement séquentiel d'un contenu de fichier?

Par exemple: J'ai un fichier et la taille est de 700 Mo. Comment nous pouvons nous assurer que le fichier sera traité tel qu'il apparaît puisqu'il dépend de la disponibilité de Datanode. Dans certains cas, si Datanode traite le fichier lentement (configuration basse).

Une façon de résoudre ce problème, en ajoutant un identifiant unique/clé dans le fichier, mais nous ne voulons pas ajouter quelque chose de nouveau dans le fichier.

Toutes les pensées :)

Répondre

2

Vous pouvez garantir que seul un mappeur calcule le contenu du fichier en écrivant votre propre FileInputFormat qui met isSplitable à false. Par exemple.

public class WholeFileInputFormat extends FileInputFormat<Text, BytesWritable> { 
     @Override 
     protected boolean isSplitable(FileSystem fs, Path filename) { 
      return false; 
     } 


     @Override 
     public RecordReader<Text, BytesWritable> getRecordReader(
      InputSplit split, JobConf job, Reporter reporter) throws IOException { 
      return new WholeFileRecordReader((FileSplit) split, job); 
     } 
} 

Pour plus d'exemples comment le faire, je vous recommander un github project. Selon votre version de hadoop, de légères modifications peuvent être nécessaires.