Apache Hive-lekérdezések optimalizálása az Azure HDInsightban

Ez a cikk az Apache Hive-lekérdezések teljesítményének javítására használható leggyakoribb teljesítményoptimalizálásokat ismerteti.

Fürttípus kiválasztása

Az Azure HDInsightban Apache Hive-lekérdezéseket futtathat néhány különböző fürttípuson.

Válassza ki a megfelelő fürttípust a számítási feladatok teljesítményének optimalizálásához:

  • Az interaktív lekérdezésekhez optimalizálandó ad hocinteraktív lekérdezésfürttípus kiválasztása.
  • Válassza az Apache Hadoop-fürttípust a kötegelt folyamatként használt Hive-lekérdezésekhez való optimalizáláshoz.
  • A Spark - és HBase-fürttípusok Hive-lekérdezéseket is futtathatnak, és megfelelőek lehetnek, ha ezeket a számítási feladatokat futtatja.

További információ a Hive-lekérdezések különböző HDInsight-fürttípusokon való futtatásáról: Mi az Az Apache Hive és a HiveQL az Azure HDInsighton?

Feldolgozó csomópontok vertikális felskálázása

A HDInsight-fürtök feldolgozó csomópontjainak számának növelése lehetővé teszi, hogy a munka több leképezőt és redukálót használjon párhuzamosan. A HDInsightban kétféleképpen növelheti a skálázást:

  • Fürt létrehozásakor megadhatja a feldolgozó csomópontok számát az Azure Portal, az Azure PowerShell vagy a parancssori felület használatával. További információ: HDInsight-fürtök létrehozása. Az alábbi képernyőképen a feldolgozó csomópont konfigurációja látható az Azure Portalon:

    Azure portal cluster size nodes.

  • A létrehozás után a feldolgozó csomópontok számát is módosíthatja a fürtök további skálázásához anélkül, hogy újra létrehozunk egyet:

    Azure portal scale cluster size.

A HDInsight skálázásával kapcsolatos további információkért lásd: HDInsight-fürtök méretezése

Az Apache Tez használata térképcsökkentés helyett

Az Apache Tez a MapReduce motor alternatív végrehajtó motorja. A Linux-alapú HDInsight fürtökben a Tez alapértelmezés szerint engedélyezve.

HDInsight Apache Tez overview diagram.

Tez gyorsabb, mert:

  • Directed Acyclic Graph (DAG) egyetlen feladatként történő végrehajtása a MapReduce motorban. A DAG megköveteli, hogy a leképezők minden egyes csoportját egy-egy redukáló csoport kövesse. Ez a követelmény azt eredményezi, hogy minden egyes Hive-lekérdezéshez több MapReduce-munkát kell indítani. A Tez nem rendelkezik ilyen korlátozással, és képes az összetett DAG-ot egyetlen feladatként feldolgozni, minimalizálva a feladat indítási terheit.
  • Elkerüli a felesleges írásokat. A MapReduce motorban több feladatot használnak ugyanazon Hive-lekérdezés feldolgozására. Az egyes MapReduce-feladatok kimenete a HDFS-re kerül kiírásra a köztes adatokhoz. Mivel a Tez minimalizálja az egyes Hive-lekérdezésekhez tartozó feladatok számát, elkerülheti a szükségtelen írásokat.
  • Minimalizálja az indítási késedelmeket. A Tez jobban képes minimalizálni az indítási késedelmet azáltal, hogy csökkenti az indításhoz szükséges leképezők számát, és az optimalizálást is végig javítja.
  • Újrahasznosítja a tartályokat. Amikor csak lehetséges, a Tez újrafelhasználja a konténereket, hogy a konténerek indításából adódó késleltetés csökkenjen.
  • Folyamatos optimalizálási technikák. Az optimalizálást hagyományosan a fordítási fázisban végezték. A bemenetekről azonban több információ áll rendelkezésre, amelyek lehetővé teszik a jobb optimalizálást a futás során. A Tez folyamatos optimalizálási technikákat alkalmaz, amelyek lehetővé teszik a terv további optimalizálását a futási fázisban.

További információ ezekről a fogalmakról: Apache TEZ.

Bármely Hive-lekérdezést engedélyezhet a lekérdezés előtagjával a következő beállítási paranccsal:

set hive.execution.engine=tez;

Hive particionálás

Az I/O-műveletek a Hive-lekérdezések futtatásának fő teljesítménybeli szűk keresztmetszetei. A teljesítmény javítható, ha az olvasni kívánt adatok mennyisége csökkenthető. A Hive-lekérdezések alapértelmezés szerint teljes Hive-táblákat vizsgálnak. Az olyan lekérdezések esetében azonban, amelyeknek csak kis mennyiségű adatot kell beolvasni (például szűréssel rendelkező lekérdezéseket), ez a viselkedés szükségtelen többletterhelést okoz. A Hive particionálása lehetővé teszi, hogy a Hive-lekérdezések csak a Szükséges mennyiségű adatot érhessék el a Hive-táblákban.

A Hive particionálás a nyers adatok új könyvtárakba való átrendezésével implementálható. Minden partíciónak saját fájlkönyvtára van. A felhasználó határozza meg a particionálást. Az alábbi ábra egy Hive-tábla Év oszlop szerinti particionálását mutatja be. Minden évben létrejön egy új könyvtár.

HDInsight Apache Hive partitioning.

Néhány particionálási szempont:

  • Nincs partíció alatt – A csak néhány értékkel rendelkező oszlopok particionálása kevés partíciót okozhat. A nem szerinti particionálás például csak két létrehozandó partíciót hoz létre (férfi és nő), így a késést legfeljebb felére csökkentheti.
  • Ne használja a partíciót – A másik szélső esetben egy egyedi értékkel (például userid) rendelkező oszlop partíciójának létrehozása több partíciót okoz. A particionálás túl sok stresszt okoz a fürtnévcsomóponton, mivel nagy számú könyvtárat kell kezelnie.
  • Kerülje az adateltérést – Válassza ki bölcsen a particionálási kulcsot, hogy az összes partíció mérete egyenletes legyen. Az Állapot oszlop particionálása például eltűrheti az adatok eloszlását. Mivel Kalifornia állam lakossága majdnem 30-szor nagyobb, mint Vermonté, a partíció mérete valószínűleg ferde, és a teljesítmény rendkívül eltérő lehet.

Partíciótábla létrehozásához használja a Particionált by záradékot:

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;

A particionált tábla létrehozása után statikus particionálást vagy dinamikus particionálást hozhat létre.

  • A statikus particionálás azt jelenti, hogy a megfelelő könyvtárakban már vannak horizontálisan elosztott adatok. Statikus partíciók esetén manuálisan adja hozzá a Hive-partíciókat a címtár helye alapján. A következő kódrészlet egy példa.

    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/'
    
  • A dinamikus particionálás azt jelenti, hogy azt szeretné, hogy a Hive automatikusan hozzon létre partíciókat. Mivel már létrehozta a particionáló táblát az előkészítési táblából, mindössze annyit kell tennie, hogy adatokat szúr be a particionált táblába:

    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;
    

További információ: Particionált táblák.

Az ORCFile formátum használata

A Hive különböző fájlformátumokat támogat. Példa:

  • Szöveg: az alapértelmezett fájlformátum, és a legtöbb forgatókönyv esetében működik.
  • Avro: jól működik az együttműködési forgatókönyvekben.
  • ORC/Parquet: a legjobban alkalmas teljesítményre.

Az ORC (optimalizált soroszlopos) formátum rendkívül hatékony módszer a Hive-adatok tárolására. Más formátumokhoz képest az ORC a következő előnyökkel jár:

  • összetett típusok, például a DateTime és az összetett és félig strukturált típusok támogatása.
  • akár 70%-os tömörítést is.
  • 10 000 soronként indexel, ami lehetővé teszi a sorok kihagyását.
  • a futásidejű végrehajtás jelentős csökkenése.

Az ORC formátum engedélyezéséhez először létre kell hoznia egy táblát az ORC-ként tárolt záradékkal:

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;

Ezután adatokat szúr be az ORC-táblába az előkészítési táblából. Példa:

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;

Az ORC formátumról az Apache Hive Language kézikönyvében olvashat bővebben.

Vektorizálás

A vektorizálás lehetővé teszi a Hive számára, hogy 1024 sorból álló kötegeket együttesen dolgozzon fel ahelyett, hogy egyszerre egy-egy sort dolgozna fel. Ez azt jelenti, hogy az egyszerű műveletek gyorsabban végezhetők el, mivel kevesebb belső kódot kell futtatni.

A Hive-lekérdezés vektorizálási előtagjának engedélyezéséhez a következő beállítással:

set hive.vectorized.execution.enabled = true;

További információ: Vektoros lekérdezés végrehajtása.

Egyéb optimalizálási módszerek

Több optimalizálási módszer is megfontolható, például:

  • Hive-gyűjtő: olyan technika, amellyel nagy adathalmazokat csoportosíthat vagy szegmentelhet a lekérdezési teljesítmény optimalizálása érdekében.
  • Csatlakozás optimalizálása: a Hive lekérdezés-végrehajtási tervezésének optimalizálása az illesztések hatékonyságának javítása és a felhasználói tippek szükségletének csökkentése érdekében. További információ: Csatlakozás optimalizálása.
  • Csökkentse a redukálókat.

Következő lépések

Ebben a cikkben számos gyakori Hive-lekérdezésoptimalizálási módszert ismert meg. További tudnivalókért olvassa el a következő cikket: