2010-12-15 53 views
1

J'ai un seau s3 contenant environ 300 Go de fichiers journaux dans aucun ordre particulier. Je souhaite partitionner ces données pour les utiliser dans hadoop-hive en utilisant un horodatage afin que les log-lines liées à un jour particulier soient regroupées dans le même «dossier» s3. Par exemple les entrées du journal pour le 1er Janvier serait dans les fichiers correspondant à la dénomination suivante:Comment dois-je partitionner les données dans s3 pour les utiliser avec hadoop ruche?

s3://bucket1/partitions/created_date=2010-01-01/file1 
s3://bucket1/partitions/created_date=2010-01-01/file2 
s3://bucket1/partitions/created_date=2010-01-01/file3 

etc

Quelle serait la meilleure façon pour moi de transformer les données? Suis-je le meilleur simplement en exécutant un seul script qui lit dans chaque fichier à la fois et les données de sorties à l'emplacement s3 droit?

Je suis sûr qu'il ya une bonne façon de le faire en utilisant Hadoop, quelqu'un pourrait me dire ce qui est?

Ce que j'ai essayé:

J'ai essayé d'utiliser Hadoop streaming en passant dans un mappeur qui a recueilli toutes les entrées du journal pour chaque date, puis écrit ceux qui sont directement à S3, rien de retour pour le réducteur, mais semblait créer des doublons. (en utilisant l'exemple ci-dessus, j'ai fini avec 2,5 millions d'entrées pour le 1er janvier au lieu de 1,4 million)

Quelqu'un a-t-il des idées sur la meilleure façon d'aborder cela?

Répondre

0

Si Hadoop a des fentes libres dans le suivi des tâches, il exécuter plusieurs copies de la même tâche. Si votre format de sortie n'ignore pas correctement les clés et les valeurs de sortie dupliquées (ce qui est peut-être le cas pour S3, je ne l'ai jamais utilisé), vous devez désactiver l'exécution spéculative. Si votre travail est uniquement mappé, définissez mapred.map.tasks.speculative.execution sur false. Si vous avez un réducteur, définissez mapred.reduce.tasks.speculative.execution sur false. Consultez Hadoop: The Definitive Guide pour plus d'informations. Pourquoi ne pas créer une table externe sur ces données, puis utiliser ruche pour créer la nouvelle table?

0

create table partitioned (some_field string, timestamp string, created_date date) partition(created_date); 
insert overwrite partitioned partition(created_date) as select some_field, timestamp, date(timestamp) from orig_external_table; 

En fait, je n'ai pas regardé la syntaxe, de sorte que vous devrez peut-être corriger en référence à https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingdataintoHiveTablesfromqueries.