Video: Hadoop Processing Frameworks 2025
Un'applicazione MapReduce elabora i dati nelle suddivisioni di input su una base record per record e che ogni record viene interpretato da MapReduce come chiave / valore coppia. Dopo aver calcolato le divisioni di input, le attività del mapper possono iniziare a elaborarle, ovvero subito dopo che la funzione di pianificazione del Resource Manager assegna loro le proprie risorse di elaborazione. (In Hadoop 1, JobTracker assegna le attività di mappatura a specifici slot di elaborazione.)
Il compito del mappatore stesso elabora il suo input diviso un record alla volta - nella figura, questo record solitario è rappresentato dalla coppia chiave / valore. Nel caso dei nostri dati di volo, quando vengono calcolate le divisioni di input (utilizzando il metodo di elaborazione file predefinito per i file di testo), si assume che ogni riga nel file di testo sia un singolo record.
Per ogni record, il testo della riga stessa rappresenta il valore e l'offset di byte di ogni riga dall'inizio della divisione è considerato la chiave.
Ci si potrebbe chiedere perché il numero di riga non viene utilizzato al posto dell'offset di byte. Se si considera che un file di testo di grandi dimensioni è suddiviso in molti blocchi di dati individuali e viene elaborato con molte suddivisioni, il numero di riga è un concetto rischioso.
Il numero di righe in ogni divisione varia, quindi sarebbe impossibile calcolare il numero di righe precedenti a quello in elaborazione. Tuttavia, con l'offset di byte, puoi essere preciso, perché ogni blocco ha un numero fisso di byte.
Poiché un compito del mappatore elabora ogni record, genera una nuova coppia chiave / valore: la chiave e il valore qui possono essere completamente diversi dalla coppia di input. L'output dell'attività del mappatore è la raccolta completa di tutte queste coppie chiave / valore.
Prima che venga scritto il file di output finale per ogni attività del programma di mappatura, l'output viene partizionato in base alla chiave e ordinato. Questo partizionamento significa che tutti i valori per ogni chiave sono raggruppati insieme.
Nel caso di un'applicazione di esempio abbastanza semplice, c'è solo un singolo riduttore, quindi tutto l'output dell'attività del mappatore viene scritto su un singolo file. Ma nei casi con riduttori multipli, ogni attività di mappatura può generare anche più file di output.
La suddivisione di questi file di output si basa sulla chiave di partizionamento. Ad esempio, se sono disponibili solo tre chiavi di partizionamento distinte per le attività del mapper e sono stati configurati tre riduttori per il lavoro, saranno presenti tre file di output del mapping. In questo esempio, se un particolare task del mappatore elabora una divisione di input e genera output con due delle tre chiavi, ci saranno solo due file di output.
Comprimi sempre i file di output delle attività del mapper. Il vantaggio maggiore qui è rappresentato dai guadagni in termini di prestazioni, poiché la scrittura di file di output più piccoli riduce al minimo l'inevitabile costo del trasferimento dell'output del mapping ai nodi in cui sono in esecuzione i riduttori.
Il partizionatore predefinito è più che adeguato nella maggior parte delle situazioni, ma a volte potresti voler personalizzare la partizione dei dati prima che vengano elaborati dai riduttori. Ad esempio, è possibile che i dati nei set di risultati vengano ordinati in base alla chiave e ai relativi valori, noti come ordinamento secondario .
Per fare ciò, è possibile sovrascrivere il partizionatore predefinito e implementare il proprio. Questo processo richiede una certa attenzione, tuttavia, poiché è necessario assicurarsi che il numero di record in ciascuna partizione sia uniforme. (Se un riduttore deve elaborare molti più dati rispetto agli altri riduttori, si aspetterà che il lavoro MapReduce finisca mentre il singolo riduttore oberato di lavoro sta attraversando il proprio insieme di dati sproporzionatamente grande.)
Usando file intermedi di dimensioni uniformi, si può sfruttare meglio il parallelismo disponibile nell'elaborazione di MapReduce.
