流處理是 Flink 的核心,流處理的數據集用 DataStream 表示。數據流從能夠從各類各樣的數據源中建立(消息隊列、Socket 和 文件等),通過 DataStream 的各類 transform 操做,最終輸出文件或者標準輸出。這個過程跟以前文章中介紹的 Flink 程序基本骨架同樣。本篇介紹 DataStream 相關的入門知識。java
爲了學習 Flink 的朋友能查看到每一個例子的源碼,我建立了一個 GitHub 項目:github.com/duma-repo/a… 這裏會存放每一篇文章比較重要的示例的源碼,目前支持 Java 和 Scala,仍在不斷完善中。代碼下載後能夠在本地運行,也能夠打包放在集羣上運行。同時,歡迎各位將優質的資源提交到項目中。
git
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;
public class WindowWordCount {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Tuple2<String, Integer>> dataStream = env
.socketTextStream("localhost", 9999)
.flatMap(new Splitter())
.keyBy(0)
.timeWindow(Time.seconds(5))
.sum(1);
dataStream.print();
env.execute("Window WordCount");
}
public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception {
for (String word: sentence.split(" ")) {
out.collect(new Tuple2<String, Integer>(word, 1)); //空格分割後,每一個單詞轉換成 (word, 1) 二元組輸出
}
}
}
}複製代碼
這個例子跟之間介紹 WordCount 的例子相似,這裏詳細介紹下涉及的 API 和含義github
通過以上的介紹,咱們知道常見的數據源有 socket、消息隊列和文件等。對於常見的數據源 Flink 已經定義好了讀取函數,接下來一一介紹。apache
須要注意,在底層 Flink 將讀文件的過程分爲兩個子任務 —— 文件監控和數據讀取(reader)。監控任務由 1 個 task 實現,而讀取的任務由多個 task 實現,數量與 Job 的並行度相同。監控任務的做用是掃描輸入路徑(週期性或者只掃描一次,取決於 watchType),當數據能夠被處理時,會將數據分割成多個分片,將分片分配給下游的 reader 。一個分片只會被一個 reader 讀取,一個 reader 能夠讀取多個分片。編程
以前已經介紹了一些 transfrom 函數,如:map、flatMap 和 filter 等。同時還有窗口函數:window、timeWindow 等,聚合函數:sum、reduce 等。更多的 transform 函數以及使用將會單獨寫一篇文章介紹。api
Data Sink 即是數據的輸出。同 Data Source 相似, Flink 也內置了一些輸出函數,以下:bash
本篇文章主要介紹了 Flink Streaming 編程的基本骨架。詳細介紹了 Streaming 內置的 Data Source 和 DataSink 。下篇將繼續介紹 Flink Streaming 編程涉及的基本概念。socket
代碼地址: github.com/duma-repo/a…ide
歡迎關注公衆號「渡碼」函數