說明:本文爲《Flink大數據項目實戰》學習筆記,想經過視頻系統學習Flink這個最火爆的大數據計算框架的同窗,推薦學習課程:html
Flink大數據項目實戰:http://t.cn/EJtKhazjava
1.推薦開發工具git
idea+maven+gitgithub
2.推薦開發語言apache
Java或者Scala編程
https://ci.apache.org/projects/flink/flink-docs-release-1.6/quickstart/java_api_quickstart.htmlwindows
3.Flink項目構建步驟api
1)經過maven構建Flink項目架構
這裏咱們選擇構建1.6.2版本的Flink項目,打開終端輸入以下命令:框架
mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.6.2
項目構建過程當中須要輸入groupId,artifactId,version和package
而後輸入y確認
而後顯示Maven項目構建成功
2)打開IDEA導入Flink 構建的maven項目
打開IDEA開發工具,點擊open選項
選擇剛剛建立的Flink項目
IDEA打開Flink項目
新建一個batch package
打開github Flink源碼,將批處理WordCount代碼copy到batch包下。
打開批處理WordCount代碼:
右鍵選擇run,運行Flink批處理WordCount,運行結果以下所示:
一樣,流處理咱們也單首創建一個包stream
打開github Flink源碼,將流處理WordCount代碼copy到stream包下。
打開流處理WordCount代碼:
右鍵選擇run,運行Flink流處理WordCount,運行結果以下所示:
你們回顧一下Flink生態圈中的核心組件棧便可,前面已經詳細講過,這裏就再也不贅敘。
Flink一共分爲四個層級,具體以下圖所示:
Flink 最下面的一層API爲Stateful Stream Processing,它是Flink最底層的API,控制更靈活但通常不多使用。而後上面一層就是Flink Core(核心)API,它包含DataStream和DataSet API,應用層的用戶常常使用 Core API。而後再上面一層就是 Table API,它至關於在Core API中能夠定義數據的Table結構,能夠作table操做。最上面一層就是SQL 操做,用戶能夠直接使用SQL語句對數據處理,更簡單更方便。
注意:越底層的API越靈活,但越複雜。越上層的API越輕便,但靈活性差。
a)它位於最底層,是Core API 的底層實現。
b)它是嵌入到Stream流裏面的處理函數(processFunction)。
c)當Core API知足不了用戶需求,能夠利用低階API構建一些新的組件或者算子。
d)它雖然靈活性高,但開發比較複雜,須要具有必定的編碼能力。
a) DataSet API 是批處理API,處理有限的數據集。
b) DataStream API是流處理API,處理無限的數據集。
a)SQL 構建在Table 之上,都須要構建Table 環境。
b)不一樣的類型的Table 構建不一樣的Table 環境中。
c)Table 能夠與DataStream或者DataSet進行相互轉換。
d)Streaming SQL不一樣於存儲的SQL,最終會轉化爲流式執行計劃。
Flink DataFlow基本套路:先建立Data Source讀取數據,而後對數據進行轉化操做,而後建立DataSink對數據輸出。
結合代碼和示意圖理解DataFlow
Flink DataFlow 基本套路以下所示:
步驟1:構建計算環境(決定採用哪一種計算執行方式)
步驟2:建立Source(能夠多個數據源)
步驟3:對數據進行不一樣方式的轉換(提供了豐富的算子)
步驟4:對結果的數據進行Sink(能夠輸出到多個地方)
並行化DataFlow
從上圖能夠看出Source的並行度爲2,它們能夠並行運行在不一樣的節點上。Map的並行度也爲2,source讀取數據後作Stream Partition操做,source1將數據交給map1,source2將數據交給map2。keyBy(或者window等)的並行度爲2,map處理後的數據須要通過shuffle操做,而後交給keyBy進行分組統計。Sink的並行度爲1,keyBy最後分組統計後的數據交給sink,將數據進行輸出操做。
算子間數據傳遞模式
從上圖能夠看出,Flink算子間的數據傳遞模式大概分爲兩種:
1.One-to-one streams:保持元素的分區和順序,好比數據作map操做。
2.Redistributing streams: 它會改變流的分區,從新分區策略取決於使用的算子
keyBy() (re-partitions by hashing the key) :根據hash key對數據從新分區。
broadcast():即爲廣播操做,好比map1有100條數據,發送給keyBy1是100條數據,發給keyBy2也是100條數據。
rebalance() (which re-partitions randomly):即隨機打散,數據隨機分區發送給下游操做。
前面咱們已經瞭解了Flink的Stream流處理和Batch批處理,那麼咱們這裏講的Windows操做是對一段數據進行操做,它能夠按照固定數據量進行Windows操做,也能夠按照固定時間進行windows操做,它是Stream 流處理所特有的窗口操做。
Flink Windows操做的類型大概分爲如下幾類:
顧名思義,是按照Events的數量進行操做,好比每3個Event作一次windows操做。
基於時間長度進行Windows操做
a) Tumbling Windows:即翻滾窗口,不會重疊,好比每隔3s操做一次。
b) Sliding Windows:即滑動窗口,有重疊,好比窗口大小爲3s,每次向前滑動1s。
c) Session Windows:相似於Web編程裏的Session,以不活動間隙做爲窗口進行操做,好比每10s內沒有活動,就會作一次Windows操做。
當Flink內置的windows不能知足用戶的需求,咱們能夠自定義Windows操做。