flink学习笔记
1)flink datastream封装了一些输入流的api
2)flink datastream 自定义一些source (无并行度和有并行度的)https://blog.csdn.net/hongzhen91/article/details/90055041
3)算子:https://blog.csdn.net/hongzhen91/article/details/90056602
var env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
import org.apache.flink.api.scala._
val stream=env.fromCollection(List(
SensorReading("1",13423223,35.6),
SensorReading("2",222222,23.4),
SensorReading("3",33333333,34.5),
SensorReading("3",33333333,32.5)
))
// stream.keyBy(0).sum(2).print()
//reduce输出当前传感器最新的温度+10,而时间戳就是上一次数据的时间+1
stream.keyBy("id").reduce((x,y)=>SensorReading(x.id,x.timestamp+1,y.temperature+10 ))//.print()
//SensorReading(1,13423223,35.6)SensorReading(2,222222,23.4)SensorReading(3,33333333,34.5)SensorReading(3,33333333,67.0)
//一条一条处理
//split和select使用
val splitStream=stream.split(data=>{
if(data.temperature>30) Seq("high") else Seq("low")
})
var high: DataStream[SensorReading] = splitStream.select("high")
var low: DataStream[SensorReading] = splitStream.select("low")
var all: DataStream[SensorReading] = splitStream.select("high","low")
//connect和CoMap(合并两条流)(connect只能合并两个,但是两个的数据结构可以不同)
val waring: DataStream[(String, Double)] = high.map(data=>(data.id,data.temperature))
val connectedStreams: ConnectedStreams[(String, Double), SensorReading] = waring.connect(low)
val coMapDataStream=connectedStreams.map(
waringData => (waringData._1,waringData._2,"waring" ),
lowData =>(lowData.id,"healthy")
)
//union(合并的数据结构必须一样,可以合并两个或者多个)
env.execute(this.getClass.getName)
4)窗口操作(窗口就是将无限流切割为有限流的一种方式,它会将流数据分发到有限大小的桶中进行分析)
时间窗口:滚动时间窗口(将数据依据固定的窗口长度进行切分,无重叠),滑动时间窗口(有重叠),会话窗口(一段时间内没有接收到新数据就会生成新的窗口)
计数窗口:滚动计数窗口,滑动计数窗口
5)窗口函数定义了要对窗口中收集的数据做的计算操作,分为两类:
增量聚合函数:每条数据到来就进行计算,保持一个简单地状态 (ReduceFunction,AggregateFunction)
全窗口函数:先把窗口所有数据收集起来,等到计算的时候会遍历所有数据(ProcessWindowFunction)
6)时间语义:
【1】Event Time:事件创建的时间
【2】Ingestion Time:数据进入Flink的时间
【3】Processing Time:执行操作算子的本地系统时间,与机器相关
7)watermark
AssignerWithPeriodicWatermarks
周期性的生成watermark;系统会周期性的将watermark插入到流中,默认周期是200毫秒
AssignerWithPunctuatedWatermarks
没有时间周期规律,可打断的生成watermark