Dividi la dimensione rispetto alla dimensione del blocco in Hadoop

Qual è la relazione tra la dimensione parziale e la dimensione del blocco in Hadoop? Come ho letto in questo , le dimensioni divise devono essere n-volte di dimensione del blocco (n è un intero e n> 0), è corretto? È necessario un rapporto tra dimensione parziale e dimensione del blocco?

Nell’architettura HDFS esiste un concetto di blocchi. Una dimensione di blocco tipica utilizzata da HDFS è di 64 MB. Quando inseriamo un file di grandi dimensioni in HDFS, esso viene spezzettato in blocchi da 64 MB (in base alla configurazione predefinita dei blocchi), Supponiamo di avere un file da 1 GB e di posizionare quel file in HDFS, quindi ci saranno 1 GB / 64 MB = 16 split / blocks e questi blocchi saranno distribuiti attraverso i DataNodes. Questi blocchi / blocchi si trovano su un diverso DataNode in base alla configurazione del cluster.

La suddivisione dei dati avviene in base agli offset dei file. L’objective di suddividere il file e memorizzarlo in diversi blocchi è l’elaborazione parallela e il failover dei dati.

Differenza tra dimensione del blocco e dimensione parziale.

La divisione è una suddivisione logica dei dati, fondamentalmente utilizzata durante l’elaborazione dei dati utilizzando il programma Map / Reduce o altre tecniche di elaborazione dei dati sull’ecosistema Hadoop. Le dimensioni divise sono valori definiti dall’utente e puoi scegliere le tue dimensioni divise in base al volume di dati (quanti dati stai elaborando).

Split è fondamentalmente utilizzato per controllare il numero di Mapper in Map / Reduce program. Se non è stata definita alcuna dimensione di divisione dell’input in Map / Reduce program, il blocco di blocco HDFS predefinito verrà considerato come split di input.

Esempio:

Supponiamo di avere un file di 100 MB e la configurazione del blocco predefinito HDFS è 64 MB, quindi sarà divisa in 2 divisioni e occuperà 2 blocchi. Ora hai un programma Map / Reduce per elaborare questi dati ma non hai specificato alcun split di input, in base al numero di blocchi (2 blocchi), la divisione di input sarà considerata per l’elaborazione Map / Reduce e 2 mapper verrà assegnato per questo lavoro.

Ma supponiamo di aver specificato la dimensione dello split (ad esempio 100 MB) nel programma Map / Reduce, quindi entrambi i blocchi (2 blocchi) saranno considerati come una singola divisione per l’elaborazione Mappa / Riduzione e 1 Mapper verrà assegnato per questo lavoro.

Supponi di aver specificato la dimensione dello split (ad esempio 25 MB) nel programma Map / Reduce, quindi ci saranno 4 split di input per il programma Map / Reduce e 4 Mapper verrà assegnato per il lavoro.

Conclusione:

  1. La divisione è una divisione logica dei dati di input mentre il blocco è una divisione fisica dei dati.
  2. Le dimensioni di blocco predefinite di HDFS sono le dimensioni di divisione predefinite se non è specificato il divario di input.
  3. La divisione è definita dall’utente e l’utente può controllare le dimensioni divise nel suo programma Mappa / Riduzione.
  4. Una divisione può essere associata a più blocchi e può esserci una divisione multipla di un blocco.
  5. Il numero di attività della mappa (Mapper) è uguale al numero di suddivisioni.
  • Supponiamo di avere un file di 400 MB con 4 record ( ad esempio : file CSV di 400 MB e 4 righe, 100 MB ciascuna)

inserisci la descrizione dell'immagine qui

  • Se la dimensione del blocco HDFS è configurata come 128 MB , i 4 record non verranno distribuiti uniformsmente tra i blocchi. Sembrerà così.

inserisci la descrizione dell'immagine qui

  • Il blocco 1 contiene l’intero primo record e un blocco di 28 MB del secondo record.
  • Se un mappatore deve essere eseguito sul Blocco 1 , il mappatore non può elaborare poiché non avrà l’intero secondo record.

  • Questo è esattamente il problema risolto dall’input splits . Le suddivisioni di input rispettano i limiti logici dei record.

  • Supponiamo che la dimensione di divisione dell’input sia 200 MB

inserisci la descrizione dell'immagine qui

  • Pertanto lo split 1 dell’input dovrebbe avere sia il record 1 che il record 2. E l’ingresso split 2 non inizierà con il record 2 poiché il record 2 è stato assegnato all’ingresso split 1. L’ingresso 2 inizierà con il record 3.

  • Questo è il motivo per cui una divisione di input è solo una porzione logica di dati. Punta a iniziare e terminare posizioni con blocchi.

  • Se la dimensione di divisione dell’input è n volte la dimensione del blocco, una divisione di input potrebbe adattarsi a più blocchi e quindi meno numero di Mapper necessari per l’intero lavoro e quindi meno parallelismo. (Numero di mappatori è il numero di divisioni di input)

  • input split size = la dimensione del blocco è la configurazione ideale.

Spero che questo ti aiuti.

La creazione della divisione dipende dal tipo di input che si sta utilizzando. Il diagramma seguente spiega come il metodo getSplits () di FileInputFormat decide le suddivisioni per due file diversi.
Notare il ruolo svolto da Split Slope (1.1).
inserisci la descrizione dell'immagine qui

La corrispondente sorgente Java che esegue la divisione è:

inserisci la descrizione dell'immagine qui
Il metodo computeSplitSize () precedente si espande a Max (minSize, min (maxSize, blockSize)) , dove è ansible configurare le dimensioni min / max impostando mapreduce.input.fileinputformat.split.minsize / maxsize