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.
MyFunc
egyszerre csak egy sort vesz fel, és 15 millió ~ sor van 19.06.2018textfile
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 asc.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