L'ottimizzazione delle prestazioni ti aiuterà a ottimizzare il tuo Hadoop prestazione. In questo blog parleremo di tutte queste tecniche per l'ottimizzazione dei lavori di MapReduce.
In questo tutorial di MapReduce, ti forniremo 6 suggerimenti importanti per l'ottimizzazione dei processi MapReduce come la corretta configurazione del tuo cluster, l'utilizzo della compressione LZO, la corretta regolazione del numero di attività MapReduce ecc.
Suggerimenti per l'ottimizzazione del lavoro MapReduce
Di seguito sono riportate alcune tecniche di ottimizzazione del lavoro di MapReduce che potrebbero aiutarti a ottimizzare le prestazioni del lavoro di MapReduce.
1. Configurazione corretta del tuo cluster
- Con -noatime l'opzione Dfs e la memoria MapReduce sono montate. Questo disabiliterà il tempo di accesso. Migliora così le prestazioni di I/O.
- Cerca di evitare il RAID su TaskTracker e macchine datanode. Questo generalmente riduce le prestazioni.
- Assicurati di aver configurato mapred.local.dir e dfs.data.dir per puntare a una directory su ciascuno dei tuoi dischi. Questo per garantire che tutta la tua capacità di I/O venga utilizzata.
- Dovresti monitorare il grafico dell'utilizzo dello scambio e dell'utilizzo della rete con il software. Se vedi che viene utilizzato lo scambio, dovresti ridurre la quantità di RAM allocata a ciascuna attività in mapred.child.java.opts .
- Assicurati di avere un monitoraggio intelligente dello stato di salute delle tue unità disco. Questa è una delle pratiche importanti per l'ottimizzazione delle prestazioni di MapReduce.
2. Utilizzo della compressione LZO
Per i dati intermedi, questa è sempre una buona idea. Ogni lavoro Hadoop che genera una quantità non trascurabile di output della mappa trarrà vantaggio dalla compressione dei dati intermedia con LZO.
Sebbene LZO aggiunga un po' di sovraccarico alla CPU, fa risparmiare tempo riducendo la quantità di IO del disco durante la riproduzione casuale.
Imposta mapred.compress.map.output su true per abilitare la compressione LZO
3. Regolazione corretta del numero di attività MapReduce
- Nel processo MapReduce, se ogni attività richiede 30-40 secondi o più, ridurrà il numero di attività. Il mapper o riduttore il processo prevede le seguenti cose:in primo luogo, è necessario avviare JVM (JVM caricata nella memoria). Quindi è necessario inizializzare JVM. E dopo l'elaborazione (mapper/riduttore) è necessario de-inizializzare JVM. E queste attività JVM sono molto costose. Supponiamo un caso in cui il mapper esegua un'attività solo per 20-30 secondi. Per questo, abbiamo bisogno di avviare/inizializzare/arrestare JVM. Questo potrebbe richiedere una notevole quantità di tempo. Pertanto, si consiglia vivamente di eseguire l'attività per almeno 1 minuto.
- Se un lavoro ha più di 1 TB di input. Quindi dovresti considerare di aumentare la dimensione del blocco del set di dati di input a 256 M o addirittura 512 M. Quindi il numero di attività sarà inferiore. Puoi modificare la dimensione del blocco utilizzando il comando Hadoop distcp –Hdfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks
- Come sappiamo, ogni attività viene eseguita per almeno 30-40 secondi. Dovresti aumentare il numero di attività di mappatura a un multiplo del numero di slot di mappatura nel cluster.
- Non eseguire troppe attività di riduzione, per la maggior parte dei lavori. Il numero di attività di riduzione uguale o leggermente inferiore al numero di slot di riduzione nel cluster.
4. Combinatore tra Mapper e Reducer
Se l'algoritmo prevede il calcolo di aggregati di qualsiasi tipo, dovremmo utilizzare un Combinatore. Il combinatore esegue alcune aggregazioni prima che i dati raggiungano il riduttore.
Il framework Hadoop MapReduce si combina in modo intelligente per ridurre la quantità di dati da scrivere su disco. E quei dati devono essere trasferiti tra le fasi di calcolo Mappa e Riduci.
5. Utilizzo del tipo scrivibile più appropriato e compatto per i dati
Gli utenti di big data utilizzano inutilmente il tipo scrivibile Testo per passare da Hadoop Streaming a Java MapReduce. Il testo può essere conveniente. Non è efficiente convertire dati numerici in e da stringhe UTF8. E può effettivamente occupare una parte significativa del tempo della CPU.
6. Riutilizzo di scrivibili
Molti utenti di MapReduce commettono un errore molto comune che consiste nell'allocare un nuovo oggetto scrivibile per ogni output di un mappatore/riduttore. Si supponga, ad esempio, l'implementazione del mappatore di conteggio parole come segue:
public void map(...) { ... for (String word: words) { output.collect(new Text(word), new IntWritable(1)); }
Questa implementazione provoca l'allocazione di migliaia di oggetti di breve durata. Sebbene Java Garbage Collector svolga un lavoro ragionevole nell'affrontare questo problema, è più efficiente scrivere:
class MyMapper ... { Text wordText = new Text(); IntWritable one = new IntWritable(1); public void map(...) { ... for (String word: words) { wordText.set(word); output.collect(word, one); } } }
Conclusione
Quindi, ci sono varie tecniche di ottimizzazione del lavoro MapReduce che ti aiutano a ottimizzare il lavoro MapReduce. Come l'utilizzo del combinatore tra mapper e Reducer, tramite l'utilizzo della compressione LZO, la corretta regolazione del numero di attività MapReduce, il riutilizzo di scrivibili.
Se trovi un'altra tecnica per l'ottimizzazione del lavoro MapReduce, faccelo sapere nella sezione commenti riportata di seguito.