有狀態(tài)函數(shù)和操作符在單個(gè)元素/事件的處理過(guò)程中存儲(chǔ)數(shù)據(jù),使?fàn)顟B(tài)成為任何類(lèi)型的復(fù)雜操作的關(guān)鍵構(gòu)件。
例如:
- 當(dāng)應(yīng)用程序搜索某些事件模式時(shí),狀態(tài)將存儲(chǔ)到目前為止所遇到的事件列表。
- 當(dāng)按分鐘/小時(shí)/天聚合事件時(shí),狀態(tài)持有這期間的聚合。
- 當(dāng)通過(guò)數(shù)據(jù)點(diǎn)流訓(xùn)練機(jī)器學(xué)習(xí)模型時(shí),狀態(tài)保存模型參數(shù)的當(dāng)前版本。
- 當(dāng)需要管理歷史數(shù)據(jù)時(shí),狀態(tài)允許對(duì)發(fā)生在過(guò)去的事件進(jìn)行有效的訪問(wèn)。
Flink需要了解狀態(tài),以便使用Checkpoint進(jìn)行容錯(cuò),并允許流應(yīng)用程序進(jìn)行savepoint。
關(guān)于狀態(tài)的知識(shí)還允許重新定義Flink應(yīng)用程序,這意味著Flink負(fù)責(zé)跨并行實(shí)例重新分配狀態(tài)。
Flink的 可查詢狀態(tài) 特性允許在運(yùn)行時(shí),從Flink外部訪問(wèn)狀態(tài)。
當(dāng)使用狀態(tài)時(shí),閱讀Flink的狀態(tài)后端也是很有用的。Flink提供了不同的狀態(tài)后的,它們有特定的存儲(chǔ)方式和位置。狀態(tài)可以位于Java堆內(nèi)或堆外。根據(jù)您的狀態(tài)后端,F(xiàn)link還可以管理應(yīng)用程序的狀態(tài),這意味著Flink處理內(nèi)存管理(如果必要的話可能會(huì)溢出到磁盤(pán)),從而允許應(yīng)用程序保持非常大的狀態(tài)。可以在不改變應(yīng)用程序邏輯的情況下配置狀態(tài)后端。