web-dev-qa-db-fra.com

Taille fractionnée vs taille de bloc dans Hadoop

Quelle est la relation entre la taille de division et la taille de bloc dans Hadoop? Comme je l'ai lu dans this , la taille de division doit être égale à n fois la taille du bloc (n est un entier et n> 0), est-ce correct? Existe-t-il un lien entre la taille de la scission et la taille du bloc?

13
duong_dajgja

Dans l'architecture HDFS, il existe un concept de blocs. Une taille de bloc typique utilisée par HDFS est de 64 Mo. Lorsque nous plaçons un fichier volumineux dans HDFS, il est découpé en morceaux de 64 Mo (en fonction de la configuration par défaut des blocs). Supposons que vous ayez un fichier de 1 Go et que vous souhaitiez le placer dans HDFS 16 split/blocks et ceux-ci seront distribués sur les DataNodes. Ces blocs/blocs résident sur un autre DataNode différent en fonction de la configuration de votre cluster.

Le fractionnement des données est basé sur les décalages de fichiers. L'objectif de la division du fichier et de son stockage dans différents blocs est le traitement en parallèle et le basculement des données. 

Différence entre la taille du bloc et la taille de la scission.

La division est une division logique des données, essentiellement utilisée lors du traitement de données à l'aide du programme Map/Reduce ou d'autres techniques de traitement de données sur Hadoop Ecosystem. La taille de division est une valeur définie par l'utilisateur et vous pouvez choisir votre propre taille de division en fonction de votre volume de données (Quantité de données que vous traitez).

La division est essentiellement utilisée pour contrôler le nombre de mappeurs dans le programme Mapper/Réduire. Si vous n'avez pas défini de taille de fractionnement d'entrée dans le programme Mappage/Réduction, le fractionnement de bloc HDFS par défaut sera considéré comme un fractionnement d'entrée.

Exemple:

Supposons que vous avez un fichier de 100 Mo et que la configuration de bloc par défaut de HDFS est de 64 Mo. Dans ce cas, il sera découpé en 2 parties et occupera 2 blocs. Vous avez maintenant un programme Mapper/Réduire pour traiter ces données, mais vous n'avez pas spécifié de fractionnement d'entrée. En fonction du nombre de blocs (2 blocs), le fractionnement d'entrée sera pris en compte pour le traitement Mappage/Réduire et 2 mappeurs seront affectés à cette opération. emploi.

Mais supposons que vous ayez spécifié la taille de la scission (par exemple 100 Mo) dans votre programme Mappage/Réduire, les deux blocs (2 blocs) seront considérés comme une scission unique pour le traitement Mappage/Réduction et 1 mappeur sera affecté à ce travail.

Supposons que vous ayez spécifié la taille de la division (disons 25 Mo) dans votre programme Mappage/Réduire, il y aura 4 divisions en entrée pour le programme Mappage/Réduire et 4 mappeurs seront affectés au travail.

Conclusion:

  1. Le fractionnement est une division logique des données d'entrée, tandis que le bloc est une division physique des données.
  2. La taille de bloc par défaut de HDFS est la taille de division par défaut si la division en entrée n'est pas spécifiée.
  3. La division est définie par l'utilisateur et l'utilisateur peut contrôler la taille de la division dans son programme Mappage/Réduire.
  4. Une division peut être mappée à plusieurs blocs et il peut y avoir plusieurs divisions d'un bloc.
  5. Le nombre de tâches de mappage (mappeur) est égal au nombre de divisions.
54
Sandeep Singh
  • 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).

 enter image description here

  • Si HDFS Taille du bloc est configuré comme 128 Mo, les 4 enregistrements ne seront pas répartis de manière égale entre les blocs. Il ressemblera à ceci.

 enter image description here

  • Block 1 contient le premier enregistrement complet et un bloc de 28 Mo du deuxième enregistrement.
  • Si un mappeur doit être exécuté sur Block 1, il ne peut pas être traité car il ne possède pas le second enregistrement complet. 

  • 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

 enter image description here

  • 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.

  • Si la taille du fractionnement en entrée correspond à n fois la taille du bloc, un fractionnement en entrée peut contenir plusieurs blocs et, par conséquent, un nombre moins important de Mappers nécessaires pour l'ensemble du travail, et donc moins de parallélisme. (Le nombre de mappeurs est le nombre de divisions d’entrée)

  • taille de l'entrée = taille du bloc est la configuration idéale.

J'espère que cela t'aides.

11
tharindu_DG

La création de Split dépend du InputFormat utilisé. Le diagramme ci-dessous explique comment la méthode getSplits () de FileInputFormat détermine les divisions pour deux fichiers différents.
Notez le rôle joué par le Split Slope (1.1).
 enter image description here

La source Java correspondante qui effectue la scission est: 

 enter image description here
La méthode computeSplitSize () ci-dessus se développe en Max (minSize, min (maxSize, blockSize)), où la taille min/max peut être configurée en définissant mapreduce.input.fileinputformat.split.minsize/taille max

1
Avinash Ganta