Flink精进交流群,加微信:zoomake1024,备注“进群”。
01
窗口函数:窗口函数windows function分为两类。ReduceFunction、AggregateFunction:增量聚合函数,每条数据到来就进行计算,保持一个简单的状态,效率高。FoldFunction:官方已经不建议用 Fold 了,使用 aggregate 来代替。ProcessWindowFunction:在调用函数之前在内部缓冲窗口中的所有元素,窗口中全量元素的迭代器,效率不高。不过ProcessWindowFunction可以跟其他的窗口函数结合使用,其他函数接受增量信息,ProcessWindowFunction接受窗口的元数据。混合使用代码参考:https://www.jianshu.com/p/a883262241ef02
02 03 04
水位线watermark:watermark是衡量EventTime进展的机制,用来处理实时数据中的乱序问题,具体计算:watermark = 进入Flink窗口的最大的事件时间(maxEventTime) — 指定的延迟时间(t)水位线分配器Flink提供了统一的DataStream.assignTimestampsAndWatermarks()方法来提取事件时间并同时产生水印,毕竟它们在处理过程中是紧密联系的。assignTimestampsAndWatermarks()方法接受的参数类型有AssignerWithPeriodicWatermarks和AssignerWithPunctuatedWatermarks两种,分别对应周期性和定点水位线。①定点水位线,不是太常用,主要为输入流中包含一些用于指示系统进度的特殊元组和标记,方便根据输入元素生成水位线的场景使用的,在TPS很高的场景下会产生大量的Watermark在一定程度上对下游算子造成压力,所以只有在实时性要求非常高的场景才会选择。②周期性,比较常用,默认周期是200ms,可通过setAutoWatermarkInterval(1000)设置,需要实现接口:AssignerWithPeriodicWatermarks。需要通过实现extractTimestamp()方法来提取事件时间,实现getCurrentWatermark()方法产生水印,Flink已经提供了3种内置的实现类。周期性水位线有如下三种实现:a.AscendingTimestampExtractor,产生的时间戳和水印必须是单调非递减的,单调递增的事件时间并不太符合实际情况,所以用得不多。b.BoundedOutOfOrdernessTimestampExtractor,产生的时间戳和水印是允许“有界乱序”的,用得非常多。c.IngestionTimeExtractor,这个是当指定时间特性为IngestionTime时,直接生成时间戳和获取水印。https://www.jianshu.com/p/c612e95a5028https://blog.csdn.net/kkkkk0826/article/details/103938020其他:a.如果WaterMark为T,那么EventTime
on yarn:yarn-session,如果资源满了,下一个作业就无法提交,好处——job启动时间变短了。run a flink job on yarn,没提交一个作业会根据自身的情况,向yarn申请资源。如果是平时的本地测试或者开发,可以采用第一种方案;如果是生产环境推荐使用第二种方案。
对比:Storm为实时性付出了一些代价:很难实现高吞吐。不能保证exactly-once,也不支持基于事件时间的处理。Storm Trident是对Storm的延伸,实现了exactly-once语义,但是在延迟性方面付出了很大的代价。Spark Streaming通过采用微批处理方法实现了高吞吐和容错性,但是牺牲了低延迟和实时处理能力,也不能使窗口与自然时间相匹配,并且表现力欠佳。



