流處理是 Flink 的核心,流處理的數據集用 DataStream 表示。數據流從能夠從各類各樣的數據源中建立(消息隊列、Socket 和 文件等),通過 DataStream 的各類 transform 操做,最終輸出文件或者標準輸出。這個過程跟以前文章中介紹的 Flink 程序基本骨架同樣。本篇介紹 DataStream 相關的入門知識。java
爲了學習 Flink 的朋友能查看到每一個例子的源碼,我建立了一個 GitHub 項目:https://github.com/duma-repo/awesome-flink 這裏會存放每一篇文章比較重要的示例的源碼,目前支持 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 也內置了一些輸出函數,以下:socket
本篇文章主要介紹了 Flink Streaming 編程的基本骨架。詳細介紹了 Streaming 內置的 Data Source 和 DataSink 。下篇將繼續介紹 Flink Streaming 編程涉及的基本概念。ide
歡迎關注公衆號「渡碼」學習