Flink處理函式實戰之一:深入瞭解ProcessFunction的狀態(Flink-1.10)
阿新 • • 發佈:2020-11-19
### 歡迎訪問我的GitHub
[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos)
內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;
### 歡迎訪問我的GitHub
> 這裡分類和彙總了欣宸的全部原創(含配套原始碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos)
### Flink處理函式實戰系列連結
1. [深入瞭解ProcessFunction的狀態操作(Flink-1.10)](https://blog.csdn.net/boling_cavalry/article/details/106040312);
2. [ProcessFunction](https://xinchen.blog.csdn.net/article/details/106299035);
3. [KeyedProcessFunction類](https://xinchen.blog.csdn.net/article/details/106299167);
4. [ProcessAllWindowFunction(視窗處理)](https://xinchen.blog.csdn.net/article/details/106453229);
5. [CoProcessFunction(雙流處理)](https://xinchen.blog.csdn.net/article/details/109614001);
### 關於ProcessFunction狀態的疑惑
學習Flink的ProcessFunction過程中,官方文件中涉及狀態處理的時候,不止一次提到只適用於keyed stream的元素,如下圖紅框所示:
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201119093516199-170105492.png)
之前寫過一些flink應用,keyed stream常用但不是必須用的,所以產生了疑問:
1. 為何只有keyed stream的元素能讀寫狀態?
2. 每個key對應的狀態是如何操作的?
### Flink的"狀態"
先去回顧Flink"狀態"的知識點:
1. 官方文件說就兩種狀態:keyed state和operator state:
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201119093516766-1230275812.png)
2. 如上圖,keyed stream的元素是具有key的特徵,與ProcessFunction的操作狀態時要求匹配,其他steam的元素由於沒有key的特徵,所以也就沒有狀態一說了;
3. 另一種狀態是Operator State,如下圖,這是和多並行度計算時的運算元例項繫結的,例如當前運算元消費kafka的某個分割槽的最新offset,而ProcessFunction是用來處理stream元素的,不會涉及到Operator State:
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202011/485422-20201119093517256-54642864.png)
### 官方demo
為了學習ProcessFunction就去看官方demo,地址是:https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/stream/operators/process_function.html ,簡單說說這個demo的功能:
1. 資料來源在不間斷的產生單詞,每個單詞對應一