Apache Hive-query's in Azure HDInsight optimaliseren

In dit artikel worden enkele van de meest voorkomende prestatieoptimalisaties beschreven die u kunt gebruiken om de prestaties van uw Apache Hive-query's te verbeteren.

Selectie van clustertype

In Azure HDInsight kunt u Apache Hive-query's uitvoeren op een aantal verschillende clustertypen.

Kies het juiste clustertype om de prestaties voor uw workloadbehoeften te optimaliseren:

  • Kies het clustertype Interactive Query om te optimaliseren voor ad hocinteractieve query's.
  • Kies een Apache Hadoop-clustertype om te optimaliseren voor Hive-query's die worden gebruikt als batchproces.
  • Spark - en HBase-clustertypen kunnen ook Hive-query's uitvoeren en zijn mogelijk geschikt als u deze workloads uitvoert.

Zie Wat is Apache Hive en HiveQL in Azure HDInsight voor meer informatie over het uitvoeren van Hive-query's op verschillende HDInsight-clustertypen.

Werkknooppunten uitschalen

Door het aantal werkknooppunten in een HDInsight-cluster te verhogen, kan het werk meer mappers en reducers parallel gebruiken. Er zijn twee manieren om de schaal in HDInsight te vergroten:

  • Wanneer u een cluster maakt, kunt u het aantal werkknooppunten opgeven met behulp van Azure Portal, Azure PowerShell of opdrachtregelinterface. Zie HDInsight-clusters maken voor meer informatie. In de volgende schermopname ziet u de configuratie van het werkknooppunt in Azure Portal:

    Azure portal cluster size nodes.

  • Na het maken kunt u ook het aantal werkknooppunten bewerken om een cluster verder uit te schalen zonder er een opnieuw te maken:

    Azure portal scale cluster size.

Zie HDInsight-clusters schalen voor meer informatie over het schalen van HDInsight

Apache Tez gebruiken in plaats van Map Reduce

Apache Tez is een alternatieve uitvoeringsengine voor de MapReduce-engine. HdInsight-clusters op basis van Linux hebben standaard Tez ingeschakeld.

HDInsight Apache Tez overview diagram.

Tez is sneller omdat:

  • Voer Directed Acyclic Graph (DAG) uit als één taak in de MapReduce-engine. Voor de DAG moet elke set mappers worden gevolgd door één set reducers. Dit vereiste zorgt ervoor dat meerdere MapReduce-taken worden uitgeschakeld voor elke Hive-query. Tez heeft niet deze beperking en kan complexe DAG verwerken als één taak die de opstartoverhead van de taak minimaliseert.
  • Vermijd onnodige schrijfbewerkingen. Meerdere taken worden gebruikt om dezelfde Hive-query te verwerken in de MapReduce-engine. De uitvoer van elke MapReduce-taak wordt naar HDFS geschreven voor tussenliggende gegevens. Omdat Tez het aantal taken voor elke Hive-query minimaliseert, kan het onnodige schrijfbewerkingen voorkomen.
  • Minimaliseert opstartvertragingen. Tez is beter in staat om de opstartvertraging te minimaliseren door het aantal mappers te verminderen dat nodig is om te starten en ook de algemene optimalisatie te verbeteren.
  • Containers worden opnieuw gebruikt. Indien mogelijk hergebruikt Tez containers om ervoor te zorgen dat de latentie van het starten van containers wordt verminderd.
  • Technieken voor voortdurende optimalisatie. Traditioneel werd optimalisatie uitgevoerd tijdens de compilatiefase. Er is echter meer informatie over de invoer beschikbaar die een betere optimalisatie mogelijk maakt tijdens runtime. Tez maakt gebruik van continue optimalisatietechnieken waarmee het plan verder kan worden geoptimaliseerd in de runtimefase.

Zie Apache TEZ voor meer informatie over deze concepten.

U kunt elke Hive-query ingeschakeld maken door de query vooraf te laten gaan met de volgende setopdracht:

set hive.execution.engine=tez;

Hive-partitionering

I/O-bewerkingen zijn het belangrijkste knelpunt voor prestaties voor het uitvoeren van Hive-query's. De prestaties kunnen worden verbeterd als de hoeveelheid gegevens die moet worden gelezen, kan worden verminderd. Hive-query's scannen standaard hele Hive-tabellen. Voor query's die alleen een kleine hoeveelheid gegevens hoeven te scannen (bijvoorbeeld query's met filteren), leidt dit gedrag tot onnodige overhead. Met Hive-partitionering hebben Hive-query's alleen toegang tot de benodigde hoeveelheid gegevens in Hive-tabellen.

Hive-partitionering wordt geïmplementeerd door de onbewerkte gegevens opnieuw in nieuwe mappen te organiseren. Elke partitie heeft een eigen bestandsmap. De gebruiker definieert de partitionering. In het volgende diagram ziet u hoe u een Hive-tabel partitioneert op basis van de kolom Year. Er wordt voor elk jaar een nieuwe map gemaakt.

HDInsight Apache Hive partitioning.

Enkele overwegingen voor partitionering:

  • Niet onder partitie: partitioneren op kolommen met slechts een paar waarden kan enkele partities veroorzaken. Partitionering op geslacht maakt bijvoorbeeld slechts twee partities die moeten worden gemaakt (mannelijk en vrouwelijk), dus verminder de latentie met een maximum van de helft.
  • Niet te veel partities gebruiken: bij het maken van een partitie in een kolom met een unieke waarde (bijvoorbeeld userid) worden meerdere partities veroorzaakt. Over partitie veroorzaakt veel stress op het clusternaamknooppunt, omdat deze het grote aantal mappen moet afhandelen.
  • Vermijd scheeftrekken van gegevens: kies uw partitioneringssleutel verstandig, zodat alle partities even groot zijn. Partitionering op de kolom Status kan bijvoorbeeld de verdeling van gegevens scheeftrekken. Aangezien de staat Californië bijna 30x die van Vermont heeft, is de partitiegrootte mogelijk scheef en kunnen de prestaties enorm variëren.

Gebruik de component Partitioned By om een partitietabel te maken:

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;

Zodra de gepartitioneerde tabel is gemaakt, kunt u statische partitionering of dynamische partitionering maken.

  • Statische partitionering betekent dat u al gegevens in de juiste mappen hebt geshard. Met statische partities voegt u Handmatig Hive-partities toe op basis van de maplocatie. Het volgende codefragment is een voorbeeld.

    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/'
    
  • Dynamische partitionering betekent dat u wilt dat Hive automatisch partities voor u maakt. Omdat u de partitioneringstabel al hebt gemaakt vanuit de faseringstabel, hoeft u alleen maar gegevens in te voegen aan de gepartitioneerde tabel:

    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;
    

Zie Gepartitioneerde tabellen voor meer informatie.

De ORCFile-indeling gebruiken

Hive ondersteunt verschillende bestandsindelingen. Voorbeeld:

  • Tekst: de standaardbestandsindeling en werkt met de meeste scenario's.
  • Avro: werkt goed voor interoperabiliteitsscenario's.
  • ORC/Parquet: het meest geschikt voor prestaties.

ORC-indeling (geoptimaliseerde rijkolommen) is een zeer efficiënte manier om Hive-gegevens op te slaan. In vergelijking met andere indelingen heeft ORC de volgende voordelen:

  • ondersteuning voor complexe typen, waaronder DateTime en complexe en semi-gestructureerde typen.
  • tot 70% compressie.
  • indexeert elke 10.000 rijen, waardoor rijen kunnen worden overgeslagen.
  • een aanzienlijke daling van runtime-uitvoering.

Als u ORC-indeling wilt inschakelen, maakt u eerst een tabel met de component 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;

Vervolgens voegt u gegevens in de ORC-tabel in vanuit de faseringstabel. Voorbeeld:

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;

Meer informatie over de ORC-indeling vindt u in de handleiding voor Apache Hive Language.

Vectorisatie

Met vectorisatie kan Hive een batch van 1024 rijen tegelijk verwerken in plaats van één rij tegelijk te verwerken. Dit betekent dat eenvoudige bewerkingen sneller worden uitgevoerd omdat er minder interne code moet worden uitgevoerd.

Als u vectorisatievoorvoegsel voor uw Hive-query wilt inschakelen met de volgende instelling:

set hive.vectorized.execution.enabled = true;

Zie De uitvoering van vectorized query's voor meer informatie.

Andere optimalisatiemethoden

Er zijn meer optimalisatiemethoden die u kunt overwegen, bijvoorbeeld:

  • Hive-bucketing: een techniek waarmee grote gegevenssets kunnen worden geclusterd of gesegmenteer om de queryprestaties te optimaliseren.
  • Joinoptimalisatie: optimalisatie van de planning voor queryuitvoering van Hive om de efficiëntie van joins te verbeteren en de behoefte aan hints voor gebruikers te verminderen. Zie Join optimization voor meer informatie.
  • Reducers verhogen.

Volgende stappen

In dit artikel hebt u verschillende algemene methoden voor het optimaliseren van Hive-query's geleerd. Zie de volgende artikelen voor meer informatie: