Dela via


Vägledning för prestandajustering för MapReduce på HDInsight och Azure Data Lake Storage Gen1

Förutsättningar

Parametrar

Här är de viktigaste parametrarna som du kan konfigurera för att öka prestanda för Data Lake Storage Gen1 när du kör MapReduce-jobb:

Parameter Beskrivning
Mapreduce.map.memory.mb Mängden minne som ska allokeras till varje mappare.
Mapreduce.job.maps Antalet map-uppgifter per jobb.
Mapreduce.reduce.memory.mb Mängden minne som ska allokeras till varje reducering.
Mapreduce.job.reduces Antalet reduce-uppgifter per jobb.

Mapreduce.map.memory/Mapreduce.reduce.memory

Justera det här talet baserat på hur mycket minne som behövs för map- och/eller reduce-uppgiften. Du kan visa standardvärdena mapreduce.map.memory för och mapreduce.reduce.memory i Ambari via Yarn-konfigurationen. I Ambari går du till YARN och visar fliken Konfigurationer . YARN-minnet visas.

Mapreduce.job.maps/Mapreduce.job.reduces

Detta avgör det maximala antalet mappningar eller reduceringsfunktioner som ska skapas. Antalet delningar avgör hur många mappningar som skapas för MapReduce-jobbet. Därför kan du få färre mappningar än du begärde om det finns färre delningar än antalet mappningar som begärts.

Vägledning

Steg 1: Fastställa antalet jobb som körs

Som standard använder MapReduce hela klustret för jobbet. Du kan använda mindre av klustret genom att använda färre mappare än det finns tillgängliga containrar. Vägledningen i det här dokumentet förutsätter att ditt program är det enda programmet som körs i klustret.

Steg 2: Ange mapreduce.map.memory/mapreduce.reduce.memory

Storleken på minnet för map- och reduce-uppgifter beror på ditt specifika jobb. Du kan minska minnesstorleken om du vill öka samtidigheten. Antalet uppgifter som körs samtidigt beror på antalet containrar. Genom att minska mängden minne per mappare eller reducerare kan fler containrar skapas, vilket gör att fler mappare eller reducerare kan köras samtidigt. Om du minskar mängden minne för mycket kan vissa processer få slut på minne. Om du får ett heap-fel när du kör jobbet ökar du minnet per mappare eller reducerare. Överväg att lägga till fler containrar ger extra omkostnader för varje ytterligare container, vilket potentiellt kan försämra prestandan. Ett annat alternativ är att få mer minne genom att använda ett kluster som har högre mängder minne eller öka antalet noder i klustret. Mer minne gör att fler containrar kan användas, vilket innebär mer samtidighet.

Steg 3: Fastställa totalt YARN-minne

Om du vill finjustera mapreduce.job.maps/mapreduce.job.reduces bör du överväga mängden totalt YARN-minne som är tillgängligt för användning. Den här informationen är tillgänglig i Ambari. Gå till YARN och visa fliken Konfigurationer . YARN-minnet visas i det här fönstret. Multiplicera YARN-minnet med antalet noder i klustret för att få det totala YARN-minnet.

Total YARN memory = nodes * YARN memory per node

Om du använder ett tomt kluster kan minnet vara det totala YARN-minnet för klustret. Om andra program använder minne kan du välja att bara använda en del av klustrets minne genom att minska antalet mappare eller reducerare till det antal containrar som du vill använda.

Steg 4: Beräkna antalet YARN-containrar

YARN-containrar avgör hur mycket samtidighet som är tillgänglig för jobbet. Ta totalt YARN-minne och dividera det med mapreduce.map.memory.

# of YARN containers = total YARN memory / mapreduce.map.memory

Steg 5: Ange mapreduce.job.maps/mapreduce.job.reduces

Ange mapreduce.job.maps/mapreduce.job.reduces till minst antalet tillgängliga containrar. Du kan experimentera ytterligare genom att öka antalet mappningar och reduceringsfunktioner för att se om du får bättre prestanda. Tänk på att fler mappare kommer att ha ytterligare kostnader, så att ha för många mappare kan försämra prestandan.

Cpu-schemaläggning och CPU-isolering är inaktiverade som standard, så antalet YARN-containrar begränsas av minnet.

Exempelberäkning

Anta att du för närvarande har ett kluster som består av 8 D14-noder och du vill köra ett I/O-intensivt jobb. Här är de beräkningar som du bör göra:

Steg 1: Fastställa antalet jobb som körs

I vårt exempel antar vi att vårt jobb är det enda som körs.

Steg 2: Ange mapreduce.map.memory/mapreduce.reduce.memory

I vårt exempel kör du ett I/O-intensivt jobb och bestämmer dig för att det räcker med 3 GB minne för map-uppgifter.

mapreduce.map.memory = 3GB

Steg 3: Fastställa totalt YARN-minne

total memory from the cluster is 8 nodes * 96GB of YARN memory for a D14 = 768GB

Steg 4: Beräkna antal YARN-containrar

# of YARN containers = 768 GB of available memory / 3 GB of memory = 256

Steg 5: Ange mapreduce.job.maps/mapreduce.job.reduces

mapreduce.map.jobs = 256

Begränsningar

Data Lake Storage Gen1 begränsning

Som en tjänst för flera innehavare anger Data Lake Storage Gen1 bandbreddsgränser på kontonivå. Om du når dessa gränser börjar du se aktivitetsfel. Detta kan identifieras genom att observera begränsningsfel i aktivitetsloggar. Kontakta oss om du behöver mer bandbredd för ditt jobb.

För att kontrollera om du får begränsningar måste du aktivera felsökningsloggningen på klientsidan. Så här kan du göra det:

  1. Placera följande egenskap i log4j-egenskaperna i Ambari > YARN > Config > Advanced yarn-log4j: log4j.logger.com.microsoft.azure.datalake.store=DEBUG

  2. Starta om alla noder/tjänst för att konfigurationen ska börja gälla.

  3. Om du får en begränsning visas HTTP 429-felkoden i YARN-loggfilen. YARN-loggfilen finns i /tmp/<user>/yarn.log

Exempel som ska köras

För att demonstrera hur MapReduce körs på Data Lake Storage Gen1 är följande exempelkod som kördes i ett kluster med följande inställningar:

  • 16 nod D14v2
  • Hadoop-kluster som kör HDI 3.6

Här följer några exempelkommandon för att köra MapReduce Teragen, Terasort och Teravalidate. Du kan justera dessa kommandon baserat på dina resurser.

Teragen

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teragen -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 10000000000 adl://example/data/1TB-sort-input

Terasort

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar terasort -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 -Dmapreduce.job.reduces=512 -Dmapreduce.reduce.memory.mb=3072 adl://example/data/1TB-sort-input adl://example/data/1TB-sort-output

Teravalidate

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teravalidate -Dmapreduce.job.maps=512 -Dmapreduce.map.memory.mb=3072 adl://example/data/1TB-sort-output adl://example/data/1TB-sort-validate