2010-01-24 7 views
2

Je veux construire une application hadoop qui peut lire les mots d'un fichier et chercher dans un autre fichier.Hadoop rechercher des mots d'un fichier dans un autre fichier

Si le mot existe - il doit écrire dans un fichier de sortie Si le mot n'existe pas - il doit écrire dans un autre fichier de sortie

J'ai essayé quelques exemples dans Hadoop. J'ai deux questions

Deux fichiers sont d'environ 200 Mo chacun. La vérification de chaque mot dans un autre fichier peut entraîner une insuffisance de mémoire. Y a-t-il une autre façon de faire cela?

Comment écrire des données dans différents fichiers car la sortie de la phase de réduction de hadoop n'écrit que dans un seul fichier. Est-il possible d'avoir un filtre pour réduire la phase pour écrire des données dans différents fichiers de sortie?

Merci.

+0

Salut, je dois implemet presque la même chose que vous faites, mais je Hadoop débutants et vraiment les dont parviennent à en faire :/S'il vous plaît s'il vous plaît pouvez-vous jeter un oeil à ma question et me donner quelques commentaires, je suis vraiment du mal et ne peux pas obtenir aucune aide:/ http://stackoverflow.com/questions/2986271/need-help-implementing-this-algorithm -with-map-hadoop-mapreduce – Julia

Répondre

8

Comment je le ferais:

  1. valeur divisée en 'carte' par les mots, émettre (< mot>, < source>) (* 1)
  2. vous obtiendrez dans 'réduire' : (< mot>, < liste des sources>)
  3. source liste de vérification (peut être longue pour les deux/toutes sources confondues)
  4. si toutes les sources sont dans la liste, émettent chaque fois (< missingsource>, < mot>)
  5. job2: job.setNumReduceTasks (< numberofsources>)
  6. job2: émettre dans 'carte' (< missingsource>, < mot>)
  7. job2: émettre pour chaque < missingsource> à 'réduire' tout (null, < mot>)

Vous finirez avec autant réduire-sorties que différentes < missingsources>, chacun contenant les mots manquants pour le document. Vous pouvez écrire le < missingsource> ONCE au début de 'réduire' pour marquer les fichiers.

(* 1) Howto trouver la source sur la carte (0,20):

private String localname; 
private Text outkey = new Text(); 
private Text outvalue = new Text(); 
... 
public void setup(Context context) throws InterruptedException, IOException { 
    super.setup(context); 

    localname = ((FileSplit)context.getInputSplit()).getPath().toString(); 
} 

public void map(Object key, Text value, Context context) 
    throws IOException, InterruptedException { 
... 
    outkey.set(...); 
    outvalue.set(localname); 
    context.write(outkey, outvalue); 
} 
+0

Génial ... merci beaucoup. – Boolean

0

Vous voulez le faire en deux étapes, à mon avis. Exécutez le programme wordcount (inclus dans le fichier des exemples hadoop) par rapport aux deux documents initiaux, cela vous donnera deux fichiers, chacun contenant une liste unique (avec le nombre) des mots dans chaque document. De là, plutôt que d'utiliser hadoop faire un simple diff sur les deux fichiers qui devraient répondre à votre question,

1

Utilisez-vous Hadoop/MapReduce pour une raison spécifique pour résoudre ce problème? Cela ressemble à quelque chose de plus adapté à une application basée sur Lucene que Hadoop.

Si vous devez utiliser Hadoop J'ai quelques suggestions:

  1. Votre « documents » devront être dans un format qui MapReduce peut traiter. Le format le plus simple à utiliser serait un fichier CSV avec chaque mot du document sur une ligne. Avoir PDF etc ne fonctionnera pas. Pour prendre un ensemble de mots en entrée de votre travail MapReduce à comparer aux données traitées par MapReduce, vous pouvez utiliser le Distributed Cache pour permettre à chaque mappeur de créer un ensemble de mots que vous voulez trouver dans l'entrée. Cependant si votre liste de mots pour le trouver grand (vous mentionnez 200MB) je doute que cela fonctionnerait. Cette méthode est l'un des principaux moyens de faire une jointure dans MapReduce.

La méthode d'indexation mentionnée dans une autre réponse ici offre également des possibilités. Encore une fois cependant, les termes indexant un document me font penser à Lucene et non à hadoop. Si vous avez utilisé cette méthode, vous devez vous assurer que la valeur de clé contient un identificateur de document ainsi que le mot, afin que le nombre de mots soit contenu dans chaque document.

Je ne pense pas que j'ai jamais produit plusieurs fichiers de sortie à partir d'un travail MapReduce. Vous auriez besoin d'écrire du code (et ce serait très simple) pour traiter la sortie indexée en plusieurs fichiers.

Questions connexes