Flink中常用的運算元總結
阿新 • • 發佈:2020-12-27
總結flink中常用的運算元
1. keyBy
keyBy有兩個主要的應用,資料分發(處理資料傾斜、平衡資料),上下游運算元非同步處理
1.1 資料分發
這個運算元作為一個數據分發策略【分發還有還有的策略,例如:reblance(輪詢),partitionCustom(自定義)】,
keyBy是根據key的hashcode對分割槽數取模,根據某個欄位作為key進行分組,key相同的會被分到一起,如下圖示例,相同顏色的正方形分配到一起。
當DataStream的並行分割槽中資料發生傾斜時,我們會想要在這些分割槽中,重新平衡這些資料。這時我們可以通過一種方式來實現,使所有task會收到相同的資料。可以使用的分割槽策略有:
- keyBy,根據key的hashCode對分割槽數取模(hashCode%partitionNum,產生的是keyedStream)
- shuffle分割槽策略(random,產生的還是dataStream)
- rebalance分割槽策略(Round-Robin<詢排程>,產生的還是dataStream)
- resclae,和rebalance類似,只是做了更細粒度的劃分
1.2 非同步處理
在DataStream中,經過keyBy後悔程式設計KeyedStream,這時會將被KeyBy分割的上下游運算元 非同步計算。具體示例請參考這篇文章
1.3 參考資料
https://www.jianshu.com/p/944ed619891d
https://blog.csdn.net/yanshien840826/article/details/111693206
https://www.pianshen.com/article/26011190679/
2. sum運算元
獲取一組資料流中的數值之和,如下wordcount程式碼示例
// scala //flink streaming wordcount demo val data = senv.fromElements("hello defu", "hello hadoop", "hello flink") data.flatMap(line => line.split("\\s")) .map(w => (w, 1)) .keyBy(0) .sum(1) //這計算下標index是1那一列的sum總和 .print senv.execute()
3. groupBy
groupBy運算元是DataSet類中的一個方法,意思是
Groups a {@link Tuple} {@link DataSet} using field position keys.
即groupBy(int...fieldPosition)的引數值是Tuple的元素位置 0 、1、2等,即Tuple中Field position。
相當於資料庫中的groupby,即對DataSet資料集根據多個欄位進行分組。