Linee guida per l'ottimizzazione delle prestazioni di MapReduce in HDInsight e Azure Data Lake Storage Gen1
Prerequisiti
- Una sottoscrizione di Azure. Vedere Ottenere una versione di prova gratuita di Azure.
- Un account Azure Data Lake Storage Gen1. Per istruzioni su come crearne una, vedere Introduzione a Azure Data Lake Storage Gen1
- Cluster HDInsight di Azure con accesso a un account Data Lake Storage Gen1. Vedere Creare un cluster HDInsight con Data Lake Storage Gen1. Assicurarsi di abilitare il Desktop remoto per il cluster.
- Uso di MapReduce in HDInsight. Per ulteriori informazioni, vedere Usare MapReduce in Hadoop su HDInsight
- Esaminare le linee guida per l'ottimizzazione delle prestazioni per Data Lake Storage Gen1. Per i concetti generali sulle prestazioni, vedere linee guida per l'ottimizzazione delle prestazioni di Data Lake Storage Gen1
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:
Inserire la proprietà seguente nelle proprietà log4j in Ambari > YARN > Config > Advanced yarn-log4j: log4j.logger.com.microsoft.azure.datalake.store=DEBUG
Riavviare tutti i nodi o servizi per rendere effettiva la nuova configurazione.
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