Video: Hadoop Rack Awareness 2024
Quando si archivia un file in HDFS, il sistema lo suddivide in un insieme di singoli blocchi e memorizza questi blocchi in vari nodi slave nel cluster Hadoop. Questa è una cosa assolutamente normale da fare, poiché tutti i file system rompono i file in blocchi prima di memorizzarli sul disco.
HDFS non ha idea (e non gli interessa) di ciò che è memorizzato all'interno del file, quindi i file non elaborati non vengono suddivisi in base a regole che noi umani intendiamo. Gli esseri umani, per esempio, vorrebbero confini del record - le linee che mostrano dove inizia e finisce un disco - devono essere rispettate.
HDFS è spesso del tutto ignaro del fatto che il record finale in un blocco può essere solo un record parziale, con il resto del suo contenuto deviato al blocco successivo. HDFS vuole solo assicurarsi che i file siano suddivisi in blocchi di dimensioni uguali che corrispondono alla dimensione di blocco predefinita per l'istanza di Hadoop (a meno che non sia stato inserito un valore personalizzato per il file che si sta memorizzando). Nella figura precedente, quella dimensione del blocco è 128 MB.
Non tutti i file che è necessario memorizzare sono un multiplo esatto delle dimensioni del blocco del sistema, quindi il blocco dati finale per un file utilizza solo lo spazio necessario. Nel caso della figura precedente, il blocco finale di dati è 1 MB.
Il concetto di memorizzare un file come una raccolta di blocchi è del tutto coerente con il modo in cui i file system normalmente funzionano. Ma ciò che è diverso su HDFS è la scala. Una tipica dimensione di blocco che si vedrebbe in un file system sotto Linux è 4KB, mentre una dimensione di blocco tipica in Hadoop è 128 MB. Questo valore è configurabile e può essere personalizzato, sia come nuovo predefinito di sistema sia come valore personalizzato per singoli file.
Hadoop è stato progettato per archiviare i dati alla scala dei petabyte, dove sono ridotti al minimo eventuali limiti di ridimensionamento. L'elevata dimensione del blocco è una diretta conseguenza di questa necessità di archiviare dati su vasta scala.
Prima di tutto, ogni blocco di dati memorizzato in HDFS ha i propri metadati e deve essere monitorato da un server centrale in modo che le applicazioni che necessitano di accedere a un file specifico possano essere indirizzate ovunque siano memorizzati tutti i blocchi del file. Se la dimensione del blocco fosse compresa nell'intervallo dei kilobyte, anche i volumi di dati modesti nella scala del terabyte sovraccaricherebbero il server dei metadati con troppi blocchi da tracciare.
In secondo luogo, HDFS è progettato per consentire un throughput elevato in modo che l'elaborazione parallela di questi grandi set di dati avvenga il più rapidamente possibile. La chiave per la scalabilità di Hadoop sul lato dell'elaborazione dei dati è, e sarà sempre, parallelismo - la capacità di elaborare i singoli blocchi di questi file di grandi dimensioni in parallelo.
Per consentire un'elaborazione efficiente, è necessario trovare un equilibrio. Da una parte, la dimensione del blocco deve essere abbastanza grande da giustificare le risorse dedicate a una singola unità di elaborazione dei dati (ad esempio, una mappa o ridurre l'attività). D'altra parte, la dimensione del blocco non può essere così grande che il sistema attende un tempo molto lungo perché un'ultima unità di elaborazione dati finisca il suo lavoro.
Queste due considerazioni dipendono ovviamente dal tipo di lavoro svolto sui blocchi di dati.