poniedziałek, czerwca 26, 2023

Nie lubię Sparka ;-)

Tak bawię się Sparkiem i nie do końca rozumiem co on ułatwia ;-)
Jak nie używam cache to mi pewne rzeczy wykonuje po wiele razy (co ma sens bo przecież większość kodu składa takie gigantyczne funkcje i dopiero jak jest coś terminującego jak count, collect czy reduce to się te funkcje wykonują), a jak używam cache to mi potrafią wyskakiwać problemy z pamięcią ;-)

To jest chyba problem używania czegoś do danych liczonych najmniej w setkach GB, a jeszcze lepiej w TB do procesowania stuffy który zajmuje w porywach do 6 GB ;-)

Tak przy okazji co wg Was zrobi taki kod:
// build ArrayList with numbers from 0 to 2
List<Integer> inputData = new ArrayList<>();
for (int i=0; i<3; i++) inputData.add(i);

// Sparkaize it ;-)
JavaRDD<Integer> myRDD = sc.parallelize(inputData);

// map function, it returns the same what is on input but also "logs" it
Function<Integer, Integer> func = a -> {
System.out.println("Toster "+a);
return a;
};
// map
JavaRDD<Integer> map1 = myRDD.map(func);

// count and print
System.out.println("1:"+map1.count());
// again count and print
System.out.println("2:"+map1.count());
Co on wypisze? :-)
Okazuje się, że ponieważ 2 razy wołamy count na map1 to nasza funkcja mapujaca wykona się przy pierwszym count tyle razy ile mamy danych w myRDD, a później drugi raz przy drugim count.
To ma sens, bo tak naprawdę map1 ma w sobie tylko informację w stylu zaapply'uj funkcję map do danych z myRDD, i jak wołamy count() to znaczy, że trzeba zrobić apply tej funkcji mapującej dla każdego kawałka danych i na tym czymś zrobić count, to samo przy drugim count().
To jest sensowne, ale takie ciut zaskakujące jeśli się zapomni, że to jest funkcyjne ;-)




Podobne postybeta
Nie znoszę programowania "funkcyjnego" :-)
Zdradliwa Java i 8 królowych ;-)
Java 8 nadchodzi....
SleepAdvisor - komórka pomaga w wyspaniu się ;-)
Reality Check

Brak komentarzy:

Prześlij komentarz