標籤:操作 開源 sign create new start object job tar
新的一年,新的開始,新的習慣,現在開始。
1.簡介
Flink是德國一家公司名為dataArtisans的產品,2016年正式被apache提升為頂級項目(地位同spark、storm等開源架構)。並且在2016年裡,共發布了包括1.0.0版本在內的10個版本,發展速度可想而知。這次學習的是Flink的核心Feature,windows。
//dataArtisans官網:
http://data-artisans.com/
//apache Flink官網:
http://flink.apache.org/
2.windows 2.1 what Flink windows
人們處理資料通常把流式的資料轉換成批再對其進行處理比如一些累計統計。面對源源不斷的流,這種處理方式衍生出了一種新的名詞-windows。就是一個典型的windows操作。
2.2 why Flink windows
Flink提供了一套簡單易用並且靈活可擴充的windows介面,從視窗類別型可分為滑動視窗,固定視窗,會話視窗,從視窗性質可分為事件視窗,時間視窗。
2.3 how Flink windows
Flink的window分成三部分,按運行順序依次為 WindowAssigner,Trigger,Evictor。為官網提供的解釋
資料進來首先被windowAssigner分到不同的window,一個資料可以同時存在於多個window。每個window都有一個Trigger,用來判斷資料是應該purge還是evaluate。當資料被evaluate,會進入到Evictor(本人感覺類似於過濾器)。使用者可以在evaluate的時候自訂處理邏輯,類似於sum(),min(),max()之類的ReduceFunction
, FoldFunction
, or WindowFunction。
下面是代碼實戰
申明:所有運行環境基於Flink官方提供的Flink Quickstart Job 1.1.3。
val env = StreamExecutionEnvironment.getExecutionEnvironment // create streams for names and ages by mapping the inputs to the corresponding objects val text = env.socketTextStream("127.0.0.1", 12580) val counts = text.map {str=> val arr = str.split(",") (arr(0),arr(1).toInt) } .keyBy(0) .countWindow(3) .sum(1) counts.print() env.execute("Scala WordCount from SocketTextStream Example")
測試資料來源為socket,預設以\n作為stream的分隔字元,服務端發送的資料依次為:
a,1
a,2
b,1
b,1
a,3
b,1
最終程式結果如下:
(a,6)
(b,3)
這個案例基於Flink提供的原生事件countWindows,其中已經包括了windowAssigner,Trigger,Evictor
備忘:
必須匯入指定包,否則會找不到類
報錯:Error:(18, 27) could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[(String, Int)]
val counts = text.map {str=>
加入:import org.apache.flink.streaming.api.scala._
參考資料:
//apache官網介紹的quickstart
https://ci.apache.org/projects/flink/flink-docs-release-1.1/quickstart/scala_api_quickstart.html
//apache官網介紹的Flink windows
http://flink.apache.org/news/2015/12/04/Introducing-windows.html
基於Flink的windows--簡介