Ottimizzare le query Hive in Azure HDInsightOptimize Hive queries in Azure HDInsight

Per impostazione predefinita, i cluster Hadoop non sono ottimizzati per le prestazioni.By default, Hadoop clusters are not optimized for performance. Questo articolo descrive alcuni metodi di ottimizzazione delle prestazioni Hive più comuni che è possibile applicare alle query.This article covers some most common Hive performance optimization methods that you can apply to your queries.

Scalabilità orizzontale dei nodi di lavoroScale out worker nodes

Aumentando il numero di nodi di lavoro in un cluster è possibile usare più mapper e reducer da eseguire in parallelo.Increasing the number of worker nodes in a cluster can leverage more mappers and reducers to be run in parallel. Esistono due modi per aumentare la scalabilità orizzontale in HDInsight:There are two ways you can increase scale out in HDInsight:

  • In fase di provisioning è possibile specificare il numero di nodi di lavoro usando il portale di Azure, Azure PowerShell o l'interfaccia della riga di comando multipiattaforma.At the provision time, you can specify the number of worker nodes using the Azure portal, Azure PowerShell, or Cross-platform command-line interface. Per altre informazioni, vedere Creare cluster Hadoop in HDInsight.For more information, see Create HDInsight clusters. La schermata seguente mostra la configurazione dei nodi del ruolo di lavoro nel portale di Azure:The following screenshot shows the worker node configuration on the Azure portal:

    scaleout_1

  • In fase di esecuzione è anche possibile scalare orizzontalmente un cluster senza ricreare uno:At the run time, you can also scale out a cluster without recreating one:

    scaleout_1

Per altre informazioni sulle diverse macchine virtuali supportate da HDInsight, vedere Prezzi di HDInsight.For more information about the different virtual machines supported by HDInsight, see HDInsight pricing.

Abilitare TezEnable Tez

Apache Tez è un motore di esecuzione alternativo al motore di MapReduce:Apache Tez is an alternative execution engine to the MapReduce engine:

tez_1

Tez è più veloce perché:Tez is faster because:

  • Esegue un grafo aciclico diretto (DAG) come un singolo processo nel motore di MapReduce.Execute Directed Acyclic Graph (DAG) as a single job in the MapReduce engine. Il DAG richiede che ogni set di mapper sia seguito da un set di reducer.The DAG requires each set of mappers to be followed by one set of reducers. In questo modo, più processi MapReduce vengono eseguiti per ciascuna query Hive.This causes multiple MapReduce jobs to be spun off for each Hive query. Tez non presenta questo vincolo e può elaborare DAG complessi con un unico processo, riducendo così il sovraccarico di avvio del processo.Tez does not have such constraint and can process complex DAG as one job thus minimizing job startup overhead.
  • Evita scritture non necessarie.Avoids unnecessary writes. Poiché più processi vengono eseguiti per la stessa query Hive nel motore di MapReduce, l'output di ogni processo viene scritto in HDFS per dati intermedi.Due to multiple jobs being spun for the same Hive query in the MapReduce engine, the output of each job is written to HDFS for intermediate data. Poiché Tez riduce il numero di processi per ciascuna query Hive è in grado di evitare scritture non necessarie.Since Tez minimizes number of jobs for each Hive query it is able to avoid unnecessary write.
  • Riduce al minimo i ritardi di avvio.Minimizes start-up delays. Tez è in grado di ridurre al minimo il ritardo di avvio limitando il numero di mapper da avviare e migliorando anche l'ottimizzazione complessiva.Tez is better able to minimize start-up delay by reducing the number of mappers it needs to start and also improving optimization throughout.
  • Riusa i contenitori.Reuses containers. Quando possibile, Tez è in grado di riusare i contenitori per assicurare che la latenza dovuta all'avvio dei contenitori venga ridotta.Whenever possible Tez is able to reuse containers to ensure that latency due to starting up containers is reduced.
  • Usa tecniche di ottimizzazione continua.Continuous optimization techniques. In genere l'ottimizzazione viene eseguita durante la fase di compilazione.Traditionally optimization was done during compilation phase. Tuttavia, sono disponibili ulteriori informazioni sugli input che consentono una migliore ottimizzazione durante il runtime.However more information about the inputs is available that allow for better optimization during runtime. Tez usa tecniche di ottimizzazione continua che consentono di ottimizzare ulteriormente il piano nella fase di runtime.Tez uses continuous optimization techniques that allow it to optimize the plan further into the runtime phase.

Per altre informazioni su questi concetti, vedere Apache TEZ.For more information on these concepts, see Apache TEZ.

È possibile eseguire qualsiasi query Hive a cui Tez è abilitato anteponendovi l'impostazione seguente:You can make any Hive query Tez enabled by prefixing the query with the setting below:

set hive.execution.engine=tez;

I cluster HDInsight basati su Linux hanno Tez abilitato per impostazione predefinita.Linux-based HDInsight clusters have Tez enabled by default.

Partizionamento HiveHive partitioning

L'operazione di I/O rappresenta il principale collo di bottiglia delle prestazioni per l'esecuzione di query Hive.I/O operation is the major performance bottleneck for running Hive queries. Le prestazioni possono essere migliorate se è possibile ridurre la quantità di dati da leggere.The performance can be improved if the amount of data that needs to be read can be reduced. Per impostazione predefinita, le query Hive analizzano intere tabelle Hive.By default, Hive queries scan entire Hive tables. Questa operazione è utile per query come le analisi di tabella,This is great for queries like table scans. ma per le query che devono analizzare solo una piccola quantità di dati, ad esempio le query con filtro, viene creato un sovraccarico non necessario.However for queries that only need to scan a small amount of data (for example, queries with filtering), this behavior creates unnecessary overhead. Il partizionamento Hive consente alle query Hive di accedere solo alla quantità di dati presente nelle tabelle Hive necessaria.Hive partitioning allows Hive queries to access only the necessary amount of data in Hive tables.

Il partizionamento Hive viene implementato riorganizzando i dati non elaborati in nuove directory in cui ciascuna partizione dispone di una propria directory, dove la partizione è definita dall'utente.Hive partitioning is implemented by reorganizing the raw data into new directories with each partition having its own directory - where the partition is defined by the user. Il diagramma seguente illustra il partizionamento di una tabella Hive mediante la colonna Anno.The following diagram illustrates partitioning a Hive table by the column Year. Viene creata una nuova directory per ogni anno.A new directory is created for each year.

partizionamento

Alcune considerazioni sul partizionamento:Some partitioning considerations:

  • Non creare un numero eccessivamente ridotto di partizioni: il partizionamento in colonne con pochi valori può causare un numero ridotto di partizioni.Do not under partition - Partitioning on columns with only a few values can cause few partitions. Il partizionamento in base al sesso, ad esempio, crea solo due partizioni (maschio e femmina) e riduce quindi la latenza al massimo solo della metà.For example, partitioning on gender only creates two partitions to be created (male and female), thus only reduce the latency by a maximum of half.
  • Non creare un numero eccessivo di partizioni: al contrario, la creazione di una partizione in una colonna con un valore univoco (ad esempio ID utente) causa più partizioniDo not over partition - On the other extreme, creating a partition on a column with a unique value (for example, userid) causes multiple partitions. generando un sovraccarico nel nodo dei nomi del cluster, che dovrà gestire una grande quantità di directory.Over partition causes much stress on the cluster namenode as it has to handle the large number of directories.
  • Evitare lo sfasamento di dati : scegliere la chiave di partizionamento con attenzione, in modo che tutte le partizioni siano di dimensioni pari.Avoid data skew - Choose your partitioning key wisely so that all partitions are even size. Ad esempio, con il partizionamento in Stato , il numero di record in California potrebbe essere quasi 30 volte quello del Vermont, a causa della differenza di popolazione.An example is partitioning on State may cause the number of records under California to be almost 30x that of Vermont due to the difference in population.

Per creare una tabella di partizione, usare la clausola Partizionato da :To create a partition table, use the Partitioned By clause:

CREATE TABLE lineitem_part
    (L_ORDERKEY INT, L_PARTKEY INT, L_SUPPKEY INT,L_LINENUMBER INT,
     L_QUANTITY DOUBLE, L_EXTENDEDPRICE DOUBLE, L_DISCOUNT DOUBLE,
     L_TAX DOUBLE, L_RETURNFLAG STRING, L_LINESTATUS STRING,
     L_SHIPDATE_PS STRING, L_COMMITDATE STRING, L_RECEIPTDATE            STRING, L_SHIPINSTRUCT STRING, L_SHIPMODE STRING,
     L_COMMENT STRING)
PARTITIONED BY(L_SHIPDATE STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;

Una volta creata la tabella partizionata, è possibile creare il partizionamento statico o il partizionamento dinamico.Once the partitioned table is created, you can either create static partitioning or dynamic partitioning.

  • Partizionamento statico indica che i dati sono già stati partizionati nelle directory appropriate ed è possibile richiedere le partizioni Hive manualmente, in base al percorso di directory.Static partitioning means that you have already sharded data in the appropriate directories and you can ask Hive partitions manually based on the directory location. Il frammento di codice seguente rappresenta un esempio.The following code snippet is an example.

      INSERT OVERWRITE TABLE lineitem_part
      PARTITION (L_SHIPDATE = ‘5/23/1996 12:00:00 AM’)
      SELECT * FROM lineitem 
      WHERE lineitem.L_SHIPDATE = ‘5/23/1996 12:00:00 AM’
    
      ALTER TABLE lineitem_part ADD PARTITION (L_SHIPDATE = ‘5/23/1996 12:00:00 AM’))
      LOCATION ‘wasb://sampledata@ignitedemo.blob.core.windows.net/partitions/5_23_1996/'
    
  • Partizionamento dinamico indica che si desidera che Hive crei le partizioni automaticamente per l'utente.Dynamic partitioning means that you want Hive to create partitions automatically for you. Poiché la tabella di partizionamento è già stata creata dalla tabella di gestione temporanea, è sufficiente inserire i dati nella tabella partizionata.Since we have already created the partitioning table from the staging table, all we need to do is insert data to the partitioned table:

      SET hive.exec.dynamic.partition = true;
      SET hive.exec.dynamic.partition.mode = nonstrict;
      INSERT INTO TABLE lineitem_part
      PARTITION (L_SHIPDATE)
      SELECT L_ORDERKEY as L_ORDERKEY, L_PARTKEY as L_PARTKEY , 
           L_SUPPKEY as L_SUPPKEY, L_LINENUMBER as L_LINENUMBER,
            L_QUANTITY as L_QUANTITY, L_EXTENDEDPRICE as L_EXTENDEDPRICE,
           L_DISCOUNT as L_DISCOUNT, L_TAX as L_TAX, L_RETURNFLAG as           L_RETURNFLAG, L_LINESTATUS as L_LINESTATUS, L_SHIPDATE as           L_SHIPDATE_PS, L_COMMITDATE as L_COMMITDATE, L_RECEIPTDATE as      L_RECEIPTDATE, L_SHIPINSTRUCT as L_SHIPINSTRUCT, L_SHIPMODE as      L_SHIPMODE, L_COMMENT as L_COMMENT, L_SHIPDATE as L_SHIPDATE FROM lineitem;
    

Per altre informazioni, vedere Partitioned Tables (Tabelle partizionate).For more information, see Partitioned Tables.

Utilizzare il formato ORCFileUse the ORCFile format

Hive supporta diversi formati di file.Hive supports different file formats. Ad esempio:For example:

  • Testo: questo è il formato di file predefinito e funziona con la maggior parte degli scenariText: this is the default file format and works with most scenarios
  • Avro: funziona bene per scenari di interoperabilitàAvro: works well for interoperability scenarios
  • ORC/Parquet: particolarmente indicato per le prestazioniORC/Parquet: best suited for performance

Il formato ORC (Optimized Row Columnar) è un modo particolarmente efficace per archiviare i dati Hive.ORC (Optimized Row Columnar) format is a highly efficient way to store Hive data. Rispetto ad altri formati, ORC offre i vantaggi seguenti:Compared to other formats, ORC has the following advantages:

  • supporto per tipi complessi, inclusi i tipi complessi e semistrutturati e DateTimesupport for complex types including DateTime and complex and semi-structured types
  • fino al 70% di compressioneup to 70% compression
  • indici ogni 10.000 righe, che consentono di ignorare le righeindexes every 10,000 rows, which allow skipping rows
  • significativa riduzione in fase di esecuzionea significant drop in run-time execution

Per abilitare il formato ORC, creare innanzitutto una tabella con la clausola Archiviato come ORC:To enable ORC format, you first create a table with the clause Stored as ORC:

CREATE TABLE lineitem_orc_part
    (L_ORDERKEY INT, L_PARTKEY INT,L_SUPPKEY INT, L_LINENUMBER INT,
     L_QUANTITY DOUBLE, L_EXTENDEDPRICE DOUBLE, L_DISCOUNT DOUBLE,
     L_TAX DOUBLE, L_RETURNFLAG STRING, L_LINESTATUS STRING,
     L_SHIPDATE_PS STRING, L_COMMITDATE STRING, L_RECEIPTDATE STRING,
     L_SHIPINSTRUCT STRING, L_SHIPMODE STRING, L_COMMENT      STRING)
PARTITIONED BY(L_SHIPDATE STRING)
STORED AS ORC;

Inserire quindi i dati nella tabella ORC dalla tabella di gestione temporanea.Next, you insert data to the ORC table from the staging table. Ad esempio:For example:

INSERT INTO TABLE lineitem_orc
SELECT L_ORDERKEY as L_ORDERKEY, 
       L_PARTKEY as L_PARTKEY , 
       L_SUPPKEY as L_SUPPKEY,
       L_LINENUMBER as L_LINENUMBER,
        L_QUANTITY as L_QUANTITY, 
       L_EXTENDEDPRICE as L_EXTENDEDPRICE,
       L_DISCOUNT as L_DISCOUNT,
       L_TAX as L_TAX,
       L_RETURNFLAG as L_RETURNFLAG,
       L_LINESTATUS as L_LINESTATUS,
       L_SHIPDATE as L_SHIPDATE,
       L_COMMITDATE as L_COMMITDATE,
       L_RECEIPTDATE as L_RECEIPTDATE, 
       L_SHIPINSTRUCT as L_SHIPINSTRUCT,
       L_SHIPMODE as L_SHIPMODE,
       L_COMMENT as L_COMMENT
FROM lineitem;

Ulteriori informazioni sul formato ORC sono disponibili qui.You can read more on the ORC format here.

VettorizzazioneVectorization

La vettorizzazione consente ad Hive di elaborare un batch di 1024 righe insieme invece di elaborare una riga alla volta.Vectorization allows Hive to process a batch of 1024 rows together instead of processing one row at a time. Ciò significa che le operazioni semplici vengono eseguite più rapidamente poiché è necessario eseguire una quantità inferiore di codice interno.It means that simple operations are done faster because less internal code needs to run.

Per abilitare la vettorizzazione, anteporre alla query Hive la seguente impostazione:To enable vectorization prefix your Hive query with the following setting:

set hive.vectorized.execution.enabled = true;

Per altre informazioni, vedere Esecuzione di query vettorizzate.For more information, see Vectorized query execution.

Altri metodi di ottimizzazioneOther optimization methods

Esistono altri metodi di ottimizzazione che è possibile considerare, ad esempio:There are more optimization methods that you can consider, for example:

  • Hive bucket: una tecnica che consente di raggruppare o segmentare grandi set di dati per ottimizzare le prestazioni delle query.Hive bucketing: a technique that allows to cluster or segment large sets of data to optimize query performance.
  • Ottimizzazione join: ottimizzazione dell'esecuzione di query Hive pianificata per migliorare l'efficienza di join e ridurre la necessità di suggerimenti dell'utente.Join optimization: optimization of Hive's query execution planning to improve the efficiency of joins and reduce the need for user hints. Per altre informazioni, vedere Ottimizzazione join.For more information, see Join optimization.
  • Aumento dei reducer.Increase Reducers.

Passaggi successiviNext steps

In questo articolo sono stati illustrati vari metodi di ottimizzazione delle query comuni di Hive.In this article, you have learned several common Hive query optimization methods. Per altre informazioni, vedere gli articoli seguenti:To learn more, see the following articles: