Diagramme schématique du processus de fonctionnement global du programme wordcount

 

L'étape de la carte: transformez chaque ligne de données textuelles en données kv comme <word, 1>

réduire l'étape: agréger un ensemble de données kv du même mot: accumuler tout v

Remarque: dans le programme mapreduce,

Entrer et sortir des données au stade de la carte,

Entrer et sortir des données dans la phase de réduction,

Les types doivent être les types qui implémentent le cadre de sérialisation HADOOP, tels que:

La chaîne correspond au texte

Entier correspond à IntWritable

Long correspond à LongWritable

 

Analyse de processus:

Côté carte:

1. Chaque fragment d'entrée sera traité par une tâche de mappage. Par défaut, la taille d'un bloc de HDFS (par défaut est 64 Mo) est un fragment. Bien sûr, nous pouvons également définir la taille du bloc. La sortie de la carte sera temporairement placée dans un tampon de mémoire en anneau (la taille du tampon est de 100M par défaut, contrôlée par la propriété io.sort.mb), lorsque le tampon est sur le point de déborder (la valeur par défaut est 80% de la taille du tampon , Contrôlé par la propriété io.sort.spill.percent), un fichier de dépassement sera créé dans le système de fichiers local et les données du tampon seront écrites dans ce fichier.

2. Avant d'écrire sur le disque, le thread divise d'abord les données en le même nombre de partitions en fonction du nombre de tâches de réduction, c'est-à-dire qu'une tâche de réduction correspond à une partition de données. Ceci est fait pour éviter la situation délicate selon laquelle certaines tâches de réduction se voient attribuer une grande quantité de données, tandis que certaines tâches de réduction reçoivent peu de données, voire aucune. En fait, le partitionnement est le processus de hachage des données. Triez ensuite les données dans chaque partition. Si le combinateur est défini à ce moment, les résultats triés seront utilisés pour le fonctionnement Combia. Le but est de permettre d'écrire le moins de données possible sur le disque.

3. Lorsque la tâche de mappage génère le dernier enregistrement, il peut y avoir beaucoup de fichiers de débordement, puis ces fichiers doivent être fusionnés. Pendant le processus de fusion, les opérations de tri et de combinaison seront effectuées en continu à deux fins: 1. Pour minimiser la quantité de données écrites sur le disque à chaque fois; 2. Pour minimiser la quantité de données de transmission réseau dans la prochaine étape de réplication. Enfin fusionné dans un fichier partitionné et trié. Afin de réduire la quantité de données transmises sur le réseau, les données peuvent être compressées ici, tant que mapred.compress.map.out est défini sur true.

 

4. Copiez les données de la partition dans la tâche de réduction correspondante. Quelqu'un peut demander: Comment les données d'une partition savent-elles à quelle réduction elles correspondent? En fait, la tâche de carte reste en contact avec son TaskTracker parent, et TaskTracker garde le rythme cardiaque avec JobTracker. Par conséquent, JobTracker enregistre les informations de macro de l'ensemble du cluster. Tant que la tâche de réduction obtient la position de sortie de mappage correspondante de JobTracker, elle est correcte.

À ce stade, la fin de la carte est analysée. Alors, qu'est-ce que Shuffle exactement? La signification chinoise de Shuffle est "shuffling". Si nous regardons les choses de cette façon: les données générées par une carte sont divisées en différentes tâches de réduction via la partition de processus de hachage, est-ce un processus de mélange des données? Ha ha.

Réduire le côté:

1. Réduire recevra les données de différentes tâches de carte et les données de chaque carte seront ordonnées. Si la quantité de données reçues par le côté réduit est assez petite, elle est directement stockée en mémoire (la taille du tampon est contrôlée par la propriété mapred.job.shuffle.input.buffer.percent, qui représente le pourcentage d'espace de mémoire utilisé à cet effet), si la quantité de données Si un certain pourcentage de la taille du tampon est dépassé (déterminé par mapred.job.shuffle.merge.percent), les données sont fusionnées et écrites sur le disque.

2. À mesure que le nombre de fichiers d'écriture de dépassement augmente, les threads d'arrière-plan les fusionnent dans un fichier plus grand et ordonné, afin de gagner du temps pour les fusions ultérieures. En fait, peu importe du côté de la carte ou du côté réduit, MapReduce effectue à plusieurs reprises des opérations de tri, de fusion et comprend maintenant enfin pourquoi certaines personnes disent: le tri est l'âme de hadoop.

3. De nombreux fichiers intermédiaires (écrits sur le disque) seront générés pendant le processus de fusion, mais MapReduce rendra les données écrites sur le disque aussi peu que possible, et le résultat de la dernière fusion n'est pas écrit sur le disque, mais directement entré dans la fonction de réduction .

À ce stade, le principe de fonctionnement de MapReduce est enfin analysé, mais je vais continuer à étudier en profondeur, veuillez faire attention à mon blog de suivi lié à hadoop.

Publié 27 articles originaux · loué 0 · visites 689

Je suppose que tu aimes

Origine blog.csdn.net/Mr_ye931/article/details/105547729
conseillé
Classement