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(精確一次)(可靠)的語義