La taille de bloc de données par défaut de HDFS/Hadoop est de 64 Mo. La taille du bloc sur le disque est généralement de 4 Ko. Que signifie une taille de bloc de 64 Mo? -> Cela signifie-t-il que la plus petite unité de lecture du disque est de 64 Mo?
Si oui, quel est l'avantage de le faire? -> Facile pour un accès continu à un fichier volumineux dans HDFS?
Pouvons-nous faire la même chose en utilisant la taille de bloc d'origine de 4 Ko sur le disque?
What does 64MB block size mean?
La taille de bloc est la plus petite unité de données qu'un système de fichiers peut stocker. Si vous stockez un fichier de 1 Ko ou de 60 Mo, cela prendra un bloc. Une fois que vous avez traversé la limite de 64 Mo, vous avez besoin d’un deuxième bloc.
If yes, what is the advantage of doing that?
HDFS est conçu pour gérer des fichiers volumineux. Disons que vous avez un fichier de 1000 Mo. Avec une taille de bloc de 4 ko, vous devrez faire 256 000 demandes pour obtenir ce fichier (une demande par bloc). Dans HDFS, ces demandes passent par un réseau et génèrent beaucoup de temps système. Chaque demande doit être traitée par le nom Node pour savoir où se trouve ce bloc. C'est beaucoup de trafic! Si vous utilisez des blocs de 64 Mo, le nombre de demandes passe à 16, réduisant considérablement le coût des frais généraux et de la charge sur le nœud de nom.
La conception de HDFS a été inspirée à l'origine par la conception du système de fichiers Google (GFS). Voici les deux raisons pour lesquelles les blocs de grande taille sont indiqués dans le document GFS d'origine (note 1 sur la terminologie GFS vs HDFS: chunk = block, chunkserver = datanode, master = namenode; note 2: le formatage en gras est à moi):
Une grande taille de bloc offre plusieurs avantages importants. Tout d'abord , cela réduit le besoin des clients d'interagir avec le maître, car les lectures et les écritures sur le même segment ne nécessitent qu'une seule demande initiale auprès du maître pour obtenir des informations sur l'emplacement du bloc. . Cette réduction est particulièrement importante pour nos charges de travail car les applications lisent et écrivent de manière séquentielle des fichiers volumineux. [...] Seconde , puisqu'un client est plus susceptible d'exécuter de nombreuses opérations sur un morceau donné, il peut réduire la charge réseau en conservant une connexion persistante TCP au serveur de morceaux sur une période prolongée. Troisièmement, cela réduit la taille des métadonnées stockées sur le maître. Cela nous permet de conserver les métadonnées en mémoire, ce qui à son tour apporte d'autres avantages que nous discuterons dans la section 2.6.1.
Enfin, je dois signaler que la taille par défaut dans Apache Hadoop est de 128 Mo.
Dans HDFS, la taille du bloc contrôle le niveau de déclassement de la réplication. Plus la taille de bloc est faible, plus vos blocs sont répartis de manière égale sur les DataNodes. Plus la taille de bloc est élevée, plus vos données sont potentiellement réparties de manière moins égale dans votre cluster.
Alors, quel est l’intérêt de choisir une taille de bloc plus élevée au lieu d’une valeur faible? Si, en théorie, une distribution égale des données est une bonne chose, une taille de bloc trop basse présente des inconvénients importants. La capacité de NameNode étant limitée, le fait de disposer d'une taille de bloc de 4 Ko au lieu de 128 Mo signifie également disposer de 32 768 fois plus d'informations à stocker. MapReduce pourrait également tirer profit de données distribuées de manière égale en lançant davantage de tâches de carte sur plus de NodeManager et plus de cœurs de processeur, mais en pratique, les avantages théoriques seront perdus si on ne peut pas effectuer de lectures séquentielles dans la mémoire tampon et à cause de la latence de chaque tâche de carte.
En OS normal, la taille de bloc est de 4K et de 64 Mo en hadoop. Parce que pour la maintenance facile des métadonnées en Namurode.
Supposons que nous n’avions que 4 Ko de taille de bloc dans hadoop et que nous essayions de charger 100 Mo de données dans ce fichier de 4 Ko. Nous avons besoin ici de plus en plus de blocs de 4 Ko. Et namenode doit conserver tous ces blocs de métadonnées 4K.
Si nous utilisons 64 Mo de taille de bloc, les données ne seront chargées que dans deux blocs (64 et 36 Mo). La taille des métadonnées est donc réduite.
Conclusion: pour réduire la charge de travail sur le nom-code, HDFS préfère une taille de bloc de 64 ou 128 Mo. La taille par défaut du bloc est 64 Mo dans Hadoop 1.0 et 128 Mo dans Hadoop 2.0.
Cela a plus à voir avec la recherche de disque dur du disque dur (Hard Disk Drives). Au fil du temps, le temps de recherche de disque n'avait pas beaucoup progressé par rapport au débit du disque. Ainsi, lorsque la taille de bloc est petite (ce qui conduit à un trop grand nombre de blocs), il y aura trop de recherches de disque, ce qui n’est pas très efficace. À mesure que nous progressons d’un disque dur à un disque SDD, le temps de recherche du disque n’a pas beaucoup de sens car il s’agit de pièces mobiles dans le SSD.
De plus, s'il y a trop de blocs, le nœud de nom sera sollicité. Notez que le nom Node doit stocker toutes les métadonnées (données sur les blocs) dans la mémoire. Dans Apache Hadoop, la taille de bloc par défaut est de 64 Mo et dans Cloudera Hadoop, par défaut, de 128 MB.
Si Hadoop a choisi 64 Mo, c'est parce que Google en a choisi 64. La raison pour laquelle Google a choisi 64 Mo était due à un argument Goldilocks.
Avoir une taille de bloc beaucoup plus petite entraînerait une augmentation des frais généraux de recherche.
La taille des blocs étant modérément réduite, les tâches de carte s'exécutent suffisamment rapidement pour que leur coût de planification soit comparable à leur coût d'exécution.
Le fait d'avoir une taille de bloc beaucoup plus grande commence à diminuer le parallélisme de lecture disponible et peut finalement rendre difficile la planification de tâches locales.
Voir la publication de Google Research: MapReduce http://research.google.com/archive/mapreduce.html
Vous trouverez ci-dessous les explications du livre "Hadoop: Le guide définitif", 3e édition (p45).
Pourquoi un bloc dans HDFS est-il si grand?
Les blocs HDFS sont volumineux comparés aux blocs de disque, et ceci pour minimiser le coût des recherches. En rendant un bloc suffisamment grand, le temps nécessaire pour transférer les données du disque peut être considérablement plus long que le temps nécessaire pour rechercher le début du bloc. Ainsi, le temps nécessaire pour transférer un fichier volumineux constitué de plusieurs blocs fonctionne au taux de transfert du disque.
Un calcul rapide montre que si le temps de recherche est d’environ 10 ms et le taux de transfert de 100 Mo/s, pour que le temps de recherche atteigne 1% du temps de transfert, nous devons définir une taille de bloc d’environ 100 Mo. La valeur par défaut est en réalité de 64 Mo, bien que de nombreuses installations HDFS utilisent des blocs de 128 Mo. Ce chiffre continuera à être revu à la hausse à mesure que les vitesses de transfert augmentent avec les nouvelles générations de disques.
Cet argument ne doit cependant pas être poussé trop loin. Les tâches de carte dans MapReduce fonctionnent normalement sur un bloc à la fois. Par conséquent, si vous avez trop peu de tâches (moins de nœuds dans le cluster), vos tâches s'exécuteront plus lentement qu'elles ne le pourraient autrement.