天天看點

(20) flink有狀态的算子和應用程式

文章目錄

      • 算子狀态(operator state)
      • 鍵控狀态(Keyed State)

Flink内置的很多算子,資料源source,資料存儲sink都是有狀态的,流中的資料都是buffer records,會儲存一定的元素或者中繼資料。例如: ProcessWindowFunction會緩存輸入流的資料,ProcessFunction會儲存設定的定時器資訊等等。

在Flink中,狀态始終與特定算子相關聯。總的來說,有兩種類型的狀态:

1. 算子狀态(operator state)

2. 鍵控狀态(keyed state)

算子狀态的作用範圍限定為算子任務。這意味着由同一并行任務所處理的所有資料都可以通路到相同的狀态,狀态對于同一任務而言是共享的。算子狀态不能由相同或不同算子的另一個任務通路。

(20) flink有狀态的算子和應用程式

Flink為算子狀态提供三種基本資料結構:

清單狀态(List state): 将狀态表示為一組資料的清單。

聯合清單狀态(Union list state): 也将狀态表示為資料的清單。它與正常清單狀态的差別在于,在發生故障時,或者從儲存點(savepoint)啟動應用程式時如何恢複。

廣播狀态(Broadcast state): 如果一個算子有多項任務,而它的每項任務狀态又都相同,那麼這種特殊情況最适合應用廣播狀态。在儲存檢查點和重新調整算子并行度時,會用到這個特性

鍵控狀态是根據輸入資料流中定義的鍵(key)來維護和通路的。Flink為每個鍵值維護一個狀态執行個體,并将具有相同鍵的所有資料,都分區到同一個算子任務中,這個任務會維護和處理這個key對應的狀态。當任務處理一條資料時,它會自動将狀态的通路範圍限定為目前資料的key。是以,具有相同key的所有資料都會通路相同的狀态。Keyed State很類似于一個分布式的key-value map資料結構,隻能用于KeyedStream(keyBy算子處理之後)

(20) flink有狀态的算子和應用程式

Flink的Keyed State支援以下資料類型:

ValueState[T]儲存單個的值,值的類型為T。

get操作: ValueState.value()

set操作: ValueState.update(value: T)

ListState[T]儲存一個清單,清單裡的元素的資料類型為T。基本操作如下:

ListState.add(value: T)

ListState.addAll(values: java.util.List[T])

ListState.get()傳回Iterable[T]

ListState.update(values: java.util.List[T])

MapState[K, V]儲存Key-Value對。