一、介紹
Apache Flink is an open source platform for distributed stream and batch data processing.
Flink’s core is a streaming dataflow engine that provides data distribution, communication, and fault tolerance for distributed computations over data streams.
Flink builds batch processing on top of the streaming engine, overlaying native iteration support, managed memory, and program optimization.
批處理與實時處理的優缺點
批處理,吞吐量大,但延時高。
實時處理,延時低,但吞吐量小。
以聊天做比喻,實時處理,來一條回一條,批處理,別人說十句,你最后一起回。
Flink的目標
- 低延遲
- 高吞吐
- 容錯率高,計算正確率高
流數據處理的應用場景
- 電商、市場營銷
- 數據報表
- 金融、銀行
- 實時監測異常行為
OLTP和OLAP
OLTP(on-line transaction processing)聯機事務處理,面向的是事務,處理幾條數據。
OLAP(on-line analytical processing)面向的是一堆數據的數據分析。
Ad-hoc
即席查詢,用戶根據自己的需求、靈活地選擇查詢條件,可以理解為需求不太明確的查詢,由用戶自定義的查詢。
流處理的演變
從起初單純的流處理,轉變為后來的流處理和批處理結合的lambda架構。
特點就是流處理的數據可能不准確,但延遲低,批處理的數據准確性高,但延遲高,將將兩者結合起來。
這就好比是兩個人做同一件事,一個人是慢性子做事非常仔細,另一個人是急性子,做事快。急性子的人提前把事情做好,例如得出100,200,300的結果。慢性子也去做同樣的事,得出100,250,300,等慢性子把事情做好,最終的結果就會由100,200,300,變為100,250,300。
第一性思考:本質就是優劣勢互補。
第三代流式處理,Flink,在lambda架構上又做了改進。
Flink整合了Storm與SparkStreaming的優點。SparkStreaming的邏輯是,將批拆分成更小的批處理,在保證低延時的情況下,還能保證高吞吐。
特點
-
事件驅動
-
基於流的世界觀,所有東西都是流,批就是有界的流,實時數據就是無界的流。而Spark呢,則是所有東西都是批,SparkStreaming處理的則是更小的批。
-
分層的API
架構
Apache Flink is a framework and distributed processing engine for stateful computations (狀態計算) over unbounded and bounded data streams.
Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.
lambda架構
將離線計算和實時計算結合在一起,發揮離線計算准確率高、實時計算響應速度快的優勢。缺點是,同一套邏輯要分別在兩個模式下實現,存在代碼冗余的問題。
Flink特點
(1)批流一體化
Flink中的思想是,一切都是流。離線計算是有界限的流,實時計算是無界限的流。
(2)事件驅動型應用
二、基本使用
WordCount
(1)引入依賴
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_2.11</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.11</artifactId>
<version>1.7.2</version>
</dependency>
(2)准備數據
hello kafka
hello bigdata
hello flink
hello hbase
hbase
kafka
(3)Flink批處理實現
package flink
import org.apache.flink.api.scala._
object wordcount {
def main(args: Array[String]): Unit = {
//創建一個執行環境
val env = ExecutionEnvironment.getExecutionEnvironment
val inputPath = "word.txt";
val inputDataSet = env.readTextFile(inputPath)
//切分數據,得到word
val wordCountDataSet = inputDataSet.flatMap(_.split(" "))
.map((_,1))
.groupBy(0)
.sum(1)
wordCountDataSet.print()
}
}
運行結果
(4)Flink流處理實現
/**
* 流式 WordCount程序
*/
object StreamWordCount {
def main(args: Array[String]): Unit = {
// 創建流處理的執行環境
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 創建一個文本socket
val dataStream = env.socketTextStream("localhost",7777)
val wordCountDataStream = dataStream.flatMap(_.split(" "))
.map((_,1))
.keyBy(0)
.sum(1)
wordCountDataStream.print()
// 啟動executor
env.execute("stream word count")
}
}
在終端使用nc -lk 7777
打開一個socket連接,運行程序,得到結果
參考文檔
Flink官方文檔
Flink 實時數倉的應用
Apache Flink 零基礎入門(一&二):基礎概念解析
企業級數據倉庫
大數據工程師 Flink技術與實戰