2015-09-28 2 views
2

Dans le fichier d'entrée que j'ai besoin de traiter, les données sont classées par en-têtes et leurs enregistrements respectifs. Mon fichier de 200 Mo comporte 3 en-têtes de ce type et ses enregistrements sont répartis sur 4 blocs (3 * 64 Mo et 1 * 8 Mo).Comment créer une paire clé/valeur dans le programme mapreduce si les valeurs sont stockées à travers les limites?

Les données seraient en dessous le format

HEADER 1 
Record 1 
Record 2 
. 
. 
Record n 
HEADER 2 
Record 1 
Record 2 
. 
. 
Record n 
HEADER 3 
Record 1 
Record 2 
. 
. 
Record n 

Tout ce que je besoin est de prendre la HEADER comme une clé et de son ci-dessous enregistrements comme valeurs et traiter certaines opérations dans mon code cartographe.

Le problème ici est mes enregistrements sont répartis entre différents blocs. Supposons que mon premier en-tête et ses enregistrements respectifs occupent un espace de 70 Mo, cela signifie qu'il occupe 64 Mo du premier bloc et 6 Mo d'espace en second bloc.

Maintenant, comment le cartographe qui fonctionne sur le bloc 2 sait que 6 Mo de fichier appartient aux dossiers du HEADER 1.

Quelqu'un peut-il s'il vous plaît me expliquer que la façon d'obtenir complètement l'en-tête et ses dossiers.

+0

J'ai essayé de répondre à quelque chose de similaire ici: http://stackoverflow.com/questions/32758322/how-do-we-count-the-number-of-times-a-map-function-is-called- in-a-mapreduce-prog – YoungHobbit

+0

@YoungHobbit Je pense que le problème ici est le nombre inconnu d'enregistrements après l'en-tête, ainsi que l'en-tête et l'enregistrement se combinant. – Ramzy

Répondre

0

Vous avez besoin d'un lecteur d'enregistrement personnalisé et d'un liner personnalisé pour traiter de cette manière plutôt que de lire chaque ligne. Étant donné que les divisions sont calculées dans le client, chaque mappeur sait s'il doit supprimer ou non les enregistrements de l'en-tête précédent.

Hope this lien ci-dessous pourrait être utile How does Hadoop process records split across block boundaries?

0

Vous avez deux façons:

  1. A unique Mapper manutention tous les dossiers, de sorte que vous avez les données complètes en classe unique, et vous décidez comment les séparer. Étant donné la taille des entrées, cela entraînera des problèmes de performance. Plus d'infos sur Hadoop Guide définitif, Types et formats MR, Formats d'entrée, Prévention du fractionnement. Moins d'effort de codage, et si votre mappeur a moins de données et fonctionne fréquemment, cette approche est correcte.

  2. Si vous envisagez d'utiliser le composant personnalisé et le lecteur d'enregistrement, vous modifiez le fonctionnement de l'infrastructure. Parce que vos enregistrements sont similaires à TextInputFormat. Donc, la plupart du temps pas besoin de planifier un lecteur d'enregistrement personnalisé. Cependant, vous devez définir comment les divisions sont faites. En général, les divisions sont divisées principalement en fonction de la taille du bloc, afin de tirer parti de la localisation des données. Dans votre cas, vos données (principalement la partie en-tête) peuvent se terminer à n'importe quel bloc et vous devez les diviser en conséquence. Tous les changements ci-dessus doivent être faits, pour que la carte réduise le travail avec les données que vous avez.

0

Vous pouvez augmenter la taille par défaut du bloc HDFS à 128 Mo et si le fichier est petit, il le prendra comme un bloc.