In che modo Hadoop esegue le suddivisioni di input?

Questa è una domanda concettuale che coinvolge Hadoop / HDFS. Diciamo che hai un file contenente 1 miliardo di righe. E per semplicità, consideriamo che ogni linea ha la forma dove k è l’offset della linea dall’inizio e il valore è il contenuto della linea.

Ora, quando diciamo che vogliamo eseguire le attività della mappa N, il framework divide il file di input in N divide ed esegue ciascuna attività della mappa su quella suddivisione? o dobbiamo scrivere una funzione di partizionamento che fa dividere N ed eseguire ogni attività sulla divisione generata?

Tutto quello che voglio sapere è se gli split sono fatti internamente o dobbiamo dividere i dati manualmente?

Più specificamente, ogni volta che viene chiamata la funzione map () quali sono i suoi parametri Key key and Value val ?

Grazie, Deepak

InputFormat è responsabile di fornire le suddivisioni.

In generale, se hai n nodes, l’HDFS distribuirà il file su tutti questi n nodes. Se si avvia un lavoro, ci saranno n mapper per impostazione predefinita. Grazie a Hadoop, il mapper su una macchina elaborerà la parte dei dati archiviata su questo nodo. Penso che questo si chiami Rack awareness .

Quindi, per farla breve: caricare i dati in HDFS e avviare un processo MR. Hadoop si prenderà cura dell’esecuzione ottimizzata.

I file sono suddivisi in blocchi HDFS e i blocchi vengono replicati. Hadoop assegna un nodo per una suddivisione basata sul principio della localizzazione dei dati. Hadoop proverà ad eseguire il mapper sui nodes in cui risiede il blocco. A causa della replica, ci sono più nodes di questo tipo che ospitano lo stesso blocco.

Nel caso in cui i nodes non siano disponibili, Hadoop proverà a selezionare un nodo più vicino al nodo che ospita il blocco di dati. Ad esempio, potrebbe scegliere un altro nodo nello stesso rack. Un nodo potrebbe non essere disponibile per vari motivi; tutti gli slot della mappa potrebbero essere in uso o il nodo potrebbe semplicemente essere inattivo.

Fortunatamente tutto sarà curato dal framework.

L’ elaborazione dei dati MapReduce è guidata da questo concetto di divisione dell’input . Il numero di divisioni di input calcolate per un’applicazione specifica determina il numero di attività del programma di analisi.

Il numero di mappe è generalmente determinato dal numero di blocchi DFS nei file di input.

Ognuna di queste attività del mappatore viene assegnata, ove ansible, a un nodo slave in cui è archiviata la divisione di input. Resource Manager (o JobTracker, se ti trovi in ​​Hadoop 1) fa del suo meglio per garantire che le divisioni di input vengano elaborate localmente.

Se la località dei dati non può essere raggiunta a causa di divisioni di input che attraversano i confini dei nodes di dati, alcuni dati saranno trasferiti da un nodo Data ad un altro nodo di dati.

Supponiamo che ci sia un blocco di 128 MB e l’ultimo record non si adatta al blocco a e si diffonde nel blocco b , quindi i dati nel blocco b saranno copiati nel nodo che ha il blocco a

Dai un’occhiata a questo diagramma.

inserisci la descrizione dell'immagine qui

Dai un’occhiata ai quesitons correlati

Informazioni sulla divisione dei file Hadoop / HDFS

In che modo i record del processo Hadoop si suddividono attraverso i limiti dei blocchi?

Per una migliore comprensione di come InputSplits funzioni in hadoop, consiglierei di leggere l’ articolo scritto da hadoop per i manichini . È davvero utile

Penso che quello che Deepak stava chiedendo fosse più come viene determinato l’input per ogni chiamata della funzione mappa, piuttosto che i dati presenti su ogni nodo della mappa. Lo dico in base alla seconda parte della domanda: Più specificamente, ogni volta che viene chiamata la funzione map () quali sono i suoi parametri Key key e Value val?

In realtà, la stessa domanda mi ha portato qui, e se fossi stato uno sviluppatore esperto di hadoop, avrei potuto interpretarlo come le risposte sopra.

Per rispondere alla domanda,

il file su un dato nodo della mappa è diviso, in base al valore impostato per InputFormat . (questo viene fatto in java usando setInputFormat () !)

Un esempio:

conf.setInputFormat (TextInputFormat.class); Qui, passando TextInputFormat alla funzione setInputFormat, stiamo dicendo a hadoop di trattare ogni riga del file di input sul nodo della mappa come input per la funzione map. Linefeed o carriage-return vengono utilizzati per segnalare la fine della riga. maggiori informazioni su TextInputFormat !

In questo esempio: le chiavi sono la posizione nel file e i valori sono la riga di testo.

Spero che questo ti aiuti.

FileInputFormat è la class astratta che definisce il modo in cui i file di input vengono letti e riversati. FileInputFormat fornisce i seguenti funzionaliti: 1. seleziona i file / oggetti che dovrebbero essere usati come input 2. Definisce inputplits che spezzano un file in attività.

Come per le funzionalità di base di hadoopp, se ci sono n split allora ci sarà n mapper.

Quando viene eseguito un lavoro Hadoop, divide i file di input in blocchi e assegna ogni divisione a un programma di elaborazione da elaborare; questo è chiamato InputSplit.

La risposta breve è InputFormat che si occupa della divisione del file.

Il modo in cui mi avvicino a questa domanda è guardando la sua class TextInputFormat predefinita:

Tutte le classi InputFormat sono sottoclass di FileInputFormat, che si occupano della divisione.

In particolare, la funzione getSplit di FileInputFormat genera un elenco di InputSplit, dall’elenco di file definiti in JobContext. La suddivisione si basa sulla dimensione dei byte, il cui minimo e massimo potrebbero essere definiti arbitrariamente nel file xml di progetto.

C’è una mappa separata che riduce il lavoro che divide i file in blocchi. Usa FileInputFormat per file di grandi dimensioni e CombineFileInput Format per quelli più piccoli. È inoltre ansible verificare se l’input può essere suddiviso in blocchi mediante il metodo issplittable. Ogni blocco viene quindi inviato a un nodo dati in cui una mappa riduce le esecuzioni del lavoro per ulteriori analisi. la dimensione di un blocco dipende dalla dimensione che hai menzionato nel parametro mapred.max.split.size.

FileInputFormat.addInputPath (job, new Path (args [0])); o

conf.setInputFormat (TextInputFormat.class);

class Funzione FileInputFormat addInputPath , setInputFormat si occupa di inputplit, inoltre questo codice definisce il numero di mapper che vengono creati. possiamo dire inputplit e il numero di mappatori è direttamente proporzionale al numero di blocchi utilizzati per la memorizzazione di file di input su HDFS.

Ex. se abbiamo un file di input con dimensioni 74 Mb, questo file memorizzato su HDFS in due blocchi (64 MB e 10 Mb). così inputplit per questo file sono create due e due istanze di mapping per la lettura di questo file di input.

Differenza tra la dimensione del blocco e la dimensione di divisione dell’input.

Input Split è una suddivisione logica dei dati, fondamentalmente utilizzata durante l’elaborazione dei dati nel programma MapReduce o altre tecniche di elaborazione. La dimensione di divisione dell’input è un valore definito dall’utente e Hadoop Developer può scegliere la dimensione di divisione in base alla dimensione dei dati (quanti dati si stanno elaborando).

Input Split è fondamentalmente utilizzato per controllare il numero di Mapper nel programma MapReduce. Se non è stata definita la dimensione di divisione dell’input nel programma MapReduce, la suddivisione del blocco HDFS predefinita verrà considerata come suddivisione dell’input durante l’elaborazione dei dati.

Esempio:

Supponiamo di avere un file di 100 MB e la configurazione del blocco predefinito HDFS è di 64 MB, quindi verrà suddivisa in 2 divisioni e occuperà due blocchi HDFS. Ora avete un programma MapReduce per elaborare questi dati, ma non avete specificato la divisione di input, in base al numero di blocchi (2 blocchi) sarà considerato come split di input per l’elaborazione MapReduce e due mapper verranno assegnati per questo lavoro. Ma supponiamo che tu abbia specificato la dimensione dello split (ad esempio 100 MB) nel tuo programma MapReduce, quindi entrambi i blocchi (2 blocchi) saranno considerati come una singola divisione per l’elaborazione MapReduce e un Mapper verrà assegnato per questo lavoro.

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

Conclusione:

  1. Input Split è una divisione logica dei dati di input mentre il blocco HDFS è una divisione fisica dei dati.
  2. La dimensione di blocco predefinita di HDFS è una dimensione di divisione predefinita se la divisione di input non viene specificata tramite il codice.
  3. La divisione è definita dall’utente e l’utente può controllare le dimensioni divise nel suo programma MapReduce.
  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 divisioni di input.

Fonte: https://hadoopjournal.wordpress.com/2015/06/30/mapreduce-input-split-versus-hdfs-blocks/