Je suis en train de lire le guide définitif de l’ayoop, où il explique clairement les fractionnements d’entrée.
Les divisions d’entrée ne contiennent pas de données réelles, mais disposent du stockage emplacements pour les données sur HDFS
et
Généralement, la taille de la division d’entrée est identique à la taille du bloc
1) Supposons qu'un bloc de 64 Mo se trouve sur le nœud A et soit répliqué sur 2 autres nœuds (B, C), et que la taille de fractionnement en entrée du programme de réduction de carte est de 64 Mo. Ce fractionnement aura-t-il l'emplacement du nœud A? ? Ou aura-t-il des emplacements pour les trois nœuds A, b, C?
2) Étant donné que les données sont locales pour les trois nœuds, comment le cadre décide-t-il (choisit-il) de lancer une tâche sur un nœud particulier?
3) Comment est-il géré si la taille du fractionnement en entrée est supérieure ou inférieure à la taille du bloc?
La réponse de @ user1668782 est une excellente explication de la question et je vais essayer de la décrire graphiquement.
Supposons que nous ayons un fichier de 400 Mo contenant 4 enregistrements (e.g: fichier csv de 400 Mo et comportant 4 lignes de 100 Mo chacune).
C’est le problème exact que input splits résout. Input splits respecte les limites des enregistrements logiques.
Supposons que la taille de entrée fractionnée est de 200 Mo
Par conséquent, input split 1 doit avoir à la fois l'enregistrement 1 et l'enregistrement 2. Et l'entrée split 2 ne commence pas par l'enregistrement 2 car l'enregistrement 2 a été affecté au groupe d'entrées 1. Le groupe d'entrée 2 commence par l'enregistrement 3.
C'est pourquoi un fractionnement en entrée est uniquement un fragment logique de données. Il indique les emplacements de départ et d'arrivée avec des blocs.
J'espère que cela t'aides.
Block est la représentation physique des données . Split est la représentation logique des données présentes dans Block.
La taille des blocs et des divisions peut être modifiée dans les propriétés.
La carte lit les données de Block à travers les scissions, c’est-à-dire que la scission agit en tant que courtier entre Block et Mapper.
Considérons deux blocs:
Bloc 1
bb cc dd ee ff gg hh ii jj
Bloc 2
w w ee yy uu oo ii oo pp kk ll nn
Maintenant, la carte lit les blocs 1 à aa de JJ et ne sait pas lire le bloc 2, c’est-à-dire que bloc ne sait pas comment traiter différents blocs d’informations. Voici un fractionnement qui formera un groupe logique du bloc 1 et du bloc 2 en un seul bloc, puis il formera un décalage (clé) et une ligne (valeur) en utilisant inputformat et un lecteur d’enregistrements et enverra une carte pour un traitement ultérieur.
Si votre ressource est limitée et que vous souhaitez limiter le nombre de cartes, vous pouvez augmenter la taille de la division . Par exemple: Si nous avons 640 Mo de 10 blocs, c’est-à-dire que chaque bloc de 64 Mo et que la ressource est limitée, On peut mentionner que la taille de Split est de 128 Mo, puis un regroupement logique de 128 Mo est formé et seules 5 cartes seront exécutées avec une taille de 128 Mo.
Si nous spécifions que la taille de la division est fausse, le fichier entier formera une scission en entrée et sera traité par une carte qu'il faudra plus de temps pour traiter lorsque la taille du fichier est importante.
Les divisions d'entrée sont une division logique de vos enregistrements, tandis que les blocs HDFS sont une division physique des données d'entrée. C’est extrêmement efficace quand ils sont identiques, mais en pratique, ils ne sont jamais parfaitement alignés. Les enregistrements peuvent dépasser les limites d'un bloc. Hadoop garantit le traitement de tous les enregistrements. Une machine traitant une scission particulière peut extraire un fragment d'un enregistrement d'un bloc autre que son bloc «principal» et qui peut résider à distance. Le coût de la communication pour récupérer un fragment d'enregistrement est sans conséquence, car cela se produit relativement rarement.
La force de la structure Hadoop réside dans sa localité de données. Ainsi, chaque fois qu’une demande client pour les données hdfs, la structure vérifie toujours la localité, sinon elle recherche une faible utilisation des E/S.
La taille de bloc HDFS est un nombre exact, mais la taille du fractionnement en entrée est basée sur notre logiquedata, qui peut être légèrement différente avec le numéro configuré.
Pour 1) et 2): Je ne suis pas sûr à 100%, mais si la tâche ne peut pas s'achever - pour quelque raison que ce soit, y compris si quelque chose ne va pas avec le fractionnement en entrée -, elle est terminée et une autre démarrée à sa place: maptask obtient exactement un partage avec les informations sur le fichier (vous pouvez rapidement savoir si c'est le cas en déboguant sur un cluster local pour voir quelles informations sont conservées dans l'objet de fractionnement en entrée: il me semble me souvenir qu'il ne s'agit que d'un seul emplacement).
to 3): si le format du fichier est scindable, Hadoop essaiera de réduire le fichier à des fragments de taille "inputSplit"; sinon, une tâche par fichier, quelle que soit la taille du fichier. Si vous modifiez la valeur de minimum-input-split, vous pouvez éviter le trop grand nombre de tâches de mappeur générées si chacun de vos fichiers d'entrée est divisé en taille de bloc, mais vous pouvez uniquement combiner des entrées. faites de la magie avec la classe du combinateur (je pense que c'est comme ça qu'elle s'appelle).
Les divisions d’entrée sont des unités de données logiques qui alimentent chaque mappeur. Les données sont réparties sur des enregistrements valides. Les divisions d’entrée contiennent les adresses des blocs et des décalages d’octets.
Disons que vous avez un fichier texte sur 4 blocs.
Fichier:
a B c d
E f g h
i j k l
m n o p
Blocs:
bloc1: a b c d e
bloc2: f g h i j
bloc3: k l m non
block4: p
Splits:
Split1: a b c d e f h
Split2: i j k l m n o p
Observez que les divisions sont en ligne avec les limites (enregistrements) du fichier. Désormais, chaque fractionnement est envoyé à un mappeur.
Si la taille de fractionnement de l'entrée est inférieure à la taille du bloc, vous finirez par utiliser davantage de mappeurs no, et inversement.
J'espère que cela pourra aider.