Linee guida per l'ottimizzazione delle prestazioni di MapReduce in HDInsight e in Azure Data Lake StorePerformance tuning guidance for MapReduce on HDInsight and Azure Data Lake Store

PrerequisitiPrerequisites

parametersParameters

Vengono ora illustrati i parametri più importanti da configurare per aumentare le prestazioni in ADLS durante l'esecuzione di processi MapReduce:When running MapReduce jobs, here are the most important parameters that you can configure to increase performance on ADLS:

  • Mapreduce.map.memory.mb: la quantità di memoria da allocare a ciascun mapperMapreduce.map.memory.mb – The amount of memory to allocate to each mapper
  • Mapreduce.job.maps: il numero di attività di mapping per processoMapreduce.job.maps – The number of map tasks per job
  • Mapreduce.reduce.memory.mb: la quantità di memoria da allocare a ciascun riduttoreMapreduce.reduce.memory.mb – The amount of memory to allocate to each reducer
  • Mapreduce.job.reduces: il numero di attività di riduzione per processoMapreduce.job.reduces – The number of reduce tasks per job

Mapreduce.map.memory / Mapreduce.reduce.memory: numero da regolare in base alla quantità di memoria necessaria per le operazioni di mapping e/o riduzione.Mapreduce.map.memory / Mapreduce.reduce.memory This number should be adjusted based on how much memory is needed for the map and/or reduce task. È possibile visualizzare i valori predefiniti di mapreduce.map.memory e mapreduce.reduce.memory in Ambari tramite la configurazione Yarn.The default values of mapreduce.map.memory and mapreduce.reduce.memory can be viewed in Ambari via the Yarn configuration. In Ambari passare a YARN e visualizzare la scheda Configs (Configurazioni). Viene visualizzata la memoria YARN.In Ambari, navigate to YARN and view the Configs tab. The YARN memory will be displayed.

Mapreduce.job.maps / Mapreduce.job.reduces Ciò determinerà il numero massimo di mapper o riduttori da creare.Mapreduce.job.maps / Mapreduce.job.reduces This will determine the maximum number of mappers or reducers to be created. Il numero di suddivisioni determinerà la quantità di mapper creati per il processo MapReduce.The number of splits will determine how many mappers will be created for the MapReduce job. Pertanto, se ci sono meno suddivisioni rispetto ai mapper richiesti, si potrebbero ottenere meno mapper.Therefore, you may get less mappers than you requested if there are less splits than the number of mappers requested.

IndicazioniGuidance

Passaggio 1: determinare il numero di processi in esecuzione. Per impostazione predefinita, MapReduce userà l'intero cluster per il processo.Step 1: Determine number of jobs running - By default, MapReduce will use the entire cluster for your job. È possibile usare solo parte del cluster usando un numero di mapper inferiore a quello dei contenitori disponibili.You can use less of the cluster by using less mappers than there are available containers. Le indicazioni fornite in questo documento presuppongono che l'applicazione sia l'unica in esecuzione nel cluster.The guidance in this document assumes that your application is the only application running on your cluster.

Passaggio 2: impostare mapreduce.map.memory/mapreduce.reduce.memory. Le dimensioni della memoria per le attività di mapping e riduzione dipenderanno dal processo specifico.Step 2: Set mapreduce.map.memory/mapreduce.reduce.memory – The size of the memory for map and reduce tasks will be dependent on your specific job. Se si desidera aumentare la concorrenza, è possibile ridurre le dimensioni della memoria.You can reduce the memory size if you want to increase concurrency. Il numero di attività in esecuzione contemporaneamente dipende dal numero di contenitori.The number of concurrently running tasks depends on the number of containers. Riducendo la quantità di memoria per ogni mapper o riduttore, verranno creati più contenitori, che permetteranno l'esecuzione simultanea di più mapper o riduttori.By decreasing the amount of memory per mapper or reducer, more containers can be created, which enable more mappers or reducers to run concurrently. Riducendo eccessivamente la quantità di memoria, potranno verificarsi degli errori di memoria insufficiente per alcuni procesis.Decreasing the amount of memory too much may cause some processes to run out of memory. Se si verifica un errore di heap durante l'esecuzione del processo, è necessario aumentare la memoria per ogni mapper o riduttore.If you get a heap error when running your job, you should increase the memory per mapper or reducer. Si noti che l'aggiunta di contenitori può comportare un carico extra per ciascuno di questi ultimi, con una potenziale diminuzione delle prestazioni.You should consider that adding more containers will add extra overhead for each additional container, which can potentially degrade performance. In alternativa è possibile ottenere una maggiore quantità di memoria usando un cluster con maggiore memoria oppure aumentando il numero di nodi nel cluster.Another alternative is to get more memory by using a cluster that has higher amounts of memory or increasing the number of nodes in your cluster. Una maggiore quantità di memoria consentirà di usare più contenitori, ottenendo così più concorrenza.More memory will enable more containers to be used, which means more concurrency.

Passaggio 3: determinare la memoria totale di YARN. Per ottimizzare mapreduce.job.maps/mapreduce.job.reduces è necessario tenere presente la quantità di memoria totale di YARN disponibile all'uso.Step 3: Determine Total YARN memory - To tune mapreduce.job.maps/mapreduce.job.reduces, you should consider the amount of total YARN memory available for use. Le informazioni sono disponibili in Ambari.This information is available in Ambari. Passare a YARN e visualizzare la scheda Configs (Configurazioni). La memoria YARN è visualizzata in questa finestra.Navigate to YARN and view the Configs tab. The YARN memory is displayed in this window. Per ottenere la memoria totale di YARN, moltiplicare la memoria di YARN per il numero di nodi nel cluster.You should multiply the YARN memory with the number of nodes in your cluster to get the total YARN memory.

Total YARN memory = nodes * YARN memory per node

Se si usa un cluster vuoto, la memoria può corrispondere alla memoria totale di YARN per il cluster.If you are using an empty cluster, then memory can be the total YARN memory for your cluster. Se altre applicazioni stanno usando memoria, è possibile scegliere di usare solo parte della memoria del cluster, riducendo e portando il numero dei mapper o riduttori al numero di contenitori da usare.If other applications are using memory, then you can choose to only use a portion of your cluster’s memory by reducing the number of mappers or reducers to the number of containers you want to use.

Passaggio 4: calcolare il numero di contenitori YARN. I contenitori YARN indicano la quantità di concorrenza disponibile per il processo.Step 4: Calculate number of YARN containers – YARN containers dictate the amount of concurrency available for the job. Prendere il valore della memoria totale di YARN e dividerlo per mapreduce.map.memory.Take total YARN memory and divide that by mapreduce.map.memory.

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

Passaggio 5: configurare mapreduce.job.maps/mapreduce.job.reduces Configurare mapreduce.job.maps/mapreduce.job.reduces come minimo in base al numero di contenitori disponibili.Step 5: Set mapreduce.job.maps/mapreduce.job.reduces Set mapreduce.job.maps/mapreduce.job.reduces to at least the number of available containers. È possibile sperimentare ulteriormente aumentando il numero di mapper e riduttori e verificare se così facendo si ottengono prestazioni migliori.You can experiment further by increasing the number of mappers and reducers to see if you get better performance. Tenere presente comunque che l'aggiunta di mapper comporterà un carico extra. Un numero eccessivo di mapper potrà causare una diminuzione nelle prestazioni.Keep in mind that more mappers will have additional overhead so having too many mappers may degrade performance.

La pianificazione e l'isolamento della CPU sono disattivate per impostazione predefinita, pertanto il numero di contenitori YARN è limitato dalla memoria.CPU scheduling and CPU isolation are turned off by default so the number of YARN containers is constrained by memory.

Calcolo di esempioExample Calculation

Si supponga di disporre di un cluster costituito da 8 nodi D14 e di voler eseguire un processo con attività di I/O intensive.Let’s say you currently have a cluster composed of 8 D14 nodes and you want to run an I/O intensive job. Di seguito sono riportati i calcoli che è necessario eseguire:Here are the calculations you should do:

Passaggio 1: determinare il numero di processi in esecuzione. Nell'esempio riportato si presuppone che il processo sia l'unico in esecuzione.Step 1: Determine number of jobs running - for our example, we assume that our job is the only one running.

Passaggio 2: configurare mapreduce.map.memory/mapreduce.reduce.memory. Nell'esempio riportato si esegue un processo con attività di I/O intensive e si decide che sono sufficienti 3 GB di memoria per le attività di mapping.Step 2: Set mapreduce.map.memory/mapreduce.reduce.memory – for our example, you are running an I/O intensive job and decide that 3GB of memory for map tasks will be sufficient.

mapreduce.map.memory = 3GB

Passaggio 3: determinare la memoria totale di YARNStep 3: Determine Total YARN memory

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

Passaggio 4: calcolare il numero dei contenitori YARNStep 4: Calculate # of YARN containers

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

Passaggio 5: configurare mapreduce.job.maps/mapreduce.job.reducesStep 5: Set mapreduce.job.maps/mapreduce.job.reduces

mapreduce.map.jobs = 256

LimitazioniLimitations

Limitazione di Azure Data Lake StoreADLS throttling

In quanto servizio multi-tenant, ADLS imposta dei limiti di larghezza di banda a livello di account.As a multi-tenant service, ADLS sets account level bandwidth limits. Se si raggiungono tali limiti, si inizieranno a riscontrare esiti negativi nelle attività.If you hit these limits, you will start to see task failures. Ciò può essere constatato verificando la presenza di errori di limitazione nei log delle attività.This can be identified by observing throttling errors in task logs. Se occorre ulteriore larghezza di banda per il processo, contattare Microsoft.If you need more bandwidth for your job, please contact us.

Per verificare la presenza di limitazioni, è necessario abilitare la registrazione di debug sul lato client.To check if you are getting throttled, you need to enable the debug logging on the client side. Di seguito viene indicato come procedere:Here’s how you can do that:

  1. Inserire la seguente proprietà nelle proprietà log4j in Ambari > YARN > Config (Configurazione) > Advanced yarn log4j (YARN log4j avanzate): log4j.logger.com.microsoft.azure.datalake.store=DEBUGPut the following property in the log4j properties in Ambari > YARN > Config > Advanced yarn-log4j: log4j.logger.com.microsoft.azure.datalake.store=DEBUG

  2. Riavviare tutti i nodi o servizi per rendere effettiva la nuova configurazione.Restart all the nodes/service for the config to take effect.

  3. In caso di limitazioni, verrà visualizzato il codice di errore HTTP 429 nel file di log di YARN.If you are getting throttled, you’ll see the HTTP 429 error code in the YARN log file. Il file di log di YARN si trova nel percorso /tmp/<user>/yarn.logThe YARN log file is in /tmp/<user>/yarn.log

Esempi di esecuzioneExamples to Run

Per illustrare la modalità di esecuzione di MapReduce su Azure Data Lake Store, di seguito viene riportato un codice di esempio eseguito in un cluster con le seguenti impostazioni:To demonstrate how MapReduce runs on Azure Data Lake Store, below is some sample code that was run on a cluster with the following settings:

  • D14v2 a 16 nodi16 node D14v2
  • Cluster Hadoop con HDI 3.6 in esecuzioneHadoop cluster running HDI 3.6

Per iniziare, ecco alcuni comandi di esempio per eseguire MapReduce Teragen, Terasort e Teravalidate.For a starting point, here are some example commands to run MapReduce Teragen, Terasort, and Teravalidate. È possibile modificare questi comandi in base alle risorse.You can adjust these commands based on your resources.

TeragenTeragen

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

TerasortTerasort

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

TeravalidateTeravalidate

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