Pracuję nad projektem strumieniowym Scala (2.11)/Spark (1.6.1) i używam mapWithState()
do śledzenia danych z poprzednich partii.Spark Streaming MapWithState wydaje się okresowo odbudowywać stan kompletny
Stan jest dystrybuowany w 20 partycjach na wielu węzłach, utworzonych za pomocą StateSpec.function(trackStateFunc _).numPartitions(20)
. W tym stanie mamy tylko kilka kluczy (~ 100) zmapowanych do Sets
z ~ 160 000 wpisów, które rosną w całej aplikacji. Cały stan jest do 3GB
, który może być obsługiwany przez każdy węzeł w klastrze. W każdej partii niektóre dane są dodawane do stanu, ale nie są usuwane do samego końca procesu, tj. ~ 15 minut.
Podczas korzystania z interfejsu użytkownika aplikacji, co 10-ty czas przetwarzania partii jest bardzo wysoki w porównaniu do innych partii. Zobacz zdjęcia:
żółtego pola reprezentują wysoki czas przetwarzania.
Bardziej szczegółowy widok praca pokazuje, że w tych partiach występują w pewnym momencie, dokładnie wtedy, gdy wszystkie partycje są 20 „pominięty”. Lub tak mówi interfejs użytkownika.
Moje rozumienie skipped
jest to, że każda partycja stan jest jednym z możliwych zadań, które nie są wykonywane, ponieważ nie muszą być przeliczane. Jednak nie rozumiem, dlaczego liczba skips
jest różna w każdej pracy i dlaczego ostatnia praca wymaga tak dużego przetwarzania. Wyższy czas przetwarzania występuje niezależnie od wielkości państwa, wpływa tylko na czas trwania.
Czy jest to błąd w funkcji mapWithState()
, czy jest to zamierzone zachowanie? Czy podstawowa struktura danych wymaga pewnego rodzaju przetasowania, czy Set
w stanie trzeba skopiować dane? A może jest to błąd w mojej aplikacji?
W moim przypadku widzę, że każde zlecenie jest sprawdzane w partia. Dlaczego nie tylko ostatnia praca? Jakie jest twoje rozwiązanie, aby mieć oko na rozmiar państwa? Aby móc ją zoptymalizować. – crak
@crak Jaki jest Twój okres kontrolny? I jak widzisz, że każda praca kontroluje dane? –
Co 10 partii. Moje oko było nadużyciem, mam 12 zadań na 16, które robią checkpoint. I to jest logiczne, mam 12 mapWithState, widzę tam ślad w iskrze. Ale bez wiedzy, który z nich ma największy rozmiar. mapWithState Store po prostu stwierdziła, że nie tak jak poprzednia implantacja? – crak