Fedezze fel a Spark teljesítményoptimalizálásának legjobb gyakorlatait – IBM Developer

count () egy adatkészleten egy Spark művelet. Ez egy gyakori probléma, hogy láttam, ahol több count () hívás van a Spark alkalmazásokban, amelyeket a hibakeresés során adnak hozzá, és nem távolítják el őket. Érdemes megkeresni a Spark műveleteket, és eltávolítani azokat, amelyek nem szükségesek, mert nem akarjuk használni a CPU ciklusokat és más erőforrásokat, amikor nem szükséges.

fájlformátumok

az alkalmazás adatkészleteinek tervezésekor ügyeljen arra, hogy a lehető legjobban kihasználja a Spark segítségével elérhető fájlformátumokat. Néhány szempont, amelyet figyelembe kell venni:

  • a Spark az Apache parketta, az ORC pedig az olvasási teljesítményre van optimalizálva. A Spark vektorizációs támogatással rendelkezik, amely csökkenti a lemez I/O-ját.
  • használja a parketta fájlformátumot és használja a tömörítést.
  • különböző fájlformátumok és beépített adatforrások használhatók az Apache Spark – ban.Használjon osztható fájlformátumokat.
  • győződjön meg arról, hogy nincs túl sok kis fájl. Ha sok kis fájlja van, akkor érdemes lehet tömöríteni őket a jobb teljesítmény érdekében.

párhuzamosság

  • növelje a Spark partíciók számát a párhuzamosság növelése érdekében az adatok mérete alapján. Győződjön meg arról, hogy a klaszter erőforrásait optimálisan használják fel. A túl kevés partíció azt eredményezheti, hogy egyes végrehajtók tétlenek, míg a túl sok partíció a feladatütemezés általános költségeit eredményezheti.
  • hangolja be a partíciókat és feladatokat. A Spark 100 ms + – os feladatokat képes kezelni, és magonként legalább 2-3 feladatot javasol egy végrehajtó számára.
  • a Spark a fájlméret bemenete alapján dönt a partíciók számáról. Időnként érdemes kifejezetten megadni a partíciók számát.
    • a read API opcionális számú partíciót vesz igénybe.
    • szikra.sql.akták.maxPartitionBytes, elérhető a Spark v2.0-ban.0, parketta, Ork és JSON esetén.
  • a shuffle partíciókat a spark beállítással lehet beállítani.sql.shuffle.partíciók, amely alapértelmezés szerint 200. Ez nagyon kicsi, ha nagy adatkészlet-méretekkel rendelkezik.

a keverés csökkentése

a keverés drága művelet, mivel magában foglalja az adatok mozgatását a fürt csomópontjain, amely magában foglalja a hálózatot és a lemez I/O-t. Íme néhány tipp a shuffle csökkentéséhez:

  • hangolja be a szikrát.sql.shuffle.partíciók.
  • particionálja a bemeneti adatkészletet megfelelően, hogy az egyes feladatok mérete ne legyen túl nagy.
  • használja a Spark felhasználói felületet a terv tanulmányozásához, hogy lehetőséget keressen a keverés lehető legnagyobb mértékű csökkentésére.
  • képlet ajánlás spark.sql.shuffle.partíciók:
    • nagy adatkészletek esetén célozzon 100 MB-tól 200 MB-nál kisebb feladatcélméretig egy partícióhoz (például 100 MB-os célméretet használjon).
    • szikra.sql.shuffle.partíciók = hányados (shuffle stage bemeneti méret/célméret)/összes mag) * összes mag.

szűrő/csökkentése adatkészlet mérete

keresse meg a lehetőségeket, hogy kiszűrje az adatokat a lehető leghamarabb az alkalmazás csővezeték. Ha van egy szűrési művelet, és csak az adatok egy részhalmazának elemzését szeretné elvégezni, alkalmazza ezt a szűrőt Korán. Ha korán csökkentheti az adatkészlet méretét, tegye meg. Használjon megfelelő szűrő predikátumokat az SQL lekérdezésben, hogy a Spark le tudja nyomni őket az alapul szolgáló adatforráshoz; a szelektív predikátumok jók. Használja őket megfelelő módon. Használjon partíciós szűrőket, ha azok alkalmazhatók.

gyorsítótár megfelelően

a Spark támogatja az adatkészletek tárolását a memóriában. Különböző lehetőségek állnak rendelkezésre:

  • használja a gyorsítótárazást, ha ugyanazt a műveletet többször kiszámítja a folyamatfolyamatban.
  • használja a gyorsítótárazást a persist API használatával a szükséges gyorsítótár-beállítás engedélyezéséhez (persist to disk or not; serialized or not).
  • legyen tisztában a lusta betöltéssel és az elsődleges gyorsítótárral, ha szükséges. Néhány API lelkes, mások pedig nem.
  • nézze meg a Spark felhasználói felület tárolási lapját a gyorsítótárazott adatkészletekkel kapcsolatos információk megtekintéséhez.
  • jó gyakorlat, ha a gyorsítótárazott adatkészletet az erőforrások felszabadítása érdekében eltávolítja, különösen akkor, ha mások is használják a fürtöt.

Csatlakozás

a csatlakozás általában drága művelet, ezért figyeljen az alkalmazás illesztéseire, hogy optimalizálja őket. BroadcastHashJoin a legteljesebb azokban az esetekben, amikor az egyik kapcsolat elég kicsi ahhoz, hogy sugározható legyen. Az alábbiakban néhány tipp található:

  • csatlakozzon a sorrendhez; kezdje a legszelektívebb csatlakozással. Spark-nál kisebb kapcsolatok esetén.sql.autoBroadcastJoinThreshold, akkor ellenőrizze, hogy broadcast HashJoin felvette.
  • használjon SQL tippeket, ha szükséges egy adott típusú csatlakozás kényszerítéséhez.
    • példa: ha egy kis adatkészletet nagy adatkészlettel csatlakoztat, akkor a sugárzott csatlakozás kényszerülhet a kis adatkészlet sugárzására.
    • erősítse meg, hogy a Spark felveszi a sugárzott hash csatlakozást; ha nem, akkor az SQL tipp segítségével kényszerítheti.
  • kerülje a keresztkötéseket.
  • Broadcast HashJoin a legteljesítményesebb, de nem alkalmazható, ha a join mindkét kapcsolata nagy.
  • gyűjtsön statisztikákat a Spark táblázatairól az optimális terv kiszámításához.

fürterőforrások hangolása

  • a fürt erőforrásainak hangolása az erőforráskezelőtől és a Spark verziójától függően.
  • állítsa be a rendelkezésre álló memóriát a meghajtónak: spark.sofőr.memória.
  • hangolja be a végrehajtók számát, valamint a memóriát és a maghasználatot a fürt erőforrásai alapján: executor-memory, num-executors és executor-magok.

nézze meg a Spark kiadás konfigurációs dokumentációját, amellyel dolgozik, és használja a megfelelő paramétereket.

kerülje a drága műveleteket

  • kerülje a sorrendet, ha nincs rá szükség.
  • amikor lekérdezéseket ír, az összes oszlop lekéréséhez a select * funkció használata helyett csak a lekérdezés szempontjából releváns oszlopokat töltse le.
  • ne hívja feleslegesen a számlálást.

Data skew

  • győződjön meg arról, hogy a partíciók azonos méretűek, hogy elkerülje az adatok torzulását és az alacsony CPU-kihasználtsági problémákat.
    • példa: ha párhuzamosan JDBC adatforrásból érkezik adat, és mindegyik partíció nem tölt le hasonló számú rekordot, ez egyenlőtlen méretű feladatokat eredményez (az adatok torzításának egyik formája). Lehet, hogy az egyik partíció csak néhány KB, míg a másik néhány száz MB. Egyes feladatok nagyobbak lesznek, mint mások, és míg a nagyobb feladatok végrehajtói elfoglaltak lesznek, a többi végrehajtó, amely a kisebb feladatot kezeli, befejezi és tétlen lesz.
    • ha a forrásadatokat nem osztják fel optimálisan, akkor kiértékelheti az újraparticionálás használatának kompromisszumait is, hogy kiegyensúlyozott partíciót kapjon, majd a gyorsítótárazással tárolhatja a memóriában, ha szükséges.
  • az Újraparticionálás keverést okoz, a keverés pedig drága művelet, ezért ezt alkalmazás alapján kell értékelni.
  • a Spark felhasználói felületen keresse meg a partíció méretét és a tevékenység időtartamát.

UDFs

a Spark számos beépített felhasználó által definiált funkcióval rendelkezik. A teljesítmény érdekében ellenőrizze, hogy használhatja-e a beépített funkciók egyikét, mivel ezek jót tesznek a teljesítménynek. A Scala API-ban található egyedi UDF-ek nagyobb teljesítményt nyújtanak, mint a Python UDF-ek. Ha a Python API-t kell használnia, használja az újonnan bevezetett pandas UDF-et a Pythonban, amelyet a Spark 2.3-ban adtak ki. A Spark pandas UDF (vektorizált UDFs) támogatása jelentős teljesítményjavulást mutat, szemben az egyéni Python UDF írásával. További információ a pandák UDF írásáról.

remélem, ez hasznos volt az Ön számára, ahogy megy az írás a Spark alkalmazások. Boldog fejlődés! Egy közelgő blog, megmutatom, hogyan lehet a végrehajtási tervet a Spark munkát.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.