7
votes

Plusieurs entrées avec MRJOB

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: xxx

ce code est exécuté ./ matrix.py et la raison pour laquelle il fonctionne Est-ce que la matrice stockée dans INPUT.TXT par colonnes, avec la valeur de vecteur correspondante à la fin de la ligne.

donc, la matrice et le vecteur suivant:

Entrez la description de l'image ici

est représenté comme entrée.txt comme:

 Entrez l'image Description Ici

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?


0 commentaires

5 Réponses :


3
votes

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.

Mettez ceci dans votre fonction mappeuse: xxx

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

Votre code mapper ressemblerait à ceci: xxx

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.


0 commentaires

1
votes

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 " Hadoop streaming " Pour soumettre le travail. p>

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, ...
.....


0 commentaires

2
votes

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.

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:

http : //allthingshadoop.com/2011/12/16/Simple-hadoop-streaming-tatudial-utilisateur-joints-and-kesys-with-python/

Cependant, ce n'est pas toujours possible ...

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.


0 commentaires

2
votes

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()


0 commentaires

1
votes

le mrjob Funumentaux State:

Vous pouvez transmettre plusieurs fichiers d'entrée, mélangés avec STDIN (à l'aide du caractère - caractère): xxx


0 commentaires