有關(guān)窗口操作的不同類型,可以分為如下幾種:傾斜窗口(Tumbling Windows,記錄沒有重疊)、滑動(dòng)窗口(Slide Windows,記錄有重疊)、會(huì)話窗口(Session Windows),具體可以查閱相關(guān)資料。
在處理Stream中的記錄時(shí),記錄中通常會(huì)包含各種典型的時(shí)間字段,F(xiàn)link支持多種時(shí)間的處理,如下圖所示:

flink-event-ingestion-processing-time
上圖描述了在基于Flink的流處理系統(tǒng)中,各種不同的時(shí)間所處的位置和含義,其中,Event Time表示事件創(chuàng)建時(shí)間,Ingestion Time表示事件進(jìn)入到Flink Dataflow的時(shí)間 ,Processing Time表示某個(gè)Operator對事件進(jìn)行處理事的本地系統(tǒng)時(shí)間(是在TaskManager節(jié)點(diǎn)上)。這里,談一下基于Event Time進(jìn)行處理的問題,通常根據(jù)Event Time會(huì)給整個(gè)Streaming應(yīng)用帶來一定的延遲性,因?yàn)樵谝粋€(gè)基于事件的處理系統(tǒng)中,進(jìn)入系統(tǒng)的事件可能會(huì)基于Event Time而發(fā)生亂序現(xiàn)象,比如事件來源于外部的多個(gè)系統(tǒng),為了增強(qiáng)事件處理吞吐量會(huì)將輸入的多個(gè)Stream進(jìn)行自然分區(qū),每個(gè)Stream分區(qū)內(nèi)部有序,但是要保證全局有序必須同時(shí)兼顧多個(gè)Stream分區(qū)的處理,設(shè)置一定的時(shí)間窗口進(jìn)行暫存數(shù)據(jù),當(dāng)多個(gè)Stream分區(qū)基于Event Time排列對齊后才能進(jìn)行延遲處理。所以,設(shè)置的暫存數(shù)據(jù)記錄的時(shí)間窗口越長,處理性能越差,甚至嚴(yán)重影響Stream處理的實(shí)時(shí)性。
有關(guān)基于時(shí)間的Streaming處理,可以參考官方文檔,在Flink中借鑒了Google使用的WaterMark實(shí)現(xiàn)方式,可以查閱相關(guān)資料。
基本架構(gòu)
Flink系統(tǒng)的架構(gòu)與Spark類似,是一個(gè)基于Master-Slave風(fēng)格的架構(gòu),如下圖所示:

flink-system-architecture
Flink集群啟動(dòng)時(shí),會(huì)啟動(dòng)一個(gè)JobManager進(jìn)程、至少一個(gè)TaskManager進(jìn)程。在Local模式下,會(huì)在同一個(gè)JVM內(nèi)部啟動(dòng)一個(gè)JobManager進(jìn)程和TaskManager進(jìn)程。當(dāng)Flink程序提交后,會(huì)創(chuàng)建一個(gè)Client來進(jìn)行預(yù)處理,并轉(zhuǎn)換為一個(gè)并行數(shù)據(jù)流,這是對應(yīng)著一個(gè)Flink Job,從而可以被JobManager和TaskManager執(zhí)行。在實(shí)現(xiàn)上,F(xiàn)link基于Actor實(shí)現(xiàn)了JobManager和TaskManager,所以JobManager與TaskManager之間的信息交換,都是通過事件的方式來進(jìn)行處理。
如上圖所示,F(xiàn)link系統(tǒng)主要包含如下3個(gè)主要的進(jìn)程:
JobManager
JobManager是Flink系統(tǒng)的協(xié)調(diào)者,它負(fù)責(zé)接收Flink Job,調(diào)度組成Job的多個(gè)Task的執(zhí)行。同時(shí),JobManager還負(fù)責(zé)收集Job的狀態(tài)信息,并管理Flink集群中從節(jié)點(diǎn)TaskManager。JobManager所負(fù)責(zé)的各項(xiàng)管理功能,它接收到并處理的事件主要包括:
RegisterTaskManager
在Flink集群啟動(dòng)的時(shí)候,TaskManager會(huì)向JobManager注冊,如果注冊成功,則JobManager會(huì)向TaskManager回復(fù)消息AcknowledgeRegistration。
SubmitJob
Flink程序內(nèi)部通過Client向JobManager提交Flink Job,其中在消息SubmitJob中以JobGraph形式描述了Job的基本信息。
CancelJob
請求取消一個(gè)Flink Job的執(zhí)行,CancelJob消息中包含了Job的ID,如果成功則返回消息CancellationSuccess,失敗則返回消息CancellationFailure。
UpdateTaskExecutionState
TaskManager會(huì)向JobManager請求更新ExecutionGraph中的ExecutionVertex的狀態(tài)信息,更新成功則返回true。
RequestNextInputSplit
運(yùn)行在TaskManager上面的Task,請求獲取下一個(gè)要處理的輸入Split,成功則返回NextInputSplit。
JobStatusChanged
ExecutionGraph向JobManager發(fā)送該消息,用來表示Flink Job的狀態(tài)發(fā)生的變化,例如:RUNNING、CANCELING、FINISHED等。
TaskManager
TaskManager也是一個(gè)Actor,它是實(shí)際負(fù)責(zé)執(zhí)行計(jì)算的Worker,在其上執(zhí)行Flink Job的一組Task。每個(gè)TaskManager負(fù)責(zé)管理其所在節(jié)點(diǎn)上的資源信息,如內(nèi)存、磁盤、網(wǎng)絡(luò),在啟動(dòng)的時(shí)候?qū)①Y源的狀態(tài)向JobManager匯報(bào)。TaskManager端可以分成兩個(gè)階段:
注冊階段
TaskManager會(huì)向JobManager注冊,發(fā)送RegisterTaskManager消息,等待JobManager返回AcknowledgeRegistration,然后TaskManager就可以進(jìn)行初始化過程。
可操作階段
該階段TaskManager可以接收并處理與Task有關(guān)的消息,如SubmitTask、CancelTask、FailTask。如果TaskManager無法連接到JobManager,這是TaskManager就失去了與JobManager的聯(lián)系,會(huì)自動(dòng)進(jìn)入“注冊階段”,只有完成注冊才能繼續(xù)處理Task相關(guān)的消息。