DataStream與DataSet

DataStream與DataSet

Flink具有特殊類DataStream與DataSet,這兩者是flink中主要的數據源,根據數據源可分爲有界源和無界源,而DataStream則是無界源,DataSet是有界源,也就是說DataStream常用於流處理,而DataSet用於批處理。


DataStream API

  • DataStream Sources(數據來源)
  • DataStream Transformations(數據轉化)
  • DataStream Sinks(數據的目的地)

DataStream Sources(數據來源)

大多實際應用環境都以自定義數據源爲主,常常從kafka中讀取數據,flink官方也有專門的kafka連接器提供

  • 基於文件
  • 基於Socket
  • 基於集合
  • 自定義

DataStream Transformations(數據轉化)

官方提供許多處理的方法

  • map:輸入一個數據,返回一個數據,中間可做相關處理
DataStream<Integer> dataStream = //...
dataStream.map(new MapFunction<Integer, Integer>() {
    @Override
    public Integer map(Integer value) throws Exception {
        return 2 * value;
    }
});
  • flatmap:輸入一個數據,返回零個、一個、多個數據,中間可做相關處理
dataStream.flatMap(new FlatMapFunction<String, String>() {
    @Override
    public void flatMap(String value, Collector<String> out)
        throws Exception {
        for(String word: value.split(" ")){
            out.collect(word);
        }
    }
});
  • filter:對數據進行過濾
dataStream.filter(new FilterFunction<Integer>() {
    @Override
    public boolean filter(Integer value) throws Exception {
        return value != 0;
    }
});
  • keyBy:根據指定的key進行分區

注意:以下類型無法作爲key

1、即使它是pojo類型,但不覆蓋hashcode方法並依賴於Object.hashcode()方法

2、它是任何類型的數組

dataStream.keyBy("someKey") // Key by field "someKey"
dataStream.keyBy(0) // Key by the first element of a Tuple(指定tuple中的第一個元素作爲分組key)

等等具體可查閱官方文檔:https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/stream/operators/index.html

DataStream Sinks(數據的目的地)

Sink將處理後的數據轉發到文件、sockets、外部系統(如kafka、redis)、print()打印,flink有許多已經封裝好的內置方法。在實際應用中經常使用addSink自定義將數據輸出到外部系統

  • writeAsText():按字符串順序寫入,這些字符串通過調用每個元素的toString()方法來獲取
  • writeAsCsv(…):將元組寫爲逗號分隔值文件。行和字段分隔符是可配置的
  • print()/printToErr(): 打印每個元素的toString()方法
  • writeUsingOutputFormat():自定義文件輸出的方法和基類,支持自定義對象到字節的轉換。
  • writeToSocket:根據SerializationSchema寫入元素到socket
  • addSink:自定義輸出,如kafka、redis

注意:write*()方法主要是用於調試的目的,它們並沒有參與flink的checkpoint,這就意味着這些函數是at-least-once(至少一次)的語義,通過addSink()方法的自定義可以實現flink的exactly-once(精確一次)(可靠)的語義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章