1、Flink介紹
1.1 Flink是什麼
Apache官網:
https://flink.apache.org/
Apache Flink® - Stateful Computations over Data Streams 數據流上的有狀態計算
Apache Flink是一個框架和分佈式處理引擎,用於在無界和有界數據流上進行有狀態計算。Flink被設計用於在所有常見的集羣環境中運行,以內存中的速度和任何規模執行計算。
無界:數據流源源不斷的,有開頭,沒有結束
有界:其實就相當於一個批處理,有開頭,有結束
和Spark一樣也支持批處理和流處理
Spark的實時處理:其實是一個小的迷你Batch,Stream是他的特例
Flink的實時處理:剛好和Spark想法,Flink是實時Stream的,Batch是Stream的特例
所有流式用例:
事件驅動的應用程序
流和批分析
數據管道和ETL
保證正確性:
只有一次狀態的一致性
事件時間處理
複雜的後期數據處理
APIs:
SQL on Stream & Batch Data
DataStream API & DataSet API
ProcessFunction (Time & State)
1.2 Flink部署在什麼地方
Flink集成了所有常見的集羣資源管理器,如Hadoop紗線、Apache Mesos和Kubernetes,但也可以設置爲作爲獨立集羣運行。Flink集成了所有常見的集羣資源管理器,如Hadoop YARN、Apache Mesos和Kubernetes,也可以設置爲stand-alone運行。
1.3 Flink編程模型
- 最低級別抽象只提供有狀態流。它通過Process函數嵌入到DataStream API中。它允許用戶自由處理來自一個或多個流的事件,並使用一致的容錯狀態。此外,用戶可以註冊事件時間和處理時間回調,允許程序實現複雜的計算。
- 實際上,大多數應用程序不需要上面描述的低層抽象,而是根據核心API (DataStream API(有界/無界流)和DataSet API(有界數據集)進行編程。這些連貫api爲數據處理提供了常見的構建塊,比如用戶指定的各種形式的transformations, joins, aggregations, windows, state等。在這些api中處理的數據類型用各自的編程語言表示爲類。
- 表API是一個以表爲中心的聲明性DSL,表可以(在表示流時)動態地更改表。表API遵循(擴展的)關係模型:表有一個附加的模式(類似於關係數據庫中的表),而API提供了類似的操作,如select、project、join、group-by、aggregate等。表API程序聲明性地定義應該執行什麼邏輯操作,而不是確切地指定操作代碼的外觀。雖然表API可以通過各種類型的用戶定義函數進行擴展,但是它比核心API更缺乏表現力,但是使用起來更簡潔(編寫的代碼更少)。此外,表API程序還需要經過一個在執行之前應用優化規則的優化器。
可以在表和DataStream/DataSet之間無縫轉換,允許程序混合表API和DataStream和DataSet API。 - Flink提供的最高級抽象是SQL。這種抽象在語義和表達性上都類似於表API,但將程序表示爲SQL查詢表達式。SQL抽象與表API緊密交互,SQL查詢可以在表API中定義的表上執行。
1.4 程序和數據流
Flink程序的基本構建塊是流和轉換
Spark:input–>transformation–>action–>output
Flink:source–>transformation–>transformation–>sink
Parallel Dataflows並行數據流
Windows窗口
Time時間
Event Time:是創建事件的時間。
Ingestion time:是事件在進入Flink數據流的時間。
Processing Time:是每個執行的時間。
2、Flink搭建
選擇和hadoop對應的版本,我這裏是hadoop2.6的
3、Maven依賴,寫第一個Flink程序WC
IDEA的pom.xml
<flink.version>1.6.4</flink.version>
<scala.binary.version>2.11</scala.binary.version>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-scala_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
package com.ruozedata.flink
import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.windowing.time.Time
object FlinkSocketWCApp {
def main(args: Array[String]): Unit = {
//create ENV
val env=StreamExecutionEnvironment.getExecutionEnvironment
//source
val lines=env.socketTextStream("192.168.137.130",9999)
//transformation
val results=lines.flatMap(x=>x.split(","))
.map(x=>WC(x,1))
.keyBy("word")
.timeWindow(Time.seconds(4),Time.seconds(2))
.sum("count")
//sink
results.print().setParallelism(1)
//stop
env.execute("FlinkSocketWCApp")
}
case class WC(word:String,count:Long)
}
開啓nc
[hadoop@vm01 software]$ nc -lk 9999
a,a,a,a
b,b,b,b
c,c,c,c
開啓Flink程序