2017-09-02 120 views
7

Birleştirmek istediğim iki veri akışım var. Sorun, bir veri akışının diğerinden daha yüksek bir frekansa sahip olmasıdır ve bir akımın hiç bir zaman olay almadığı zamanlar vardır. Son olayı bir akıştan kullanmak ve gelen her olayda diğer akışla birleştirmek mümkün mü?Pencere akışından bağımsız olarak iki akışını Apache Flink'te birleştirin

Bulduğum tek çözüm, birleştirme işlevini kullanmaktır, ancak birleştirme işlevini uygulayabileceğiniz ortak bir pencere belirtmeniz gerekir. Bir akış herhangi bir olay almıyorsa, pencereye ulaşılamıyor.

Bir akıştan veya diğerinden gelen her olayda birleştirme işlevini uygulamak ve son tüketilen olayın durumunu korumak ve bu olayı birleştirme işlevi için kullanmak mümkün mü?

Herhangi bir yararlı ipucu için şimdiden teşekkür ederiz!

cevap

5

Flink'in ConnectedStream s ürününü RichCoFlatMapFunction veya CoProcessFunction ile kullanmak istersiniz. Bunlardan herhangi biri, yönetilen durumu (diğer bir deyişle, seyrek olarak güncellenen akıştan son öğe) tutmanıza ve daha hızlı akışla birleştirmenize izin verir. CoProcessFunction, zaman aşımına uğramış tuşlarla çalışmayı, geçerlilik süresinin sona ermesi durumunda durumu temizlemek için kullanmanız gerektiğini ekler.

Flink eğitim sitesinde, böyle bir katılımın gerçekleştirilmesi hakkında bir egzersiz var: Low-latency Event Time Join.

Güncelleme: Flink 1.5'de (Şubat 2018 itibariyle yayımlanmadı), SQL kitaplığı has an implementation of non-windowed stream joins. Kayıtları, Uzun zaman damgası olan MapState<Long, Record> kullanarak Flink durumunda depolar ve bu haritalar üzerinde yineleme yaparak ve zaman damgalarını karşılaştırarak birleştirir. Eğitimden alınan örnekle karşılaştırıldığında (yukarıdaki bağlantıya bakınız), bu sadece ihtiyaç duyulduğunda kayıtların serileştirilmesi avantajına sahiptir.

+0

Teşekkür ederiz! Tam olarak aradığım şey bu! – FLoppix

+0

@DavidAnderson Karşıt olarak, iki hızlı (sık) akışa katılırken örnek farklı olabilir mi? Ne değiştirirsin? – Beckham