W dokumentacji Sparka mówi, że metoda RDDs reduce
wymaga asocjacyjnej i komutatywnej funkcji binarnej.Spark: różnica semantyki między redukuj i redukujByKey
Jednak metoda TYLKO wymaga reduceByKey
asocjacyjnej funkcji binarnej.
sc.textFile("file4kB", 4)
Zrobiłem kilka testów i najwyraźniej to zachowanie, które otrzymuję. Skąd ta różnica? Dlaczego reduceByKey
zapewnia, że funkcja binarna jest zawsze stosowana w określonej kolejności (w celu dostosowania do braku komutatywności), gdy nie ma ona wartości reduce
?
przykład, jeżeli obciążenie część (mały) tekst na 4 strefy (minimalne):
val r = sc.textFile("file4k", 4)
następnie:
r.reduce(_ + _)
powraca do ciągu, w którym elementy nie są zawsze w tym samym porządku, mając na uwadze, że:
r.map(x => (1,x)).reduceByKey(_ + _).first
zawsze zwraca ten sam ciąg (gdzie wszystko jest w tej samej kolejności, co w oryginale) l plik).
(Sprawdziłem z r.glom
, a zawartość pliku jest rzeczywiście rozłożona na 4 partycje, nie ma pustej partycji).
Chyba pomysł z 'reduceByKey' jest to, że prawdopodobnie masz wiele różnych kluczy, więc można zredukować wszystko dla pojedynczego klucza w jednym wątku, co oznacza, że zawsze można uruchomić obliczenia od lewej do prawej. Natomiast "redukcja" często będzie używana na dużym zestawie danych, więc nie należy przejmować się kolejnością operacji. –
Ile executorów używasz w swoich eksperymentach? – gprivitera