sql >> Databasteknik >  >> NoSQL >> HBase

6 bästa MapReduce Job Optimization Techniques

Prestandajustering hjälper dig att optimera din Hadoop prestanda. I den här bloggen kommer vi att diskutera alla dessa tekniker för MapReduce Job optimizations.

I den här MapReduce-handledningen kommer vi att ge dig 6 viktiga tips för MapReduce Job Optimization, såsom korrekt konfiguration av ditt kluster, LZO-komprimering, korrekt justering av antalet MapReduce-uppgifter etc.

Tips för MapReduce Job Optimization

Nedan finns några MapReduce-jobboptimeringstekniker som kan hjälpa dig att optimera MapReduce-jobbprestanda.

1. Korrekt konfiguration av ditt kluster

  • Med -noatime option Dfs och MapReduce-lagring är monterade. Detta kommer att inaktivera åtkomsttiden. Förbättrar alltså I/O-prestandan.
  • Försök att undvika RAID på TaskTracker och datanod-maskiner. Detta minskar i allmänhet prestandan.
  • Se till att du har konfigurerat mapred.local.dir och dfs.data.dir för att peka på en katalog på var och en av dina diskar. Detta för att säkerställa att all din I/O-kapacitet används.
  • Du bör övervaka diagrammet över swap-användning och nätverksanvändning med programvara. Om du ser att swap används bör du minska mängden RAM som allokeras till varje uppgift i mapred.child.java.opts .
  • Se till att du ska ha smart övervakning av hälsostatusen för dina hårddiskar. Detta är en av de viktiga metoderna för  MapReduce-prestandajustering.

2. LZO-kompressionsanvändning

För mellanliggande data är detta alltid en bra idé. Varje Hadoop jobb som genererar en icke försumbar mängd kartutdata kommer att dra nytta av mellanliggande datakomprimering med LZO.

Även om LZO lägger till lite overhead till CPU, sparar det tid genom att minska mängden disk-IO under blandningen.

Ställ in mapred.compress.map.output till sant för att aktivera LZO-komprimering

3. Korrekt justering av antalet MapReduce-uppgifter

  • I MapReduce-jobbet, om varje uppgift tar 30-40 sekunder eller mer, kommer det att minska antalet uppgifter. kartläggningen  eller reducerare  Processen involverar följande saker:först måste du starta JVM (JVM laddas in i minnet). Sedan måste du initiera JVM. Och efter bearbetning (mappare/reducerare) måste du avinitialisera JVM. Och dessa JVM-uppgifter är mycket kostsamma. Antag ett fall där mapper kör en uppgift bara i 20-30 sekunder. För detta måste vi starta/initiera/stoppa JVM. Detta kan ta avsevärd tid. Så det rekommenderas strängt att köra uppgiften i minst 1 minut.
  • Om ett jobb har mer än 1 TB indata. Då bör du överväga att öka blockstorleken på indatadataset till 256M eller till och med 512M. Så antalet uppgifter blir mindre. Du kan ändra blockstorleken genom att använda kommandot Hadoop distcp –Hdfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks
  • Vi vet att varje uppgift körs i minst 30-40 sekunder. Du bör öka antalet kartläggningsuppgifter till någon multipel av antalet mapparplatser i klustret.
  • Kör inte för många minskade uppgifter – för de flesta jobb. Antalet reduceringsuppgifter lika med eller lite mindre än antalet reduceringsplatser i klustret.

4. Kombinera mellan Mapper och Reducer

Om algoritmen involverar beräkning av aggregat av något slag, bör vi använda en Combiner. Combiner utför viss aggregering innan data träffar reduceraren.

Hadoop MapReduce-ramverket kombineras intelligent för att minska mängden data som ska skrivas till disken. Och denna data måste överföras mellan beräkningsstadierna Map och Reduce.

5. Användning av den mest lämpliga och kompakta skrivbara typen för data

Big data-användare använder texten skrivbar i onödan för att byta från Hadoop Streaming till Java MapReduce. Text kan vara bekvämt. Det är ineffektivt att konvertera numeriska data till och från UTF8-strängar. Och kan faktiskt utgöra en betydande del av CPU-tiden.

6. Återanvändning av skrivbara material

Många MapReduce-användare gör ett mycket vanligt misstag som är att allokera ett nytt skrivbart objekt för varje utdata från en mapper/reducer. Anta, till exempel, implementering av ord-antal kartläggare enligt följande:

public void map(...) {
...
for (String word: words) {
output.collect(new Text(word), new IntWritable(1));
}

Denna implementering orsakar tilldelning av tusentals kortlivade objekt. Även om Java garbage collector gör ett rimligt jobb med att hantera detta, är det mer effektivt att skriva:

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); }
}
}

Slutsats

Därför finns det olika MapReduce-jobboptimeringstekniker som hjälper dig att optimera MapReduce-jobbet. Som att använda combiner mellan mapper och Reducer, genom LZO-komprimering, korrekt inställning av antalet MapReduce-uppgifter, återanvändning av skrivbar.

Om du hittar en annan teknik för MapReduce-jobboptimering, så låt oss veta det i kommentarsfältet nedan.


  1. Filtrera array med $in-operatorn i $projektstadiet

  2. Hur återställer man redis-data från snapshot (rdb-fil) kopierad från en annan maskin?

  3. Översätt FilterDefinition<TDocument> till vanlig json mongo-fråga som jag kan köra i ett mongo-skal

  4. Hur uppdaterar du objekt i ett dokuments array (kapslade uppdatering)