Megosztás a következőn keresztül:


Natív végrehajtási motor a Fabric Data Engineeringhez

A natív végrehajtási motor a Microsoft Fabricben futó Apache Spark-feladatok végrehajtásának úttörő fejlesztése. Ez a vektorizált motor úgy optimalizálja a Spark-lekérdezések teljesítményét és hatékonyságát, hogy közvetlenül a lakehouse-infrastruktúrán futtatja őket. A motornak zökkenőmentes integrációja azt jelenti, hogy nincs szükség kódmódosításra, és elkerüli a szállítói zárolást. Támogatja az Apache Spark API-kat, és kompatibilis a Runtime 1.3-mal (Apache Spark 3.5), és parquet és Delta formátumokkal is működik. Függetlenül attól, hogy az adatok hol találhatók a OneLake-ben, vagy ha parancsikonokkal fér hozzá az adatokhoz, a natív végrehajtási motor maximalizálja a hatékonyságot és a teljesítményt.

A natív végrehajtási motor jelentősen emeli a lekérdezési teljesítményt, miközben minimalizálja az üzemeltetési költségeket. Figyelemre méltó sebességbővítést biztosít, amely akár négyszer gyorsabb teljesítményt is elérhet a hagyományos OSS -hez (nyílt forráskódú szoftver) tartozó Sparkhoz képest, ahogy azt az TPC-DS 1 TB-os teljesítményteszt is érvényesíti. A motor az adatfeldolgozási forgatókönyvek széles skáláját képes kezelni, a rutinszerű adatbetöltéstől a kötegelt feladatokon át az ETL-feladatokig (kinyerés, átalakítás, betöltés) az összetett adatelemzésig és a rugalmas interaktív lekérdezésekig. A felhasználók kihasználhatják a gyorsított feldolgozási időt, a megnövelt átviteli sebességet és az optimalizált erőforrás-kihasználtságot.

A natív végrehajtási motor két fő OSS-összetevőn alapul: a Velox, a Meta által bevezetett C++ adatbázis-gyorsítási kódtár és az Apache Gluten (inkubálás) egy középső réteg, amely a JVM-alapú SQL-motorok végrehajtásának az Intel által bevezetett natív motorokra való kiszervezéséért felelős.

Mikor érdemes használni a natív végrehajtási motort?

A natív végrehajtási motor megoldást kínál a lekérdezések nagy méretű adathalmazokon való futtatására; az alapul szolgáló adatforrások natív képességeivel optimalizálja a teljesítményt, és minimalizálja a hagyományos Spark-környezetekben általában az adatáthelyezéssel és szerializálással kapcsolatos többletterhelést. A motor különféle operátorokat és adattípusokat támogat, beleértve a rollup hash aggregátumokat, a szórt beágyazott hurok összekapcsolást (BNLJ) és a pontos időbélyeg-formátumokat. Ahhoz azonban, hogy teljes mértékben kihasználhassa a motor képességeit, figyelembe kell vennie az optimális használati eseteket:

  • A motor akkor hatékony, ha parquet- és Delta-formátumban dolgozik az adatokkal, amelyeket natív módon és hatékonyan képes feldolgozni.
  • A bonyolult átalakításokat és összesítéseket tartalmazó lekérdezések jelentősen kihasználják a motor oszlopos feldolgozási és vektorizációs képességeit.
  • A teljesítmény javítása azokban a forgatókönyvekben a legemlékesebb, amikor a lekérdezések nem aktiválják a tartalék mechanizmust a nem támogatott funkciók vagy kifejezések elkerülésével.
  • A motor jól használható számítási igényű lekérdezésekhez, nem pedig egyszerű vagy I/O-kötött lekérdezésekhez.

A natív végrehajtási motor által támogatott operátorokkal és funkciókkal kapcsolatos információkért tekintse meg az Apache Glutén dokumentációját.

A natív végrehajtási motor engedélyezése

A natív végrehajtási motor teljes képességeinek az előzetes fázisban való használatához speciális konfigurációkra van szükség. Az alábbi eljárások bemutatják, hogyan aktiválhatja ezt a funkciót jegyzetfüzetekhez, Spark-feladatdefiníciókhoz és teljes környezetekhez.

Fontos

A natív végrehajtási motor támogatja a legújabb GA futtatókörnyezeti verziót, amely a Runtime 1.3 (Apache Spark 3.5, Delta Lake 3.2). A runtime 1.3 natív végrehajtási motorjának kiadásával az előző verzió ( Runtime 1.2 (Apache Spark 3.4, Delta Lake 2.4)) támogatása megszűnik. Arra biztatunk minden ügyfelet, hogy frissítsen a legújabb Runtime 1.3-ra. Ha a Runtime 1.2 natív végrehajtási motorját használja, a natív gyorsítás le lesz tiltva.

Engedélyezés környezeti szinten

A teljesítmény egységes javítása érdekében engedélyezze a natív végrehajtási motort a környezethez társított összes feladathoz és jegyzetfüzethez:

  1. Lépjen a környezetet tartalmazó munkaterületre, és válassza ki a környezetet. Ha még nincs létrehozott környezete, tekintse meg a Környezet létrehozása, konfigurálása és használata a Fabricben címmel.

  2. A Spark-számítás alatt válassza a Gyorsítás lehetőséget.

  3. Jelölje be a natív végrehajtási motor engedélyezése jelölőnégyzetet .

  4. Mentse és tegye közzé a módosításokat.

    Képernyőkép arról, hogyan engedélyezheti a natív végrehajtási motort a környezeti elemen belül.

Ha a környezet szintjén engedélyezve van, minden további feladat és jegyzetfüzet örökli a beállítást. Ez az öröklés biztosítja, hogy a környezetben létrehozott új munkamenetek és erőforrások automatikusan kihasználják a továbbfejlesztett végrehajtási képességeket.

Fontos

Korábban a natív végrehajtási motor engedélyezve lett a Spark beállításaival a környezeti konfigurációban. A natív végrehajtási motor mostantól egyszerűbben engedélyezhető a környezeti beállítások Gyorsítás lapján található kapcsolóval. A használat folytatásához lépjen a Gyorsítás lapra, és kapcsolja be a váltógombot. Ha előnyben részesíti, a Spark-tulajdonságokon keresztül is engedélyezheti.

Jegyzetfüzet vagy Spark-feladat definíciójának engedélyezése

Engedélyezheti a natív végrehajtási motort egyetlen jegyzetfüzethez vagy Spark-feladatdefinícióhoz is, a szükséges konfigurációkat a végrehajtási szkript elején kell tartalmaznia:

%%configure 
{ 
   "conf": {
       "spark.native.enabled": "true", 
   } 
} 

Jegyzetfüzetek esetén szúrja be a szükséges konfigurációs parancsokat az első cellába. Spark-feladatdefiníciók esetén vegye fel a konfigurációkat a Spark-feladatdefiníció előtérbe. A natív végrehajtási motor integrálva van az élő készletekkel, így a funkció engedélyezése után azonnal érvénybe lép anélkül, hogy új munkamenetet kellene kezdeményeznie.

Vezérlés a lekérdezés szintjén

A natív végrehajtási motor bérlői, munkaterületi és környezeti szinten történő engedélyezésének mechanizmusai, amelyek zökkenőmentesen integrálhatók a felhasználói felülettel, aktív fejlesztés alatt állnak. Addig is letilthatja a natív végrehajtási motort bizonyos lekérdezések esetében, különösen akkor, ha azok jelenleg nem támogatott operátorokat érintenek (lásd a korlátozásokat). A letiltáshoz állítsa a Spark-konfiguráció spark.native.enabled beállítását hamis értékre a lekérdezést tartalmazó adott cellához.

%%sql 
SET spark.native.enabled=FALSE; 

Képernyőkép arról, hogyan tilthatja le a natív végrehajtási motort egy jegyzetfüzetben.

Miután végrehajtotta azt a lekérdezést, amelyben a natív végrehajtási motor le van tiltva, újra engedélyeznie kell a következő cellákhoz a spark.native.enabled érték igaz értékre állításával. Ez a lépés azért szükséges, mert a Spark egymás után hajtja végre a kódcellákat.

%%sql 
SET spark.native.enabled=TRUE; 

A motor által végrehajtott műveletek azonosítása

Több módszer is létezik annak megállapítására, hogy az Apache Spark-feladat egyik operátora a natív végrehajtási motor használatával lett-e feldolgozva.

Spark felhasználói felület és Spark-előzmények kiszolgálója

Lépjen a Spark felhasználói felületére vagy a Spark előzménykiszolgálóra a vizsgálandó lekérdezés megkereséséhez. A Spark webes felhasználói felületének eléréséhez keresse meg a Spark-feladatdefiníciót, és futtassa azt. A Futtatás fül alatt válassza a ... a Alkalmazás neve mellett, majd válassza a Spark webes felület megnyitásalehetőséget. A Spark felhasználói felületét is elérheti a munkaterület Monitorozás fülön. Válassza ki a jegyzetfüzetet vagy a pipelinet, majd a monitorozási oldalról közvetlen hivatkozás vezet az aktuális feladatok Spark felhasználói felületére.

Képernyőkép a Spark webes felhasználói felületére való navigálásról.

A Spark felhasználói felületén megjelenő lekérdezési tervben keresse meg a Transformer, *NativeFileScan vagy VeloxColumnarToRowExecutótaggal végződő csomópontneveket. Az utótag azt jelzi, hogy a natív végrehajtási motor hajtotta végre a műveletet. A csomópontok címkéje lehet például RollUpHashAggregateTransformer, ProjectExecTransformer, BroadcastHashJoinExecTransformer, ShuffledHashJoinExecTransformer vagy BroadcastNestedLoopJoinExecTransformer.

Képernyőkép a Transformer utótaggal végződő DAG-vizualizációk ellenőrzéséről.

DataFrame – magyarázat

Másik lehetőségként végrehajthatja a parancsot a df.explain() jegyzetfüzetben a végrehajtási terv megtekintéséhez. A kimeneten belül keresse meg ugyanazokat a Transformer, *NativeFileScan vagy VeloxColumnarToRowExec utótagokat. Ezzel a módszerrel gyorsan ellenőrizheti, hogy a natív végrehajtási motor kezeli-e az adott műveleteket.

Képernyőkép a lekérdezés fizikai tervének ellenőrzéséről, valamint arról, hogy a lekérdezést a natív végrehajtási motor hajtotta végre.

Visszaeső mechanizmus

Egyes esetekben előfordulhat, hogy a natív végrehajtási motor nem tudja végrehajtani a lekérdezést, például a nem támogatott funkciók miatt. Ezekben az esetekben a művelet visszatér a hagyományos Spark motorhoz. Ez az automatikus tartalék mechanizmus biztosítja, hogy ne legyen megszakítás a munkafolyamatban.

Képernyőkép a tartalék mechanizmusról.

Képernyőkép a tartalék mechanizmushoz társított naplók ellenőrzéséről.

A motor által végrehajtott lekérdezések és adatkeretek monitorozása

A natív végrehajtási motor SQL-lekérdezésekre és DataFrame-műveletekre való alkalmazásának jobb megértése, valamint a fázis- és operátorszintek részletezése érdekében a Spark felhasználói felületén és a Spark Előzménykiszolgálón részletesebb információkat talál a natív motor végrehajtásáról.

Natív végrehajtási motor fül

Az új "Glutén SQL/ DataFrame" lapra lépve megtekintheti a Glutén buildelési adatait és a lekérdezés végrehajtásának részleteit. A Lekérdezések tábla betekintést nyújt a natív motoron futó csomópontok számába, valamint azokba a csomópontokba, amelyek visszatérnek a JVM-re lekérdezésenként.

Képernyőkép a natív végrehajtási motor lapról.

Lekérdezés-végrehajtási gráf

Az Apache Spark lekérdezés-végrehajtási terv vizualizációjának lekérdezésleírásában is választhat. A végrehajtási gráf natív végrehajtási adatokat biztosít a szakaszok és azok műveletei között. A háttérszínek megkülönböztetik a végrehajtási motorokat: a zöld a natív végrehajtási motort jelöli, míg a világoskék azt jelzi, hogy a művelet az alapértelmezett JVM-motoron fut.

Képernyőkép a lekérdezés-végrehajtási gráfról.

Korlátozások

Bár a Microsoft Fabric natív végrehajtási motorja (NEE) jelentősen növeli az Apache Spark-feladatok teljesítményét, jelenleg a következő korlátozásokkal rendelkezik:

Meglévő korlátozások

  • Inkompatibilis Spark-funkciók: A natív végrehajtási motor jelenleg nem támogatja a felhasználó által definiált függvényeket (UDF-eket), a függvényt vagy a array_contains strukturált streamelést. Ha ezeket a függvényeket vagy nem támogatott funkciókat közvetlenül vagy importált kódtárakon keresztül használják, a Spark visszaáll az alapértelmezett motorjára.

  • Nem támogatott fájlformátumok: A lekérdezéseket JSONXMLCSV a natív végrehajtási motor nem gyorsítja fel. Ezek alapértelmezetten visszaállítanak a normál Spark JVM motorra a végrehajtás érdekében.

  • Az ANSI mód nem támogatott: A natív végrehajtási motor nem támogatja az ANSI SQL módot. Ha engedélyezve van, a végrehajtás visszatér az alapértelmezett Spark motor használatához.

  • Dátumszűrési típus eltérései: A natív végrehajtási motor gyorsításának előnyeinek kihasználásához győződjön meg arról, hogy a dátum-összehasonlítás mindkét oldala adattípusban egyezik. Például egy oszlop és egy sztringkonstans DATETIME összehasonlítása helyett legyen megadva explicit módon, így:

    CAST(order_date AS DATE) = '2024-05-20'
    

Egyéb szempontok és korlátozások

  • Decimális és lebegőpontos konverzió eltérése: Amikor a DECIMAL típusról a FLOAT típusra történik a konverzió, a Spark megőrzi a pontosságot azzal, hogy sztringgé konvertálja és feldolgozza. A NEE (Velox-on keresztül) közvetlen konverziót végez a belső int128_t ábrázolásból, ami kerekítési különbségeket eredményezhet.

  • Időzónia konfigurációs hibái : Ha nem felismert időzónát állít be a Sparkban, a feladat a NEE alatt meghiúsul, a Spark JVM pedig elegánsan kezeli azt. Például:

    "spark.sql.session.timeZone": "-08:00"  // May cause failure under NEE
    
  • Inkonzisztens kerekítési viselkedés: A round() függvény eltérően viselkedik a NEE-ben, mivel std::rounda Spark kerekítési logikáját nem replikálja. Ez numerikus inkonzisztenciákhoz vezethet a kerekítési eredményekben.

  • Hiányzó duplikált kulcsellenőrzési map() függvény: Ha spark.sql.mapKeyDedupPolicyKIVÉTEL értékre van állítva, a Spark hibát jelez az ismétlődő kulcsok esetében. A NEE jelenleg kihagyja ezt az ellenőrzést, és lehetővé teszi a lekérdezés helytelen sikerességét.
    Példa:

    SELECT map(1, 'a', 1, 'b'); -- Should fail, but returns {1: 'b'}
    
  • Sorrendbeli eltérés collect_list() rendezéssel: A Spark DISTRIBUTE BY és SORT BY használatakor megőrzi az elemek sorrendjét a collect_list()-ben. A NEE eltérő sorrendben adja vissza az értékeket az elegyítési különbségek miatt, ami a rendezési szempontból érzékeny logika eltérő elvárásait eredményezheti.

  • Köztes típuseltérés a következőhözcollect_list() / collect_set(): A Spark a köztes típusnak a BINARY alkalmazza ezekhez az összesítésekhez, míg a NEE a ARRAY-t használja. Ez az eltérés kompatibilitási problémákhoz vezethet a lekérdezések tervezése vagy végrehajtása során.