WebHU - Programozási kérdések és válaszok

Spark konfiguráció a memória megtelt hiba esetén

Klaszter beállítása -

Driver has 28gb
Workers have 56gb each (8 workers)

Konfiguráció -

spark.memory.offHeap.enabled true
spark.driver.memory 20g
spark.memory.offHeap.size 16gb
spark.executor.memory 40g

A munkám -

//myFunc just takes a string s and does some transformations on it, they are very small strings, but there's about 10million to process.


//Out of memory failure
data.map(s => myFunc(s)).saveAsTextFile(outFile)

//works fine
data.map(s => myFunc(s))

Ezenkívül fürtözöttem / eltávolítottam a szikrát a programomból, és tökéletesen befejeződött (sikeresen mentve egy fájlba) egyetlen szerveren, 56 GB rammal. Ez azt mutatja, hogy ez csak egy szikrakonfigurációs probléma. Átnéztem a következőt: https://spark.apache.org/docs/latest/configuration.html#memory-management és a jelenleg rendelkezésemre álló konfigurációk úgy tűnik, hogy csak annyit kell módosítani, hogy a munkám működjön. Mit kellene még változtatnom?

Frissítés -

Adatok -

val fis: FileInputStream = new FileInputStream(new File(inputFile))
val bis: BufferedInputStream = new BufferedInputStream(fis);
val input: CompressorInputStream = new CompressorStreamFactory().createCompressorInputStream(bis);
br = new BufferedReader(new InputStreamReader(input))
val stringArray = br.lines().toArray()
val data = sc.parallelize(stringArray)

Megjegyzés - ez nem okoz memóriaproblémákat, bár hihetetlenül nem hatékony. Spark segítségével nem tudok olvasni belőle, mert EOF hibákat dob.

myFunc, nem igazán tudom közzétenni a kódot, mert összetett. De alapvetően a bemeneti karakterlánc egy elválasztott karakterlánc, némi elválasztó cserét, dátum/idő normalizálást és hasonlókat végez. A kimeneti karakterlánc nagyjából akkora lesz, mint egy bemeneti karakterlánc.

Ezenkívül jól működik kisebb adatméreteknél, és a kimenet megfelelő és nagyjából megegyezik a bemeneti adatfájl méretével, ahogyan lennie kell.

19.06.2018

  • Mi az a data, és hogyan jön létre? mi a myFunc meghatározása? Valami memóriaproblémát okozhat a myFunc fájlban, de valószínűbb, hogy a probléma a data létrehozásához használt egyéb átalakítások egyike. A kód megtekintése nélkül lehetetlen megmondani. Tehát látnunk kell a teljes folyamatot a forrásfájlból. Aki jól működik, az csinálja, mert nem csinál semmit. Ne feledje, hogy semmi sem történik szikrában, amíg nem hajt végre cselekvést. 19.06.2018
  • @puhlen frissítette a fő bejegyzést információkkal 19.06.2018

Válaszok:


1

A jelenlegi megoldásod nem használja ki a szikrát. A teljes fájlt betölti egy tömbbe a memóriában, majd az sc.parallelise segítségével elosztja egy RDD-n. Ez rendkívül memóriapazarlás (még szikra nélkül is), és természetesen memóriahiány-problémákat okoz nagy fájlok esetén.

Ehelyett használja a sc.textFile(filePath)-t az RDD létrehozásához. Ekkor a Spark képes okosan olvasni és darabokban feldolgozni a fájlt, így egyszerre csak egy kis részének kell a memóriában lennie. A párhuzamosság előnyeit is kihasználhatja ezen a módon, mivel a Spark képes lesz párhuzamosan olvasni és feldolgozni a fájlt, bármennyi végrehajtója és sorszáma is van, ahelyett, hogy a teljes fájlt egyetlen szálon, egyetlen szálon kellene beolvasnia. gép.

Feltéve, hogy a myFunc egyszerre csak egy sort tud nézni, akkor ennek a programnak nagyon kicsi memóriaterülettel kell rendelkeznie.

19.06.2018
  • Igen, megpróbáltam, tettem egy megjegyzést, hogy ez nem lehetséges, mert néhány EOF hibát kapok, és a bemeneti fájlokat úgysem lehet módosítani. De ez megoldaná a problémámat, ha valahogy sikerülne? Mivel a teljes fájl olvasása önmagában nem okoz memóriahibát. 19.06.2018
  • Igen, a MyFunc egyszerre csak egy sort vesz fel, és 15 millió ~ sor van 19.06.2018
  • @jayjay93 Igen, ha a textfile használatával működik, akkor megoldja a problémát. Az illesztőprogram memóriáját is növelheti, ha úgy érzi, hogy nagy adatkészletet kell betöltenie egy tömbbe, majd használja a sc.parallelize parancsot. Ha a program szikra nélkül is jól működik, akkor miért nem csinálja ezt. Valószínűleg írhatna egy hatékony programot, amely 100 MB alatti RAM-ot használ egyetlen gépen a feladat elvégzéséhez a leírása alapján. 20.06.2018
  • Nem kételkedem benned, de mielőtt megpróbálnám kijavítani a szövegfájl problémáját, a teljes fájlt az illesztőprogramomon tárolhatom, miközben csak a memória 20%-át használom. Miért segítene a fájl intelligens olvasása abban, hogy kifogyjon a memória? Az illesztőprogram 15 milliós elemtömbje egyáltalán nem okoz problémát, ezt teszteltem. 20.06.2018
  • @jayjay93 a tömb párhuzamosítása sokkal több memóriát használ, mint egy normál tömb, így bár lehet, hogy elfér önmagában, még mindig túl nagy lehet a párhuzamosításhoz. Ha ezt így kell megtennie, és nem tud csak több memóriát adni az illesztőprogramnak, akkor a műveletet valahogyan feldarabolhatja úgy, hogy egyszerre csak a fájl egy részét tölti be. 20.06.2018

  • 2

    Segítene, ha további részleteket írna le arról, hogy mi történik a programjában a MAP előtt és után. A második parancs (csak Map) nem csinál semmit, hacsak nem indítanak el egy műveletet. A fájl valószínűleg nincs particionálva, és az illesztőprogram végzi a munkát. Az alábbiakban egyenletesen kell kényszeríteni az adatokat a dolgozókra, és meg kell védeni az OOM-ot egyetlen csomóponton. Ez azonban az adatok keveredését okozza.

    A megoldás frissítése a kód megtekintése után jobb lesz, ha ezt teszi

    val data = sc.parallelize(stringArray).repartition(8)
    data.map(s => myFunc(s)).saveAsTextFile(outFile)
    
    19.06.2018
  • Frissítést adtam a bejegyzésemhez további információkkal. Azért megpróbálom, köszi! 19.06.2018
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..