數據架構設計領域發生了重大的變化,基於流的處理是變化的核心。
分布式文件系統用來存儲不經常更新的數據,他們也是大規模批量計算所以來的數據存儲方式。
批處理架構(lambda架構)實現計數的方式:持續攝取數據的管道(flume)每小時創建一個文件,由調度程序安排批處理作業分析最近生成的文件,然后輸出計數結果。
該架構缺點:1.組件多,設計管道、調度、作業程序,學習成本、管理成本大 2.修改分析時間周期不方便,涉及工作流調度邏輯 3.實現計數預警功能需要引入流處理系統,流處理做近似計算,批處理做准確計數。4.事件可能是亂序的,上一批事件可能混入當前批次。
5.事件窗口是短板,不靈活。例如不能滿足登錄登出計數的需求。
flink可以同時滿足計數和預警的功能,flink速度減慢只會導致數據在傳輸系統如kafka中堆積。
flink以時間為單位把事件流分割為一個個任務(稱為窗口)。
由固定時間分組改為根據事件產生的時間分組,只需要在flink中修改時間窗口的定義即可。
如果flink的代碼有改動,只需要重播kafka主題。
和lambda架構相比,flink不需要以時間為單位生成額外的文件,同時時間的定義被代碼明確定義。而不是攝取,調度,計算扯不清。
時間的概念:事件時間(時間發生的時候),處理時間(事件被處理的時間),攝入時間(進入流處理系統的時間)。很多情況下事件時間和處理時間是不一致的,即事件以亂序的方式進入系統。
有些需求要求盡快處理得到結果,即使有小的誤差也無所謂,這種場景適合采用處理時間。
有些需求要求只是統計特定時間發生的事件,這種場景適合采用事件時間。
flink支持的窗口:
時間窗口:flink支持2種時間窗口:滾動時間窗口(沒周期),滑動時間窗口(每周期,滑動步長值)
計數窗口:分組依據不再是時間窗口,而是根據元素的數量。同時也支持滾動和滑動2種方式。計數窗口需要謹慎使用,場景如下:假設事件窗口大小是100,達到90后事件停止,則窗口永遠不能關閉,該窗口占用的內存也浪費了。一種解決方式是通過超時觸發。
會話窗口:會話窗口是指活動階段,其前后都有非活動階段。在flink種,會話窗口由超時時間決定,即希望多久認為會話已經結束。
觸發器:觸發器控制生成結果的時間,即核實聚合窗口內容並返回給用戶。(收到水印觸發,自定義觸發*1秒1次*)
編程模型:
maven:mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.6.0 -DgroupId=com.test -DartifactId=flink -Dversion=1.0.0 -Dpackage=com.test -DinteractiveMode=false