水印的生成策略-內(nèi)置水印生成策略如何使用?
為了方便開發(fā),flink提供了一些內(nèi)置的水印生成方法供我們使用。
固定延遲生成水印
通過靜態(tài)方法forBoundedOutOfOrderness提供,入?yún)⒔邮找粋€Duration類型的時間間隔,也就是我們可以接受的最大的延遲時間.使用這種延遲策略的時候需要我們對數(shù)據(jù)的延遲時間有一個大概的預估判斷。
我們實現(xiàn)一個延遲3秒的固定延遲水印,可以這樣做:
他的底層使用的WatermarkGenerator接口的一個實現(xiàn)類BoundedOutOfOrdernessWatermarks。我們看下源碼中的這兩個方法:

單調(diào)遞增生成水印
周期性 watermark 生成方式的一個最簡單特例就是你給定的數(shù)據(jù)源中數(shù)據(jù)的時間戳升序出現(xiàn)。在這種情況下,當前時間戳就可以充當 watermark,因為后續(xù)到達數(shù)據(jù)的時間戳不會比當前的小。
注意:在 Flink 應用程序中,如果是并行數(shù)據(jù)源,則只要求并行數(shù)據(jù)源中的每個單分區(qū)數(shù)據(jù)源任務時間戳遞增。例如,設置每一個并行數(shù)據(jù)源實例都只讀取一個 Kafka 分區(qū),則時間戳只需在每個 Kafka 分區(qū)內(nèi)遞增即可。Flink 的 watermark 合并機制會在并行數(shù)據(jù)流進行分發(fā)(shuffle)、聯(lián)合(union)、連接(connect)或合并(merge)時生成正確的 watermark
通過靜態(tài)方法forMonotonousTimestamps來提供.
這個也就是相當于上述的延遲策略去掉了延遲時間,以event中的時間戳充當了水印。
在程序中可以這樣使用:
它的底層實現(xiàn)是AscendingTimestampsWatermarks,其實它就是BoundedOutOfOrdernessWatermarks類的一個子類,沒有了延遲時間,我們來看看具體源碼的實現(xiàn).

