云星数据---Apache Flink实战系列(精品版)】:Flink流处理API详解与编程实战003-Flink基于流的window操作001

183 篇文章 0 订阅
86 篇文章 57 订阅

一、流处理的基本概念

1.stream和window

1.源源不断的数据流是无法进行统计工作的,因为数据流没有边界,就无法统计到底有多少数据经过了这个流。
  也无法统计数据流中的最大值,最小值,平均值,累加值等信息。
2.如果在数据流上,截取固定大小的一部分,这部分是可以进行统计的。 截取方式主要有两种,
  1.根据时间进行截取(time-driven-window),比如每1分钟统计一次或每10分钟统计一次。
  2.根据数据进行截取(data-driven-window),比如每5个数据统计一次或每50个数据统计一次。
3.图中上面是time-window,下面是count-window

2.time

这里写图片描述

1.事件时间(Event Time):事件在它的生产设备上发生的时间 
2.提取时间是(Ingestion time):事件进入Flink的时间
3.处理时间(Processing Time):执行对应Operation设备的系统时间

二、time-window理论

1.车流通过红绿灯的场景

1.红绿灯路口会有汽车通过,一共会有多少汽车通过,无法计算。因为车流源源不断,计算没有边界。
2.统计每15秒钟通过红路灯的汽车数量,第一个15秒为2辆,第二个15秒为3辆,第三个15秒为1辆。。。

2.车流通过红绿灯的计算

1.每15秒统计一次,一共有多少汽车通过红路灯。新数据和原来数据一起统计。
2.第一个15秒为2辆,第二个15秒为2+3=5辆,第三个15秒为2+3+1=6辆。。。

3.其中的tumbling-window (无重叠数据)

1.每分钟统计一次,这一分钟内一共有多少汽车通过红绿灯。
2.第一分钟的为8辆,第二分钟为22辆,第三分钟为27辆。。。这样,1个小时内会有60个tumbling window

4.其中的sliding-window (有重叠数据)

1.30秒统计一次,1分钟内通过汽车数量。(30秒窗口滑动时间,1分钟窗口大小时间)
2.第一个1分钟通过8辆,第二个1分钟通过15辆,第三个1分钟通过22辆。。。
3.window出现了重合。这样,1个小时内会有120window4.如果窗口的滑动时间和窗口的大小时间相等,那么sliding-window就变成了tumbling-window
  也就是说将每30秒统计一次,统计1分钟通过汽车数量,改成.每1分钟统计一次,1分钟内通过汽车数量。

5.现实的交通场景中的多time-window

1.城市当中有多个红绿灯路口,每个红绿灯路口处都能形成车流。
2.flink可以用多个时间窗口去统计多条车流信息。
3.图中有3条车流信息,用3个窗口去统计,形成了 (sensorId, carCnt)的数据信息。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Flink的DataStream API来实现处理程序,以下是一个简单的代码示例: ```java import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.windowing.WindowFunction; import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows; import org.apache.flink.streaming.api.windowing.windows.TimeWindow; import org.apache.flink.streaming.api.windowing.windows.Window; import org.apache.flink.util.Collector; public class WordCount { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 从socket读取数据 DataStream<String> stream = env.socketTextStream("localhost", 9999); // 将每行数据按空格拆分成单词 DataStream<String> words = stream.flatMap((String line, Collector<String> out) -> { for (String word : line.split(" ")) { out.collect(word); } }); // 对每个单词进行计数,生成(word, count)格式的二元组 DataStream<Tuple2<String, Integer>> counts = words.keyBy((KeySelector<String, String>) value -> value) .window(TumblingProcessingTimeWindows.of(Time.seconds(5))) .apply(new WindowFunction<String, Tuple2<String, Integer>, String, TimeWindow>() { @Override public void apply(String key, TimeWindow window, Iterable<String> input, Collector<Tuple2<String, Integer>> out) { int count = 0; for (String word : input) { count++; } out.collect(new Tuple2<>(key, count)); } }); // 打印计数结果 counts.print(); env.execute("Word Count"); } } ``` 上述代码中,首先从socket读取数据,然后将每行数据按空格拆分成单词。接着对每个单词进行计数,生成二元组。最后打印计数结果。这里使用了Flink的窗口操作,每隔5秒钟计算一次窗口内单词出现次数的总和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值