L'un des principaux exemples utilisés pour démontrer la puissance de MapReduce est le Terasort benchmark . J'ai du mal à comprendre les bases de l'algorithme de tri utilisé dans l'environnement MapReduce.
Pour moi, le tri consiste simplement à déterminer la position relative d'un élément par rapport à tous les autres éléments. Le tri consiste donc à comparer "tout" avec "tout". Votre algorithme de tri moyen (rapide, bulle, ...) le fait simplement de manière intelligente.
Dans mon esprit, la division de l'ensemble de données en plusieurs parties signifie que vous pouvez trier une seule pièce, puis vous devez toujours intégrer ces pièces dans l'ensemble de données entièrement trié. Compte tenu de l'ensemble de données téraoctet réparti sur des milliers de systèmes, je m'attends à ce que ce soit une tâche énorme.
Alors, comment cela se fait-il vraiment? Comment fonctionne cet algorithme de tri MapReduce?
Merci de m'avoir aidé à comprendre.
Voici quelques détails sur implémentation de Hadoop pour Terasort :
TeraSort est un tri de carte/réduction standard, à l'exception d'un partitionneur personnalisé qui utilise une liste triée de N-1 clés échantillonnées qui définissent la plage de clés pour chaque réduction. En particulier, toutes les clés telles que l'échantillon [i - 1] <= clé <échantillon [i] sont envoyées pour réduire i. Cela garantit que la sortie de réduire i est inférieure à la sortie de réduire i + 1. "
Leur astuce réside donc dans la façon dont ils déterminent les clés pendant la phase de carte. Essentiellement, ils garantissent que chaque valeur dans un seul réducteur est garantie d'être "pré-triée" par rapport à tous les autres réducteurs.
J'ai trouvé la référence papier via James Hamilton's Blog Post .
Référence Google: MapReduce: traitement simplifié des données sur les grands clusters
Apparu dans :
OSDI'04: Sixième Symposium sur la conception et l'implémentation des systèmes d'exploitation,
San Francisco, CA, décembre 2004.
Ce lien a un PDF et référence HTML-Slide.
Il y a aussi un page Wikipedia avec description avec des références d'implémentation.
Aussi la critique,
David DeWitt et Michael Stonebraker, experts pionniers dans les bases de données parallèles et les architectures partagées de rien, ont fait des affirmations controversées sur l'étendue des problèmes pour lesquels MapReduce peut être utilisé. Ils ont qualifié son interface de trop bas niveau et se sont demandé si elle représentait vraiment le changement de paradigme que ses partisans prétendaient être. Ils remettent en cause les affirmations de nouveauté des promoteurs de MapReduce, citant Teradata comme un exemple de l'art antérieur qui existe depuis plus de deux décennies; ils ont comparé les programmeurs MapReduce aux programmeurs Codasyl, notant que les deux "écrivent dans un langage de bas niveau effectuant une manipulation des enregistrements de bas niveau". L'utilisation par MapReduce des fichiers d'entrée et le manque de prise en charge des schémas empêchent les améliorations de performances permises par les fonctionnalités courantes du système de base de données telles que les arbres B et le partitionnement de hachage, bien que des projets tels que PigLatin et Sawzall commencent à résoudre ces problèmes.
J'ai eu la même question en lisant le document MapReduce de Google. @ Yuval F --- réponse à peu près résolu mon casse-tête.
Une chose que j'ai remarquée en lisant le papier est que la magie opère dans le partitionnement (après map, avant de réduire).
Le papier utilise hash(key) mod R
comme exemple de partitionnement, mais ce n'est pas le seul moyen de partitionner des données intermédiaires pour différentes tâches de réduction.
Il suffit d'ajouter des conditions aux limites @ Yuval Fréponse pour le compléter: supposons que min (S) et max (S) soit la clé minimale et la clé maximale parmi les clés échantillonnées; toutes les clés <min (S) sont partitionnées en une tâche de réduction; vice versa, toutes les clés> = max (S) sont partitionnées en une tâche de réduction.
Il n'y a pas de limitation stricte sur les clés échantillonnées, comme min ou max. Juste, plus uniformément ces clés R réparties entre toutes les clés, plus "parallèle" ce système distribué est et moins probablement un opérateur de réduction a un problème de débordement de mémoire.
Juste deviner ...
Étant donné un énorme ensemble de données, vous devez partitionner les données en quelques morceaux à traiter en parallèle (peut-être par numéro d'enregistrement, c'est-à-dire enregistrement 1 - 1000 = partition 1, etc.).
Attribuez/planifiez chaque partition à un nœud particulier du cluster.
Chaque nœud de cluster divisera (mappera) la partition en sa propre mini-partition, peut-être par ordre alphabétique clé. Donc, dans la partition 1, obtenez-moi toutes les choses qui commencent par A et sortez-les dans la mini partition A de x. Créez un nouveau A(x) s'il y a déjà un A(x) déjà. Remplacez x par un numéro séquentiel (c'est peut-être le travail du planificateur à faire Donc) Donnez-moi le prochain A(x) id unique.
Transférer (planifier) les travaux terminés par le mappeur (étape précédente) aux nœuds de cluster "réduire". Réduire le cluster de nœuds affinera ensuite le type de chaque partie A(x) qui ne se produira que lorsque toutes les tâches du mappeur sont terminées (ne peut pas réellement commencer à trier tous les mots commençant par W/A quand il y a encore possibilité qu'il y aura encore une autre mini partition A en cours de fabrication. Exportez le résultat dans la partition triée finale (c'est-à-dire Sorted-A, Sorted-B, etc.)
Une fois cela fait, combinez à nouveau la partition triée dans un seul ensemble de données. À ce stade, ce n'est qu'une simple concaténation de n fichiers (où n pourrait être 26 si vous ne faites que A - Z), etc.
Il pourrait y avoir des étapes intermédiaires entre les deux ... Je ne suis pas sûr :). C'est à dire. cartographier et réduire davantage après l'étape de réduction initiale.