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

Le impostazioni predefinite sono state impostate per fornire buone prestazioni per molti casi d'uso diversi.The default settings have been set to provide good performance across many different use cases. Per le query con attività di I/O intensive, è possibile regolare Hive per ottenere prestazioni migliori con ADLS.For I/O intensive queries, Hive can be tuned to get better performance with ADLS.

PrerequisitiPrerequisites

parametersParameters

Di seguito vengono elencate le impostazioni più importanti da regolare per ottenere prestazioni migliori in ADLS:Here are the most important settings to tune for improved ADLS performance:

  • hive.tez.container.size: la quantità di memoria usata da ciascuna attivitàhive.tez.container.size – the amount of memory used by each tasks

  • tez.grouping.min-size: la dimensione minima di ciascun mappertez.grouping.min-size – minimum size of each mapper

  • tez.grouping.max-size: la dimensione massima di ciascun mappertez.grouping.max-size – maximum size of each mapper

  • hive.exec.reducer.bytes.per.reducer: la dimensione di ciascun riduttorehive.exec.reducer.bytes.per.reducer – size of each reducer

hive.tez.container.size: la dimensione del contenitore determina la quantità di memoria disponibile per ciascuna attività.hive.tez.container.size - The container size determines how much memory is available for each task. Questo è l'input principale per il controllo di concorrenza in Hive.This is the main input for controlling the concurrency in Hive.

tez.grouping.min-size: questo parametro consente di impostare la dimensione minima di ciascun mapper.tez.grouping.min-size – This parameter allows you to set the minimum size of each mapper. Se il numero di mapper scelti da Tez è inferiore al valore di questo parametro, Tez userà il valore impostato qui.If the number of mappers that Tez chooses is smaller than the value of this parameter, then Tez will use the value set here.

tez.grouping.max-size: questo parametro consente di impostare la dimensione massima di ciascun mapper.tez.grouping.max-size – The parameter allows you to set the maximum size of each mapper. Se il numero di mapper scelti da Tez è superiore al valore di questo parametro, Tez userà il valore impostato qui.If the number of mappers that Tez chooses is larger than the value of this parameter, then Tez will use the value set here.

hive.exec.reducer.bytes.per.reducer: questo parametro consente di impostare la dimensione di ciascun riduttore.hive.exec.reducer.bytes.per.reducer – This parameter sets the size of each reducer. Per impostazione predefinita, ogni riduttore ha una dimensione di 256 MB.By default, each reducer is 256MB.

IndicazioniGuidance

Set hive.exec.reducer.bytes.per.reducer: il valore predefinito funziona bene quando i dati non sono compressi.Set hive.exec.reducer.bytes.per.reducer – The default value works well when the data is uncompressed. In caso di dati compressi, è consigliabile ridurre la dimensione del riduttore.For data that is compressed, you should reduce the size of the reducer.

Set hive.tez.container.size: in ciascun nodo, la memoria viene specificata da yarn.nodemanager.resource.memory-mb e dovrebbe essere impostata correttamente nel cluster HDI per impostazione predefinita.Set hive.tez.container.size – In each node, memory is specified by yarn.nodemanager.resource.memory-mb and should be correctly set on HDI cluster by default. Per altre informazioni sull'impostazione della memoria appropriata in YARN, vedere questo post.For additional information on setting the appropriate memory in YARN, see this post.

I carichi di lavoro con numerose operazioni di I/O possono trarre vantaggi da un maggiore parallelismo riducendo la dimensione del contenitore Tez.I/O intensive workloads can benefit from more parallelism by decreasing the Tez container size. In questo modo l'utente dispone di più contenitori e, quindi, di più concorrenza.This gives the user more containers which increases concurrency. Tuttavia, alcune query di Hive richiedono una notevole quantità di memoria (ad esempio MapJoin).However, some Hive queries require a significant amount of memory (e.g. MapJoin). Se l'attività non dispone di sufficiente memoria, si otterrà un'eccezione di memoria insufficiente durante la fase di runtime.If the task does not have enough memory, you will get an out of memory exception during runtime. Se si ricevono eccezioni di memoria insufficiente, è necessario aumentare la memoria.If you receive out of memory exceptions, then you should increase the memory.

Il numero di attività simultanee in esecuzione o il parallelismo verrà ristretto dalla memoria totale di YARN.The concurrent number of tasks running or parallelism will be bounded by the total YARN memory. Il numero di contenitori YARN determinerà il numero di attività che è possibile eseguire contemporaneamente.The number of YARN containers will dictate how many concurrent tasks can run. Per trovare la memoria YARN per ogni nodo è possibile passare ad Ambari.To find the YARN memory per node, you can go to 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.

    Total YARN memory = nodes * YARN memory per node
    # of YARN containers = Total YARN memory / Tez container size

La chiave per migliorare le prestazioni usando ADLS consiste nell'aumentare il più possibile la concorrenza.The key to improving performance using ADLS is to increase the concurrency as much as possible. Tez calcola automaticamente il numero di attività da creare, in modo che non debba essere impostato manualmente.Tez automatically calculates the number of tasks that should be created so you do not need to set it.

Calcolo di esempioExample Calculation

Si supponga di disporre di un cluster D14 a 8 nodi.Let’s say you have an 8 node D14 cluster.

Total YARN memory = nodes * YARN memory per node
Total YARN memory = 8 nodes * 96GB = 768GB
# of YARN containers = 768GB / 3072MB = 256

LimitazioniLimitations

Limitazione ADLSADLS throttling

Se si raggiungono i limiti di larghezza di banda di ADLS, le attività inizieranno ad avere esiti negativi.UIf you hit the limits of bandwidth provided by ADLS, you would start to see task failures. Ciò può essere constatato verificando la presenza di errori di limitazione nei log delle attività.This could be identified by observing throttling errors in task logs. È possibile ridurre il parallelismo aumentando la dimensione del contenitore Tez.You can decrease the parallelism by increasing Tez container size. Se occorre maggiore concorrenza per il processo, contattare Microsoft.If you need more concurrency 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 nella configurazione di Hive. Questa operazione può essere eseguita dalla vista Ambari: log4j.logger.com.microsoft.azure.datalake.store=DEBUG Riavviare tutti i nodi/service per rendere effettiva la nuova configurazione.Put the following property in the log4j properties in Hive config. This can be done from Ambari view: log4j.logger.com.microsoft.azure.datalake.store=DEBUG Restart all the nodes/service for the config to take effect.

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

Ulteriori informazioni sull'ottimizzazione di HiveFurther information on Hive tuning

Ecco alcuni articoli di blog che consentiranno di ottimizzare le query di Hive:Here are a few blogs that will help tune your Hive queries: