Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk azt ismerteti, hogyan optimalizálhatja az Apache Spark-fürt konfigurációját a legjobb teljesítmény érdekében az Azure HDInsightban.
Áttekintés
Ha lassú feladatokat futtat egy Join vagy Shuffle művelet során, az ok valószínűleg az adat eloszlási egyenlőtlensége. Az adateltérés a feladatadatok aszimmetriája. Egy térképfeladat például 20 másodpercet is igénybe vehet. Egy olyan feladat futtatása azonban, amelyben az adatok össze vannak kapcsolva vagy össze vannak keverve, órákat vesz igénybe. Az adateltérés javításához sózzuk a teljes kulcsot, vagy használjunk izolált sót a kulcsok csak néhány részhalmazához. Ha izolált sót használ, további szűréssel elkülönítheti a sózott kulcsok részhalmazát a térképcsatlakozásokban. Egy másik lehetőség az, hogy bevezet egy vödör oszlopot, és először előzetesen összesíti a vödrökben.
A lassú illesztést okozó másik tényező lehet az illesztés típusa. Alapértelmezés szerint a Spark az SortMerge illesztés típusát használja. Ez az illesztéstípus leginkább nagy adathalmazokhoz alkalmas. Máskülönben azonban számításilag költséges, mert először az adatok bal és jobb oldalát kell rendeznie, mielőtt egyesítené őket.
Az Broadcast illesztés leginkább kisebb adathalmazokhoz alkalmas, vagy ha az illesztés egyik oldala sokkal kisebb, mint a másik oldal. Ez az illesztéstípus az összes végrehajtó egyik oldalát közvetíti, ezért általában több memóriát igényel a közvetítésekhez.
A konfigurációban módosíthatja az illesztés típusát a beállítással spark.sql.autoBroadcastJoinThreshold, vagy beállíthatja az illesztési tippet a DataFrame API-k (dataframe.join(broadcast(df2))) használatával.
// Option 1
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", 1*1024*1024*1024)
// Option 2
val df1 = spark.table("FactTableA")
val df2 = spark.table("dimMP")
df1.join(broadcast(df2), Seq("PK")).
createOrReplaceTempView("V_JOIN")
sql("SELECT col1, col2 FROM V_JOIN")
Ha gyűjtőtáblákat használ, akkor van egy harmadik illesztéstípusa, az Merge illesztés. A megfelelően előre particionált és előre rendezett adathalmazok kihagyják a drága rendezési fázist egy SortMerge illesztésből.
Az illesztések sorrendje számít, különösen az összetettebb lekérdezésekben. Kezdje a legválogatottabb illesztésekkel. Emellett áthelyezheti azokat az illesztéseket is, amelyek lehetőség szerint növelik a sorok számát az összesítések után.
A Cartesian-illesztések párhuzamosságának kezeléséhez hozzáadhat beágyazott struktúrákat, ablakokat, és kihagyhat egy vagy több lépést a Spark-feladatban.
Feladatvégrehajtás optimalizálása
- Szükség esetén gyorsítótárazza, például ha kétszer használja az adatot, akkor gyorsítótárazza.
- Az összes végrehajtónak továbbítja a változókat. A változók csak egyszer vannak szerializálva, ami gyorsabb kereséseket eredményez.
- Használja a szálkészletet az illesztőprogramon, ami sok feladat gyorsabb működését eredményezi.
Rendszeresen ellenőrizze a futó feladatokat teljesítményproblémák kiszűrésére. Ha több megállapításra van szüksége bizonyos problémákról, fontolja meg az alábbi teljesítményprofilozási eszközök egyikét:
- Az Intel PAL Eszköz figyeli a processzor-, a tárolási és a hálózati sávszélesség használatát.
- Oracle Java 8 Mission Control profilt készít a Spark és a végrehajtó kódhoz.
A Spark 2.x lekérdezési teljesítményének kulcsa a volfrámmotor, amely a teljes fázisú kódgenerálástól függ. Bizonyos esetekben a teljes fázisú kódlétrehozás le lehet tiltva. Ha például nem modifikálható (string) típust használ az aggregációs kifejezésben, akkor SortAggregate jelenik meg HashAggregate helyett. A jobb teljesítmény érdekében például próbálkozzon a következő lépésekkel, majd engedélyezze újra a kódgenerálást:
MAX(AMOUNT) -> MAX(cast(AMOUNT as DOUBLE))