使用Flink完成流数据统计

这篇具有很好参考价值的文章主要介绍了使用Flink完成流数据统计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、统计流程

所有流计算统计的流程都是:

1、接入数据源

2、进行多次数据转换操作(过滤、拆分、聚合计算等)

3、计算结果的存储 其中数据源可以是多个、数据转换的节点处理完数据可以发送到一个和多个下一个节点继续处理数据

Flink程序构建的基本单元是stream和transformation(DataSet实质上也是stream)。stream是一个中间结果数据,transformation对数据的加工和操作,该操作以一个或多个stream为输入,计算输出一个或多个stream为结果,最后可以sink来存储数据。

包括数据源,每一次发射出来的数据结果都通过DataStream来传递给下一级继续处理

每一个Transformation要有2步:

1、处理数据

2、将处理完的数据发射出去

二、Flink的数据源

Flink提供数据源只需要实现SourceFunction接口即可。 SourceFunction有一个抽象实现类RichParallelSourceFunction 继承该实现类,实现3个方法,既可以自定义Source public void open(Configuration parameters) //初始化时调用,可以初始化一些参数 public void run(SourceContext ctx)//发送数据 在该方法里调用ctx的collect方法将数据发射出去。

该例子中是每20秒发送出去一个Order类型的实体。

三、Flink的数据转换操作

Flink针对于不同的场景提供了不同的解决方案,减少了用户去关注处理过程中的效率问题。

常见的操作有下面这些:“map”就是做一些映射,比如我们把两个字符串合并成一个字符串,把一个字符串拆成两个或者三个字符串。

“flatMap”类似于把一个记录拆分成两条、三条、甚至是四条记录,例如把一个字符串分割成一个字符数组。

“Filter”就类似于过滤。

“keyBy”就等效于SQL里的group by。

“aggregate”是一个聚合操作,如计数、求和、求平均等。

“reduce”就类似于MapReduce里的reduce。

“join”操作就有点类似于我们数据库里面的join。

“connect”实现把两个流连成一个流。

“repartition”是一个重新分区操作(还没研究)。

“project”操作就类似于SQL里面的snacks(还没研究)。

常见的操作有filter、map、flatMap、keyBy(分组)、aggregate(聚合) 具体的使用方式后面的例子中会体现。

三、窗口

流数据的计算可以把连续不断的数据按照一定的规则拆分成大量的片段,在片段内进行统计和计算。比如可以把一小时内的数据保存到一个小的数据库表里,然后对这部分数据进行计算和统计,而流计算只不过是实时进行的。

常见的窗口有:

1、以时间为单位的Time Window,例如:每1秒钟、每1个小时等

2、以数据的数量为单位的Count Window,例如:每一百个元素

Flink给我们提供了一些通用的时间窗口模型。

1、Tumbling Windows(不重叠的)

数据流中的每一条数据仅属于一个窗口。每一个都有固定的大小,同时窗口间彼此之间不会出现重叠的部分。如果指定一个大小为5分钟的tumbling窗口,那么每5分钟便会启动一个窗口,如下图所示:

2、Sliding Windows(重叠的)

与Tumbling窗口不同的是,在构建Sliding窗口时不仅需要指定窗口大小,还会指定一个窗口滑动参数(window slide parameter)来确定窗口的开始位置。因此当窗口滑动参数小于窗口大小时,窗口之间可能会出现重复的区域。 例如,当你指定窗口大小为10分钟,滑动参数为5分钟时,如下图所示:

3、Session Windows (会话窗口)

当数据流中一段时间没有数据,则Session窗口会关闭。因此,Session Windows没有固定的大小,无法计算Session窗口的开始位置。

四、Flink中的时间概念

Flink中有3中不同的时间概念

  1. 处理时间 Processing Time指的是我们上面进行Transformation操作时,当时的系统时间。

2.事件时间 Event Time指的是业务发生时间,每一条业务记录上会携带一个时间戳,我们需要指定数据中那一个属性中获取。在按业务发生时间统计数据时,我们面临一个问题,当我们接收的数据的时间是无序的时候,我们什么时间去触发聚合计算,我们不可能无限制的等待。Flink引入了Watermark的概念,这个Watermark是添加在窗口上的,是告诉窗口我们最长等待的时间是多久,超过这个时间的数据就抛弃不再处理。

  1. 提取时间 Ingestion Time指的是数据进入Flink当时的系统时间。

五、订单统计的例子

第四步:设置时间戳和Watermarks

 DataStream<Order> marksSource = vilidatedSource
.assignTimestampsAndWatermarks(
new BoundedOutOfOrdernessTimestampExtractor<Order>(Time.minutes(1)){
            @Override
            public long extractTimestamp(Order o) {
                return o.getTimestamp().getTime();
            }
        });


前面已经设置了使用EventTime来处理数据,那么在进行时间窗口计算前必须给数据分配获取时间戳的字段,这里设置了Order的timestamp字段为EventTime,同时这里也设置了一个1分钟的Watermarks,表示最多等待1分钟,业务发生时间超过系统时间1分钟的数据都不进行统计。

第五步:数据分组

KeyedStream<Order, Tuple> keyedStream =
                marksSource.keyBy("biz");//先以biz来Group


这里设置了以Order中biz字段进行分组,这就意味着所有biz相同的数据会进入到同一个时间窗口中进行计算。

第六步:指定时间窗口、聚合计算

DataStream<List<Tuple2<String, String>>> results = keyedStream
                .window(TumblingEventTimeWindows.of(Time.minutes(1)))
                .aggregate(new OrderSumAggregator()).setParallelism(1);


这里设置了一个以1分钟为单位的不重叠的TumblingEventTimeWindow。 然后使用OrderSumAggregator来进行聚合计算。 需要注意的是如果最前面设置的是使用ProcessTime来处理数据,这里的窗口就会变成TumblingProcessTimeWinwow,前后必须一一对应,之前就因为前后不对应,统计结果不正确一直招不到原因。

六、聚合计算

上面例子中比较核心的部分就是聚合计算,也就是我们的OrderSumAggregator 聚合计算我们只需要实现Flink给我们提供的AggregateFunction接口,重写其方法即可。

ACC createAccumulator();//创建一个数据统计的容器,提供给后续操作使用。

ACC add(IN in, ACC acc);//每个元素被添加进窗口的时候调用。 第一个参数是添加进窗口的元素,第二个参数是统计的容器(上面创建的那个)。

OUT getResult(ACC acc);//窗口统计事件触发时调用来返回出统计的结果。

ACC merge(ACC acc1, ACC acc2);//只有在当窗口合并的时候调用,合并2个容器

其中这个容器根据情况也可以是在内存里提供,也可以是在其他存储设备中提供。

通过上面的例子我们就实现了按照业务时间来统计每分钟内的订单数量,订单最多可以延迟1分钟上报。 但是我们为了等待1分钟内上报的数据,造成了数据会延迟1分钟进行统计,例如8点02分我们才能统计到8点到8点01分上报的数据。 为了解决这个问题,我们可以给window再增加一个自定义的统计触发器,这个触发器可以在整点触发统计事件(也就是调用上面的getResults方法),这样就达到了8点到8点01分这个时间段的数据,在8点01分统计一次,在8点02分再重新统计一次(加上后面1分钟上报的数据)。

作者:京东科技 梁发文

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-750441.html

到了这里,关于使用Flink完成流数据统计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【每日算法 && 数据结构(C++)】—— 01 | 平方值去重统计(解题思路STL法,双指针法、流程图、代码片段)

    “Success is not final, failure is not fatal: It is the courage to continue that counts.” - Winston Churchill (成功并非终点,失败并非致命:真正重要的是继续前行的勇气 - 温斯顿·丘吉尔) 给你一个整数数组,数组中的数可以是正数、负数、零,请实现一个函数,返回这个数组中所有数的平方

    2024年02月12日
    浏览(41)
  • 使用Python进行数据分析——描述性统计分析

    大家好,描述性统计分析主要是指求一组数据的平均值、中位数、众数、极差、方差和标准差等指标,通过这些指标来发现这组数据的分布状态、数字特征等内在规律。在Python中进行描述性统计分析,可以借助Numpy、Pandas、SciPy等科学计算模块计算出指标,然后用绘图模块Ma

    2024年02月07日
    浏览(38)
  • 共享单车之数据分析-统计共享单车每天的平均使用时间

    第1关:统计共享单车每天的平均使用时间 任务描述 相关知识 如何配置Hbase的MapReduce类 如何使用Hbase的MapReduce进行数据分析 编程要求 测试说明 任务描述 本关任务:使用 Hbase 的 MapReduce 对已经存在 Hbase 的共享单车运行数据进行分析,统计共享单车每天的平均使用时间,其中

    2024年02月03日
    浏览(49)
  • 使用JOIN查询数据重复,怎么办?使用count统计怎么写SQL?

    比如现在有两个表tbl_a和tbl_b,如下: tbl_a id name 1 Bruce 2 Mike 3 Angela tbl_b id a_id :-: :-: 1 1 2 1 3 2 4 3 5 3 6 3 这时候我们如果联查的话,就会出现重复数据: 这样查出来的数据就会像下面这样: id name 1 Bruce 1 Bruce 2 Mike 3 Angela 3 Angela 3 Angela 去重的方法有三种: 一、distinct 二、group

    2024年02月16日
    浏览(39)
  • mysql数据库使用sql对特殊分隔符分隔的字段进行统计

    需求 在一个数据库表中有一个字段中的数据是通过特殊符号进行分隔的,现需要统计分隔符分开的各数据的条数。 数据准备  现需统计各个绝技的人数☺ 思路 使用sql根据逗号将一行数据拆分成多行数据 ,然后使用group by对拆分的数据进行统计。 三种方式,相同的原理 使用

    2023年04月17日
    浏览(91)
  • 【文心一言】获取统计数据以及自动计算增长率,非常不错的一个使用例子

    欢迎来到《小5讲堂》 大家好,我是全栈小5,这是《文心一言》系列文章 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 之前在写一篇文章的时候,想了解下程序员近10年类就业人数,然后网上各种地方搜索, 并没有找到非常理想的数据,所以就想到了对

    2024年03月20日
    浏览(35)
  • 【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)一(112)

    需求: : 有一个ListMapString.Object,存储了某年某月的数据, 数据是根据用户查询条件进行显示的;所以查询的数据是动态的; 需按月份统计每个年月数据出现的次数,并且按照月份排序; 统计周期不超过一年(前端页面控制); 分析: : 后端给前端返回值:不能用对象返

    2024年02月12日
    浏览(35)
  • 【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)四(116)

    需求: :前端根据后端的返回数据:画统计图; 1.动态获取地域数据以及数据中的平均值,按照平均值降序排序; 说明: X轴是动态的,有对应区域数据则展示; X轴 区域数据降序排序; 代码: Postman接口测试: 总结: 代码中有一个地域的数组:reginArr ,如果地域字典新增

    2024年02月12日
    浏览(36)
  • 【Java 动态数据统计图】动态数据统计思路案例(动态,排序,动态数组(重点推荐))七(129)

    需求 :前端根据后端的返回数据:画统计图; 说明: 1.X轴为地域,Y轴为地域出现的次数; 2. 动态展示(有地域展示,没有不展示,且高低排序) Demo案例 : 测试输出 : 案例二 : postman接口测试 :

    2024年02月10日
    浏览(34)
  • 大数据(二)大数据行业相关统计数据

    目录 一、大数据相关的各种资讯 二、转载自网络的大数据统计数据 2.1、国家大数据政策 2.2、产业结构分析 2.3、应用结构分析 2.4、数据中心 2.5、云计算 1.    据IDC预测,到2025年全球 数据产生量将达到180ZB ,其中物联网设备将占据很大一部分。 2.    据Gartner预测,到2021年

    2024年02月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包