Linee guida per l'ottimizzazione delle prestazioni di MapReduce in HDInsight e Azure Data Lake Storage Gen1

Prerequisiti

Parametri

Vengono ora illustrati i parametri più importanti da configurare per aumentare le prestazioni in Data Lake Storage Gen1 durante l'esecuzione di processi MapReduce:

Parametro Descrizione
Mapreduce.map.memory.mb Quantità di memoria da allocare a ogni mapper.
Mapreduce.job.maps Numero di attività di mapping per processo.
Mapreduce.reduce.memory.mb Quantità di memoria da allocare a ogni riduttore.
Mapreduce.job.reduces Numero di attività di riduzione per processo.

Mapreduce.map.memory/ Mapreduce.reduce.memory

Modificare questo numero in base alla quantità di memoria necessaria per l'attività di mapping e/o riduzione. È possibile visualizzare i valori predefiniti di mapreduce.map.memory e mapreduce.reduce.memory in Ambari tramite la configurazione yarn. In Ambari passare a YARN e visualizzare la scheda Configurazioni . Verrà visualizzata la memoria YARN.

Mapreduce.job.maps/Mapreduce.job.reduces

In questo modo viene determinato il numero massimo di mapper o riduttori da creare. Il numero di divisioni determina il numero di mapper creati per il processo MapReduce. Pertanto, è possibile ottenere meno mapper rispetto a quanto richiesto se sono presenti meno divisioni rispetto al numero di mapper richiesti.

Indicazioni

Passaggio 1: Determinare il numero di processi in esecuzione

Per impostazione predefinita, MapReduce userà l'intero cluster per il processo. È possibile usare meno del cluster usando un numero inferiore di mapper rispetto ai contenitori disponibili. Le indicazioni fornite in questo documento presuppongono che l'applicazione sia l'unica in esecuzione nel 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. Se si desidera aumentare la concorrenza, è possibile ridurre le dimensioni della memoria. Il numero di attività in esecuzione contemporaneamente dipende dal numero di contenitori. Riducendo la quantità di memoria per ogni mapper o riduttore, verranno creati più contenitori, che permetteranno l'esecuzione simultanea di più mapper o riduttori. Riducendo eccessivamente la quantità di memoria, potranno verificarsi degli errori di memoria insufficiente per alcuni procesis. Se si verifica un errore dell'heap durante l'esecuzione del processo, aumentare la memoria per mapper o reducer. Si consideri che l'aggiunta di altri contenitori comporta un sovraccarico aggiuntivo per ogni contenitore aggiuntivo, che può potenzialmente compromettere le prestazioni. In alternativa è possibile ottenere una maggiore quantità di memoria usando un cluster con maggiore memoria oppure aumentando il numero di nodi nel cluster. Una maggiore quantità di memoria consentirà di usare più contenitori, ottenendo così più concorrenza.

Passaggio 3: Determinare la memoria totale yarn

Per ottimizzare mapreduce.job.maps/mapreduce.job.reduces, prendere in considerazione la quantità totale di memoria YARN disponibile per l'uso. Le informazioni sono disponibili in Ambari. Passare a YARN e visualizzare la scheda Configurazioni . La memoria YARN viene visualizzata in questa finestra. Moltiplicare la memoria YARN con il numero di nodi nel cluster per ottenere la memoria TOTALE YARN.

Total YARN memory = nodes * YARN memory per node

Se si usa un cluster vuoto, la memoria può essere la memoria totale yarn per il 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.

Passaggio 4: Calcolare il numero di contenitori YARN

I contenitori YARN indicano la quantità di concorrenza disponibile per il processo. Prendere il valore della memoria totale di YARN e dividerlo per 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. È possibile sperimentare ulteriormente aumentando il numero di mapper e riduttori e verificare se così facendo si ottengono prestazioni migliori. Tenere presente comunque che l'aggiunta di mapper comporterà un carico extra. Un numero eccessivo di mapper potrà causare una diminuzione nelle prestazioni.

La pianificazione e l'isolamento della CPU sono disattivate per impostazione predefinita, pertanto il numero di contenitori YARN è limitato dalla memoria.

Calcolo di esempio

Si supponga di disporre di un cluster costituito da 8 nodi D14 e di voler eseguire un processo con attività di I/O intensive. Di seguito sono riportati i calcoli che è necessario eseguire:

Passaggio 1: Determinare il numero di processi in esecuzione

Si supponga, ad esempio, che il processo sia l'unico in esecuzione.

Passaggio 2: Impostare mapreduce.map.memory/mapreduce.reduce.memory

Per questo esempio, si esegue un processo a elevato utilizzo di I/O e si decide che 3 GB di memoria per le attività di mapping sono sufficienti.

mapreduce.map.memory = 3GB

Passaggio 3: Determinare la memoria totale yarn

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

Passaggio 4: calcolare il numero dei contenitori YARN

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

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

mapreduce.map.jobs = 256

Limitazioni

Limitazione della larghezza di banda della rete di Data Lake Storage Gen1

Come servizio multi-tenant, Data Lake Storage Gen1 imposta dei limiti di larghezza di banda a livello di account. Se si raggiungono tali limiti, si inizieranno a riscontrare esiti negativi nelle attività. Ciò può essere constatato verificando la presenza di errori di limitazione nei log delle attività. Se occorre ulteriore larghezza di banda per il processo, contattare Microsoft.

Per verificare la presenza di limitazioni, è necessario abilitare la registrazione di debug sul lato client. Di seguito viene indicato come procedere:

  1. Inserire la proprietà seguente nelle proprietà log4j 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.

  3. Se si riceve una limitazione, nel file di log YARN verrà visualizzato il codice di errore HTTP 429. Il file di log di YARN si trova nel percorso /tmp/<user>/yarn.log

Esempi di esecuzione

Per illustrare l'esecuzione di MapReduce in Data Lake Storage Gen1, di seguito è riportato un codice di esempio eseguito in un cluster con le impostazioni seguenti:

  • D14v2 a 16 nodi
  • Cluster Hadoop con HDI 3.6 in esecuzione

Per iniziare, ecco alcuni comandi di esempio per eseguire MapReduce Teragen, Terasort e Teravalidate. È possibile modificare questi comandi in base alle risorse.

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