flink為一條資料從產生到處理輸出整個過程定義了三個比較特殊的時間點分別是eventtime、ingestiontime、windowprocessingtime。
所謂的資料遲到是相對於eventtime來說的。例如:感測器在09:00,09:05,09:10分別產生一條資料。09:00和09:10資料先後到達flink而09:05的資料由於網路延遲在9:10的資料到達之後才到,那麼09:05的資料就是遲到資料。
那麼,對於遲到的資料flink是如何處理的呢?那就是watermark(水位線)。
在flink的流式處理中,絕大部分的業務都會使用eventtime,一般只在eventtime無法使用時,才會被迫使用processingtime或者ingestiontime。
streamexecutionenvironment env = streamexecutionenvironment.
getexecutionenvironment()
;//引入eventtime
env.
setstreamtimecharacteristic
(timecharacteristic.eventtime)
;
因為在真實情況下資料是會出現遲到狀況的,為了處理這種遲到的資料flink提供了watermark(水位線)。
watermark其實是一種觸發視窗(window)關閉的機制。所以,watermark一般是與window一起使用的。
比如:第乙個視窗是0–5秒,第二個視窗是6–10秒,watermark設定延遲時間為2秒,那麼在第七秒的資料到達時正好觸發第乙個視窗關閉。
這是flink為我們提供的自定義eventtime欄位和設定水位線的方法。
inputdata.
flatmap
(new
myspliter()
).assigntimestampsandwatermarks
(watermarkstrategy.
forboundedoutoforderness
(duration.
ofseconds(2
)).withtimestampassigner
((event,timestamp)
->long.
parselong
(event.
gettimestamp())))
下面的**為我們指定了自定義資料的eventtime,也定義了水位線。
inputdata.
flatmap
(new
myspliter()
).assigntimestampsandwatermarks
(new
watermarkstrategy
()@override
public
void
onperiodicemit
(watermarkoutput output)};}})
有**中我們可以看出我們取sensor的timestamp欄位做為eventtime。maxtimestamp等於最晚一條資料的eventtime,而watermark=maxtimestamp-delay,只有watermark晚於當前未執行視窗的停止時間時視窗才會執行。
已前面的例子來說,如果第六秒的資料到了之後第七秒的資料一直沒來那麼watermark=6-2=4,早於第5秒,所以第乙個視窗就一直不會關閉/執行。
watermark的生成是週期性的,預設是200毫秒更新一次,如果新的watermark大於老的watermark,直接更新watermark。反之則不更新。這樣可以保證watermark是一直遞增的。
我們可以通過以下方法修改watermark的更新頻率
streamexecutionenvironment env = streamexecutionenvironment.
getexecutionenvironment()
;env.
setstreamtimecharacteristic
(timecharacteristic.eventtime)
;//每隔5秒更新一次watermark
env.
getconfig()
.setautowatermarkinterval
(5000);
env.
setparallelism(1
);
我們也可以只對特定的資料使用watermark,**如下
inputdata.
flatmap
(new
myspliter()
).assigntimestampsandwatermarks
(new
assignerwithpunctuatedwatermarks
()@nullable
@override
public watermark checkandgetnextwatermark
(sensor sensor,
long l)
else}}
)
Flink時間語義
指的是資料流中每個元素或者每個事件自帶的時間屬性,一般是事件發生的時間 由於延遲有可能乙個較早完成的事件晚一些到達,在開窗的時候我們不可能一直等待視窗內應該到達的所有資料 在實際應用中,當涉及到對事件按照時間視窗進行統計時,flink會將視窗內的事件快取下來,直到接受到乙個watermark 如何使...
值語義與物件語義
值語義 value sematics 指的是物件的拷貝與原物件無關,就像拷貝int一樣。c 的內建型別 bool int double char 都是值語義,標準庫里的complex pair vector map string等等型別也都是值語義,拷貝之後就與原物件脫離關係。物件語義 object...
C 之值語義與物件語義
iostream擴充套件 include 是不是太重量級了?class date void writeto std ostream os const private int year month day std ostream operator std ostream os,const date d...