2017-09-02 97 views
7

Mam dwa strumienie danych, które chcę połączyć. Problem polega na tym, że jeden strumień danych ma znacznie wyższą częstotliwość niż inne i zdarzają się sytuacje, w których jeden strumień w ogóle nie odbiera zdarzeń. Czy możliwe jest korzystanie z ostatniego wydarzenia z jednego strumienia i dołączenie go z innym strumieniem do każdego nadchodzącego wydarzenia?Połączyć dwa strumienie w Apache Flink niezależnie od czasu okna

Jedynym znalezionym rozwiązaniem jest użycie funkcji łączenia, ale trzeba określić wspólne okno, w którym można zastosować funkcję łączenia. To okno nie jest osiągnięte, gdy jeden strumień nie otrzymuje żadnych zdarzeń.

Czy istnieje możliwość zastosowania funkcji łączenia dla każdego zdarzenia pochodzącego z jednego lub drugiego strumienia i utrzymania stanu ostatnio zużytego zdarzenia i wykorzystania tego zdarzenia dla funkcji łączenia?

Z góry dziękuję za pomocne wskazówki!

Odpowiedz

5

Chcesz używać Flink's ConnectedStream s z RichCoFlatMapFunction lub CoProcessFunction. Każda z nich pozwoli ci zachować stan zarządzany (tzn. Ostatni element z rzadko aktualizowanego strumienia) i połączyć go z szybszym strumieniem. CoProcessFunction dodaje możliwość pracy z licznikami, których należy użyć do wyczyszczenia stanu kluczy wygasłych, jeśli jest to istotne.

Na stronie szkoleniowej Flink znajduje się ćwiczenie dotyczące implementacji takiego połączenia: Low-latency Event Time Join.

Aktualizacja: W wersji Flink 1.5 (jeszcze nie opublikowanej od lutego 2018) biblioteka SQL has an implementation of non-windowed stream joins. Przechowuje rekordy w stanie Flink, używając MapState<Long, Record> gdzie Long jest znacznikiem czasu i łączy się przez iterację na tych mapach i porównywanie znaczników czasu. W porównaniu do przykładu ze szkolenia (patrz link powyżej), ma tę zaletę, że tylko deserializowanie rekordów, gdy są one potrzebne.

+0

Dziękujemy! Właśnie tego szukałem! – FLoppix

+0

@DavidAnderson Odmiennie, Czy ten przykład byłby inny przy dołączaniu dwóch szybkich (częstych) strumieni? Co byś zmienił? – Beckham