J'essaie d'apprendre à utiliser l'API Python de Yelp pour Mapreduce, MRJOB. Leur exemple de contrôle de mot simple a du sens, mais je suis curieux de savoir comment gérerait une application impliquant plusieurs entrées. Par exemple, plutôt que de compter simplement les mots dans un document, multiplier un vecteur d'une matrice. J'ai proposé cette solution, qui fonctionne, mais se sent stupide: ce code est exécuté donc, la matrice et le vecteur suivant: p> est représenté comme entrée.txt comme: p> En bref, comment allez-y entretenir la matrice et le vecteur plus naturellement dans des fichiers séparés et les transmettre à la fois dans MRJOB? P> P> ./ matrix.py
p>
P>
5 Réponses :
Si vous avez besoin de traiter vos données brutes contre un autre ensemble de données (ou même rang_i, Row_J), vous pouvez soit:
1) Créez un godet S3 pour stocker une copie de vos données. Passez l'emplacement de cette copie à votre classe de tâches, par ex. self.option.bucket et self.option.my_datafile_copy_location dans le code ci-dessous. CAVEZIER: Malheureusement, il semble que l'ensemble du fichier doit être "téléchargé" aux machines de tâches avant de devenir traitées. Si les connexions entrent ou prennent trop de temps pour se charger, ce travail peut échouer. Voici un code Python / MRJob pour le faire. p>
Mettez ceci dans votre fonction mappeuse: p> 2) Créez un domaine Simpledb et stockez toutes vos données là-bas.
Lisez ici sur Boto et SimpleDB:
http://code.google.com/p/boto/wiki/simpledbintro p> Votre code mapper ressemblerait à ceci: p> Cette seconde option peut mieux fonctionner si vous avez de très grandes quantités de données, car elle peut faire le Demandes pour chaque ligne de données plutôt que toute la quantité à la fois. Gardez à l'esprit que les valeurs Simplesdb ne peuvent avoir qu'un maximum de 1024 caractères de long, vous devrez peut-être compresser / décompresser via une méthode si vos valeurs de données sont plus longues que cela. P> P>
Dans ma compréhension, vous n'utiliseriez pas MRJOB à moins que vous souhaitiez tirer parti des services de cluster Hadoop ou d'Hadoop d'Amazon, même si l'exemple utilise l'exécution de fichiers locaux.
MRJOB en principal utilise " Cela signifie que toutes les entrées spécifiées comme fichiers ou dossiers de Hadoop est diffusé au mapper et aux résultats suivants au réducteur. Tout mapper obtient une tranche d'entrée et considère que toutes les entrées doivent être schématiquement de même que cela analyse et traite uniformément la clé de chaque tranche de données. p> résultant de cette compréhension, les entrées sont schématiquement de la même manière que le mappeur. Seule une manière possible d'inclure deux données schématiques différentes consiste à les interlacer dans le même fichier de manière à ce que le mappeur puisse comprendre qui est des données vectorielles et qui sont des données matricielles. P> matrix, 1, 2, ...
matrix, 2, 4, ...
vector, 3, 4, ...
matrix, 1, 2, ...
.....
La réponse réelle à votre question est que MRJOB ne prend pas encore encore en charge le streaming Streaming Hadoop, qui consiste à lire la variable de l'environnement MAP_Input_File (qui expose la propriété MAP.Input.file) pour déterminer le type de fichier que vous êtes faire face à la base de son chemin et / ou de son nom. P>
Vous pourriez toujours être capable de le retirer, si vous pouvez facilement détecter de simplement lire les données lui-même qui appartient, comme il est affiché dans cet article: P>
Cependant, ce n'est pas toujours possible ... P>
Sinon myjob a l'air fantastique et j'aimerais pouvoir ajouter un soutien à cela à l'avenir. Jusque-là, cela est à peu près un casse-disque pour moi. P>
Voici comment j'utilise plusieurs entrées et basé sur le nom de fichier, apportez des modifications appropriées dans la phase de mappeuse.
PROGRAMME DE RUNNER: P>
class MR_Job(MRJob): DEFAULT_OUTPUT_PROTOCOL = 'repr_value' def mapper(self, _, line): """ This function reads lines from file. """ try: #Need to clean email. input_file_name = get_jobconf_value('map.input.file').split('/')[-2] """ Mapper code """ except Exception, e: print e def reducer(self, email_id,visitor_id__date_time): try: """ Reducer Code """ except: pass if __name__ == '__main__': MRV_Email.run()
le mrjob Funumentaux State: fort > Vous pouvez transmettre plusieurs fichiers d'entrée, mélangés avec STDIN (à l'aide du caractère - caractère): p>
blockQuote>