1. 程式人生 > 其它 >Flink中常用的運算元總結

Flink中常用的運算元總結

技術標籤:FlinkFlink運算元常用運算元總結

總結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資料集根據多個欄位進行分組。