如何基于Flink实现通用的聚合指标计算框架

网易云信作为一个 PaaS 服务,需要对线上业务进行实时监控,实时感知服务的“心跳”、“脉搏”、“血压”等健康状况。通过采集服务拿到 SDK、服务器等端的心跳埋点日志,是一个非常庞大且杂乱无序的数据集,而如何才能有效利用这些数据?服务监控平台要做的事情就是对海量数据进行实时分析,聚合出表征服务的“心跳”、“脉搏”、“血压”的核心指标,并将其直观的展示给相关同学。这其中核心的能力便是 :实时分析和实时聚合。

作者:圣少友 网易云信数据平台资深开发工程师

一、序言

基于明细数据集进行实时聚合,生产一个聚合指标,业界常用的实现方式是 Spark Streaming、Flink SQL / Stream API。不论是何种方式,我们都需要通过写代码来指定数据来源、数据清洗逻辑、聚合维度、聚合窗口大小、聚合算子等。如此繁杂的逻辑和代码,无论是开发、测试,还是后续任务的维护,都需要投入大量的人力/物力成本。而我们程序员要做的便是化繁为简、实现大巧不工。本文将阐述网易云信是如何基于 Flink 的 Stream API,实现一套通用的聚合指标计算框架。

二、整体架构

图1

Figure 1整体架构

如上图所示,是我们基于 Flink 自研的聚合指标完整加工链路,其中涉及到的模块包括:

  • Source:定期加载聚合规则,并根据聚合规则按需创建 Kafka 的 Consumer,并持续消费数据。
  • Process:包括分组逻辑、窗口逻辑、聚合逻辑、环比计算逻辑等。从图中可以看到,我们在聚合阶段分成了两个,这样做的目的是什么?其中的好处是什么呢?做过分布式和并发计算的,都会遇到一个共同的敌人:数据倾斜。在我们 PaaS 服务中头部客户会更加明显,所以倾斜非常严重,分成两个阶段进行聚合的奥妙下文中会详细说明。
  • Sink:是数据输出层,目前默认输出到 Kafka 和 InfluxDB,前者用于驱动后续计算(如告警通知等),后者用于数据展示以及查询服务等。
  • Reporter:全链路统计各个环节的运行状况,如输入/输出 QPS、计算耗时、消费堆积、迟到数据量等。

下文将详细介绍这几个模块的设计和实现思路。

(一)source

1.配置规则:

为了便于聚合指标的生产和维护,我们将指标计算过程中涉及到的关键参数进行了抽象提炼,提供了可视化配置页面,如下图所示。下文会结合具体场景介绍各个参数的用途。

图2

Figure 2 规则配置页面

2.规则加载: 

在聚合任务运行过程中,我们会定期加载配置。如果检测到有新增的 Topic,我们会创建 kafka-consumer 线程,接收上游实时数据流。同理,对于已经失效的配置,我们会关闭消费线程,并清理相关的 reporter。

3.数据消费:

对于数据源相同的聚合指标,我们共用一个 kafka-consumer,拉取到记录并解析后,对每个聚合指标分别调用 collect() 进行数据分发。如果指标的数据筛选规则(配置项 ⑤)非空,在数据分发前需要进行数据过滤,不满足条件的数据直接丢弃。

(二)Process

1.整体计算流程: 

基于 Flink 的 Stream API 实现聚合计算的核心代码如下所示:

如何基于Flink实现通用的聚合指标计算框架

Figure 3聚合计算核心代码

  • MetricWatermark():根据指定的时间字段(配置项 ⑧) 获取输入数据的 timestamp,并驱动计算流的 watermark 往前推进。
  • MetricKeyBy():指定聚合维度,类似于 MySQL 中 groupby,根据分组字段(配置项 ⑥),从数据中获取聚合维度的取值,拼接成分组 key。
  • MetricTimeWindow():配置项 ⑧ 中指定了聚合计算的窗口大小。如果配置了定时输出,我们就创建滑动窗口,否则就创建滚动窗口。
  • MetricAggFuction():实现配置项 ② 指定的各种算子的计算,下文将详细介绍各个算子的实现原理。

2.二次聚合:

  • 对于大数据量的聚合计算,数据倾斜是不得不考虑的问题,数据倾斜意味着规则中配置的分组字段(配置项 ⑥)指定的聚合 key 存在热点。我们的计算框架在设计之初就考虑了如何解决数据倾斜问题,就是将聚合过程拆分成 2 阶段:
  • 第 1 阶段:将数据随机打散,进行预聚合。
  • 第 2 阶段:将第 1 阶段的预聚合结果作为输入,进行最终的聚合。
  • 具体实现:判断并发度参数 parallelism(配置项 ⑦)是否大于1,如果 parallelism 大于1,生成一个 [ 0, parallelism)之间的随机数作为 randomKey,在第1阶段聚合 keyBy() 中,将依据分组字段(配置项⑥)获取的 key 与 randomKey 拼接,生成最终的聚合 key,从而实现了数据随机打散。

3.聚合算子:

作为一个平台型的产品,我们提供了如下常见的聚合算子。由于采用了二次聚合逻辑,各个算子在第 1 阶段和第 2 阶段采用了相应的计算策略。

算子

第1阶段聚合

第2阶段聚合

min/max/sum/count

直接对输入数据进行预聚合计算,输出预聚合结果

对第1阶段预聚合结果进行二次聚合计算,输出最终结果

first/last

对输入数据的 timestamp 进行比较,记录最小/最大的 timestamp 以及对应的 value 值,输出 <timestamp,value> 数据对

对 <timestamp,value> 数据对进行二次计算,输出最终的 first/last

avg

计算该分组的和值和记录数,输出 <sum,cnt> 数据对

对 <sum,cnt> 数据对分别求和,然后输出:总sum / 总cntcount

median/tp90/tp95

统计输入数据的分布,输出 NumericHistogram

对输入的 NumericHistogram 做 merge 操作,最终输出中位数/tp90/tp95

count-distinct

输出记录桶信息和位图的 RoaringArray

对 RoaringArray 进行 merge 操作,最终输出精确的去重计数结果

count-distinct(近似)

输出基数计数对象 HyperLoglog

对 HyperLoglog 进行 merge 操作,最终输出近似的去重计数结果

Figure 4集合算子计算逻辑

对于计算结果受全部数据影响的算子,如 count-distinct(去重计数),常规思路是利用 set 的去重特性,将所有统计数据放在一个 Set 中,最终在聚合函数的 getResult 中输出 Set 的 size。如果统计数据量非常大,这个 Set 对象就会非常大,对这个 Set 的 I/O 操作所消耗的时间将不能接受。

对于类 MapReduce 的大数据计算框架,性能的瓶颈往往出现在 shuffle 阶段大对象的 I/O 上,因为数据需要序列化 / 传输 / 反序列化,Flink 也不例外。类似的算子还有 median 和 tp95。

为此,需要对这些算子做专门的优化,优化的思路就是尽量减少计算过程中使用的数据对象的大小,其中:

  • median/tp90/tp95:参考了 hive percentile_approx 的近似算法,该算法通过 NumericHistogram(一种非等距直方图)记录数据分布,然后通过插值的方式得到相应的 tp 值(median 是 tp50)。
  • count-distinct:采用 RoaringBitmap 算法,通过压缩位图的方式标记输入样本,最终得到精确的去重计数结果。
  • count-distinct(近似):采用 HyperLoglog 算法,通过基数计数的方式,得到近似的去重计数结果。该算法适用于大数据集的去重计数。

后处理:

后处理模块,是对第 2 阶段聚合计算输出数据进行再加工,主要有 2 个功能:

  • 复合指标计算:对原始统计指标进行组合计算,得到新的组合指标。例如,要统计登录成功率,我们可以先分别统计出分母(登录次数)和分子(登录成功的次数),然后将分子除以分母,从而得到一个新的组合指标。配置项 ③ 就是用来配置组合指标的计算规则。
  • 相对指标计算:告警规则中经常要判断某个指标的相对变化情况(同比/环比)。我们利用 Flink 的state,能够方便的计算出同比/环比指标,配置项 ④ 就是用来配置相对指标规则。

异常数据的处理:

这里所说的异常数据,分为两类:迟到的数据和提前到的数据。

  • 迟到数据:
  • 对于严重迟到的数据(大于聚合窗口的 allowedLateness),通过 sideOutputLateData 进行收集,并通过 reporter 统计上报,从而能够在监控页面进行可视化监控。
  • 对于轻微迟到的数据(小于聚合窗口的 allowedLateness),会触发窗口的重计算。如果每来一条迟到数据就触发一次第 1 阶段窗口的重计算,重计算结果传导到第 2 阶段聚合计算,就会导致部分数据的重复统计。为了解决重复统计的问题,我们在第 1 阶段聚合 Trigger 中进行了特殊处理:窗口触发采用 FIRE_AND_PURGE(计算并清理),及时清理已经参与过计算的数据。
  • 提前到的数据:这部分数据往往是数据上报端的时钟不准导致。在计算这些数据的 timestamp 时要人为干预,避免影响整个计算流的 watermark。

(三)sink

聚合计算得到的指标,默认输出到 Kafka 和时序数据库 InfluxDB。

  • kafka-sink:将指标标识( 配置项①)作为 Kafka 的较好ic,将聚合结果发送出去,下游接收到该数据流后可以进一步处理加工,如告警事件的生产等。
  • InfluxDB-sink:将指标标识( 配置项①)作为时序数据库的表名,将聚合结果持久化下来,用于 API 的数据查询、以及可视化报表展示等。

(四)reporter

为了实时监控各个数据源和聚合指标的运行情况,我们通过 InfluxDB+Grafana 组合,实现了聚合计算全链路监控:如各环节的输入/输出 QPS、计算耗时、消费堆积、迟到数据量等。

图4

Figure 5全链路监控

三、总结

目前,通过该通用聚合框架,承载了网易云信 100+ 个不同维度的指标计算,带来的收益也是比较可观的:

  • 提效:采用了页面配置化方式实现聚合指标的生产,开发周期从天级缩短到分钟级。没有数据开发经验的同学也能够自己动手完成指标的配置。
  • 维护简单,资源利用率高:100+ 个指标只需维护 1 个 flink-job,资源消耗也从 300+ 个 CU 减少到 40CU。
  • 运行过程透明:借助于全链路监控,哪个计算环节有瓶颈,哪个数据源有问题,一目了然。

作者介绍

圣少友,网易云信数据平台资深开发工程师,从事数据平台相关工作,负责服务监控平台、数据应用平台、质量服务平台的设计开发工作。

关于网易云信

网易云信:网易智企旗下融合通信云服务专家、通信与视频 PaaS 平台。集网易 24 年 IM 以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务,视频会议等组件服务,并联合网易易盾推出一站式安全通信方案「安全通」。目前,网易云信已经成功发送 1.6 万亿条消息,覆盖智能终端 SDK 数累计超过 186 亿,我们期待每个智能终端都有云信的融合通信能力。

文章标题:如何基于Flink实现通用的聚合指标计算框架,发布者:网易智企,转载请注明出处:https://worktile.com/kb/p/5956

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
网易智企的头像网易智企认证作者
上一篇 2022年3月17日 上午12:19
下一篇 2022年3月17日 上午12:30

相关推荐

  • 在线工作日志管理工具有哪些

    在线工作日志管理工具有:一、有道云笔记;二、日事清;三、EverNote;四、桌面日记本。五、milogs工作日志软件。有道云笔记是网易旗下的有道推出的云笔记软件,支持多种附件格式,能够实时增量式同步。 一、有道云笔记 有道云笔记(原有道笔记)是网易旗下的有道推出的云笔记软件,支持多种附件格式,有道…

    2023年4月30日
    81100
  • 软件测试缺陷管理系统的优点

    软件测试缺陷管理系统的优点有:1、收集内部和用户的产品缺陷反馈,帮研发团队快速高效的分配,跟进,解决缺陷。2、通过不同的视图,向成员展现缺陷的进展情况。3、需配备测试,这样可以更好的协助缺陷最终是否完成的校验情况。

    2022年11月14日
    41100
  • 项目经理如何管理人员绩效

    项目经理管理人员绩效的核心在于确保团队成员能够高效、有效地完成任务,同时保持团队的积极动力。关键方法包括设置清晰的目标、进行定期的绩效评估、提供及时的反馈、激励团队成员以及提供个人成长和培训机会。在这些方法中,设置清晰的目标尤为关键,因为目标不仅向团队成员明确了所期待的成果,还提供了衡量其绩效的标准…

    2024年4月11日
    5300
  • devops基于什么

    DevOps基于敏捷软件开发、持续集成、持续交付与自动化技术。在21世纪的软件开发领域,DevOps已成为提高软件开发效率、保证软件质量的重要手段。其中,1、敏捷软件开发提供了快速响应变化的方法论框架。通过迭代、增量的方式不断适应和满足用户需求,是DevOps流程中不可或缺的一环。特别是敏捷的实践理…

    2024年3月26日
    6700
  • devops模型是什么

    DevOps模型应被视为一系列实践和工具,旨在提供软件开发(Dev)和信息技术运维(Ops)之间的整合,1、缩短系统开发生命周期、2、确保持续交付的高质量。特别是在第一核心观点上,DevOps倡导自动化与监控,从软件构建、测试以至部署,促进更加频繁且可信赖的产品推出。 详细描述缩短系统开发生命周期,…

    2024年3月26日
    6900
  • MQTT协议在智能设备即时通讯中的应用案例

    开门见山地解答:MQTT协议在智能设备即时通讯中的作用显著。该协议设计轻量、开放标准,便于嵌入式设备无缝接入Internet。1、具有高效的消息传递机制,使能低功耗设备保持长期在线状态而消耗极少电力;2、提供稳健的消息级别,确保信息按需可靠传递;3、实现灵活的主题过滤,使设备可订阅相关主题进行数据交…

    2023年12月25日
    28700
  • 企业如何通过技术研发实现可持续发展

    企业通过技术研发实现可持续发展关键在于采用创新的途径以减少对资源的依赖和环境的影响。具体包括1、投资清洁技术研发,2、推动生产过程优化,3、开展产品全生命周期分析,4、加强员工和利益相关者的可持续培训,以及5、实施环境管理体系。投资在清洁和高效的技术上,有助于降低废物和污染的产生。通过提高生产效率和…

    2023年11月30日
    25900
  • 二叉树什么场景需要返回值

    二叉树需要返回值的场景有:1、计算深度;2、判断是否平衡;3、查找路径;4、计算节点总和;5、检查特定属性;6、二叉树的序列化和反序列化。其中,计算深度指的是在遍历二叉树的过程中需要返回每个节点的深度,以便进行其他计算或者判断。 1、计算深度 在二叉树的遍历过程中,通常需要计算每个节点的深度。这种情…

    2023年7月18日
    47500
  • 什么是敏捷进度管理

    敏捷进度管理涉及针对具备迭代和灵活特质的项目进行动态、连续的计划和评估过程。其中的核心观点包括 1、透明性、2、检视与适应、3、持续改进。在敏捷环境下,进度管理侧重于短周期内的可交付成果,并崇尚与项目团队、利益相关者共同审视和调整进度计划,以保障项目目标的实现。 透明性是敏捷进度管理的关键所在。通过…

    2023年12月26日
    21100
  • project电脑版怎么下载

    project电脑版下载流程:一、登录以下载project;二、安装project。登录以下载project的名列前茅步是转到官网“www.office.com”,如果尚未登录,请选择“登录”,然后使用与此版本的项目关联的帐户登录。 一、登录以下载project 1、转到“www.office.co…

    2023年2月23日
    52100

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部