新的一年,新的开始,新的习惯,现在开始。
1.简介
Flink是德国一家公司名为dataArtisans的产品,2016年正式被apache提升为顶级项目(地位同spark、storm等开源架构)。并且在2016年里,共发布了包括1.0.0版本在内的10个版本,发展速度可想而知。这次学习的是Flink的核心Feature,windows。
//dataArtisans官网:
//apache Flink官网:
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