2012-10-11 1 views
1

Je vais largement diviser le travail à faire en deux parties:Distcp avec Hadoop le streaming emploi

  1. J'ai d'énormes données (montant à environ 1 To, divisé en centaines de fichiers), que je » m copie de S3 à HDFS via distcp

  2. Ces données seront traitées par un travail en continu Hadoop (simple cartographe et réducteur, écrit en python)

maintenant, je vais devoir attendre jusqu'à ce que toutes les données sont co pied à HDFS et seulement après que je peux commencer mon travail actuel. Voici la question: Considérant que DISTCP en soi est un travail de réduction de la carte, existe-t-il un moyen de "streamer" ces deux tâches, à savoir, le deuxième travail peut-il commencer à travailler sur les données déjà copiées (par exemple distcp déjà copié quelques fichiers, sur lesquels le deuxième travail peut déjà techniquement commencer)?

J'espère avoir été clair.

Répondre

1

Vous pouvez utiliser S3InputFormat (https://github.com/ATLANTBH/emr-s3-io) pour lire les données directement dans vos mappeurs. Mais attention, en cas d'échec du travail, vous allez télécharger toutes les données. Donc, je suggère de télécharger toutes les données avant de le traiter. Si vous n'avez pas besoin de traiter des données entières à la fois, vous pouvez démarrer mapreduce après le démarrage de distcp. Mais vous devriez écrire votre propre extension de FileInputFormat qui enregistrera quelque part (dans le répertoire d'entrée, je suppose) quels fichiers ont été traités, et à chaque invocation filtrer les fichiers traités (dans la méthode getSplits()) et traiter uniquement les fichiers non traités.