Dela via


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

Förutsättningar

Parameterar

När du kör MapReduce-jobb, här är de viktigaste parametrarna som du kan konfigurera för att öka prestanda på Data Lake Storage Gen1:

Parameter Beskrivning
Mapreduce.map.memory.mb Mängden minne som ska allokeras till varje mappare.
Mapreduce.job.maps Antalet mappningsuppgifter per jobb.
Mapreduce.reduce.memory.mb Mängden minne som ska allokeras till varje reducer.
Mapreduce.job.reduces Antalet reduceringsuppgifter 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-aktiviteten. Du kan visa standardvärdena för mapreduce.map.memory och mapreduce.reduce.memory i Ambari via Yarn-konfigurationen. I Ambari navigerar du till YARN och visar fliken Konfigurationer. YARN-minnet visas.

Mapreduce.job.maps/Mapreduce.job.reduces

Detta avgör det maximala antalet mappare eller reducers 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 mappare än du begärde om det finns färre delningar än det antal mappare 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 en mindre del 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 mappnings- och reduce-uppgifter beror på ditt specifika jobb. Du kan minska minnesstorleken om du vill öka samtidigheten. Antalet aktiviteter som körs samtidigt beror på antalet containrar. Genom att minska mängden minne per mappare eller reducer kan fler containrar skapas, vilket gör att fler mappare eller reducers 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, öka minnet per mappare eller reducer. Överväg att lägga till fler containrar ger extra omkostnader för varje ytterligare container, vilket potentiellt kan försämra prestanda. 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 hur mycket 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 endast använda en del av klustrets minne genom att minska antalet mappare eller reducers till det antal containrar som du vill använda.

Steg 4: Beräkna antalet YARN-containrar

YARN-kontainrar avgör hur mycket konkurrens 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 mappare och reducers för att se om du får bättre prestanda. Tänk på att fler mappare kommer att ha ytterligare omkostnader, 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.

Beräkningsexempel

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

Steg 1: Bestämma 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 kartuppgifter.

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 uppnår dessa gränser börjar du se funktionsfel. Detta kan identifieras genom att observera överbelastningsfel i uppdragsloggar. Kontakta oss om du behöver mer bandbredd för ditt jobb.

För att kontrollera om du blir begränsad måste du aktivera felsökningsloggningen på klientsidan. Så här gör du 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 blir strypt visas HTTP 429-felkoden i YARN-loggfilen. YARN-loggfilen finns i /tmp/<användare>/yarn.log

Exempel som ska köras

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

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

Här är 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