Flink 在 讯飞 AI 营销业务的实时数据分析实践

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 科大讯飞中级大数据工程师汪李之在 FFA 2021 的演讲。

摘要:本文整理自科大讯飞中级大数据工程师汪李之在 Flink Forward Asia 2021 的分享。本篇内容主要分为四个部分:

  1. 业务简介
  2. 数仓演进
  3. 场景实践
  4. 未来展望

点击查看直播回放 & 演讲PDF

一、业务简介

img

构建实时数据分析平台是为了更好的解决业务对更高数据时效性的需求,先简单介绍一下业务流程。

从日常的场景说起,当我们打开手机 APP 时,常会看到广告。在这样一个场景中,涉及到了两个比较重要的角色。一是手机 APP,即流量方;另一个是投广告的广告主,如支付宝、京东会投放电商广告。广告主购买流量方的流量投广告就产生了交易。

讯飞构建了一个流量交易平台,流量交易平台主要的职能是聚合下游流量,上游再对接广告主,从而帮助广告主和流量方在平台上进行交易。讯飞还构建了投放平台,这个平台更侧重于服务广告主,帮助广告主投放广告,优化广告效果。

在上述的业务流程图中,APP 与平台交互时会向平台发起请求,然后平台会下发广告,用户随后才能看到广告。用户看到广告的这个动作称之为一次曝光,APP 会把这次曝光行为上报给平台。如果用户点击了广告,那么 APP 也会上报点击行为。

广告在产生之后发生了很多行为,可以将广告的整个过程称为广告的一次生命周期,不仅限于图中的请求、曝光、点击这三次行为,后面可能还有下单、购买等。

img

在这样一个业务流程中,业务的核心诉求是什么呢?在广告的生命周期中有请求、曝光和点击等各种行为,这些行为会产生对应的业务日志。那么就需要从日志生成数据供业务侧分析,从日志到分析的过程中就引入了数仓构建、数仓分层,数据呈现的时效性就带来了实时数据仓库的发展。

二、数仓演进

img

上图是一个典型的数仓分层框架,最底层是 ODS 数据,包括业务日志流、OLTP 数据库、第三方文档数据。经过 ETL 将 ODS 层的数据清洗成业务模型,也就是 DWD 层。

img

最初是建立了 Spark 数仓,将业务日志收集到 Kafka 中再投递到 HDFS 上,通过 Spark 对日志进行清洗建模,然后将业务模型再回写到 HDFS 上,再使用 Spark 对模型进行统计、分析、输出报表数据。后续,讯飞沿用了 Spark 技术栈引入了 spark-streaming。

img

随后逐渐将 spark-streaming 迁移到了 Flink 上,主要是因为 Flink 更高的时效性和对事件时间的支持。

当初 spark-streaming 的实践是微批的,一般设置 10 秒或是 30 秒一批,数据的时效性顶多是秒级的。而 Flink 可以支持事件驱动的开发模式,理论上时效性可以达到毫秒级。

当初基于 spark-streaming 的实时数据流逻辑较为简陋,没有形成一个数仓分层的结构。而 Flink 可以基于 watermark 支持事件时间,并且支持对延迟数据的处理,对于构建一个业务逻辑完备的数仓有很大的帮助。

img

由上图可见,ODS 的业务日志收集到 Kafka 中,Flink 从 Kafka 中消费业务日志,清洗处理后将业务模型再回写到 Kafka 中。然后再基于 Flink 去消费 Kafka 中的模型,提取维度和指标,统计后输出报表。有些报表会直接写到 sql 或 HBase 中,还有一些报表会回写到 Kafka 中,再由 Druid 从 Kafka 中主动摄取这部分报表数据。

在整个数据流图中 Flink 是核心的计算引擎,负责清洗日志、统计报表。

三、场景实践

3.1 ODS - 日志消费负载均衡

img

ODS 业务中,请求日志量级大,其他日志量级小。这样请求日志(request_topic)在 Kafka 上分区多,曝光和点击日志(impress/click_topic)分区少。

img

最初是采用单 source 的方法,创建一个 FlinkKafkaConsumer011 消费所有分区,这可能导致 task 消费负载不均。同一 topic 的不同分区在 task 上可均匀分配,但不同 topic 的分区可能会被同一 task 消费。期望能达到的消费状态是:量级大的 topic,其 task 和 partition 一一对应,量级小的 topic 占用剩下的 task。

img

解决方法是把单 source 的消费方式改成了多 source union 的方式,也就是创建了两个 consumer,一个 consumer 用来消费大的 topic,一个 consumer 用来消费小的 topic,并单独为它们设置并行。

3.2 DWD - 日志关联及状态缓存

img

DWD 是业务模型层,需要实现的一个关键逻辑是日志关联。基于 sid 关联广告一次生命周期中的不同行为日志。业务模型记录了 sid 级别的维度和指标。

img

最初是基于 30s 的 window 来做关联,但这种方式会导致模型输出较第一次事件发生延迟有 30s,并且 30s 仅能覆盖不到 12% 的曝光日志。如果扩大窗口时间则会导致输出延迟更多,并且同一时刻存在的窗口随时间增长,资源消耗也比较大。

img

后续改成了基于状态缓存的方式来实现日志关联,即 ValueState。同一 sid 下的日志能够访问到相应的 ValueState。不过为保证及时输出,将请求、曝光、点击等不同指标,拆分到了多条数据中,输出的数据存在冗余。

img

随着业务的增长和变化,需要缓存的状态日益变大,内存已无法满足。于是我们将状态从内存迁移至 HBase 中,这样做的好处是支持了更大的缓存,并且 Flink checkpoint 负载降低。但同时也带来了两个问题:引入第三方服务,需要额外维护 HBase;HBase 的稳定性也成为计算链路稳定性的重要依赖。

img

在 HBase 状态缓存中,遇到一个数据倾斜的问题,某条测试 sid 的曝光重复上报,每小时千次量级。如上图,该条 sid 对应的状态达到 MB 级别,被频繁的从 HBase 中取出并写回,引起频繁的 gc,影响所在 task 的性能。解决办法是根据业务逻辑对 impress 进行去重。

3.3 DWS - 实时 OLAP

img

在 DWD 层基于 Flink 的事件驱动已经实现了实时模型,再由 Flink 来消费处理实时模型,从中提取出维度和指标,然后逐条的向后输出。在这个过程中已是能输出一个实时 OLAP 的结果了,但也需要有个后端的存储来承接,我们因此引入了 Druid。Druid 可以支持数据的实时摄入,并且摄入的结果实时可查,也可以在摄入的同时做自动的聚合。

img

上图左侧:每张表需要启动常驻任务等待 push 过来的数据。常驻任务被动接收数据,易被压崩;常驻任务异常重启麻烦,需要清理 zk 状态;常驻任务的高可用依赖备份任务,浪费资源。

上图右侧:一张报表对应一个 Kafka 消费任务。消费任务自己控制摄入速率更加稳定;任务可依赖 offset 平滑的失败自启。

3.4 ADS - 跨源查询

img

Presto 是分布式的 SQL 查询引擎,可从不同的数据源抽取数据并关联查询。但会带来 Druid 的下推优化支持不完善的问题。

3.5 流批混合现状

img

如上图所示是 Lambda 大数据框架,流式计算部分是 Kafka+Flink,批处理则是 HDFS+Spark。

流式计算的特点:

  • 响应快,秒级输出;
  • 可重入性差,难以重复计算历史日志;
  • 流的持续性重要,异常需迅速介入。

批处理的特点:

  • 响应慢,小时级输出;
  • 可重入性好,可重复计算历史数据;
  • 数据按小时粒度管理,个别异常可从容处理。

流批混合痛点:

  • 两遍日志清洗的计算量;
  • 两套技术框架;
  • 数据一致性问题。

四、未来展望

img

流批混合优化,直接将实时模型输出到 HDFS。

好处是:

  • 避免了对日志的重复清洗;
  • 统一了建模的技术框架;
  • 支持延迟数据对模型的更新。

但也有以下两个问题:

  • 实时模型重复,量级更大,计算消耗大;
  • 支持数据更新的技术如 Hudi,会改变模型的使用方式,对后续使用者不友好。

img

最后聊一下对 Flink-SQL 的想法:检索近 10 分钟的某条异常日志、快速评估近 10 分钟新策略的效果都属于即时、微批、即席查询。批处理链路小时级响应太慢;实时检索系统如 ES,资源消耗大。可以利用 Kafka + Flink-SQL 解决上述问题,Kafka + Flink-SQL 也是今后计划尝试的方向。

点击查看直播回放 & 演讲PDF


更多 Flink 相关技术问题,可扫码加入社区钉钉交流群
第一时间获取最新技术文章和社区动态,请关注公众号~

O1CN01tmtpiy1iazJYZdixL_!!6000000004430-2-tps-899-548.png"

活动推荐

阿里云基于 Apache Flink 构建的企业级产品-实时计算Flink版现开启活动:
99 元试用 实时计算Flink版(包年包月、10CU)即有机会获得 Flink 独家定制卫衣;另包 3 个月及以上还有 85 折优惠!
了解活动详情:https://www.aliyun.com/product/bigdata/sc

image.png

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
17天前
|
人工智能 自然语言处理 数据挖掘
利用AI集成工具提升工作效率的实践经验
随着人工智能技术的蓬勃发展,以及当今数字化快速发展的时代,人工智能的运用已经渗透到各个行业和工作领域中,大语言模型在自然语言处理领域的应用也愈发广泛,而且市面上涌现出一批AI集成工具,比如Langchain、Dify、llamaIndex、fastgpt、百炼等,它们为开发者提供了强大的支持和便利,极大地提升了AI模型的构建和管理效率。作为一名热衷于利用新技术提高工作效率的开发者,我也积极尝试将这些工具融入到我的日常工作中,以期望提升工作效率和质量,下面我将分享我是如何使用AI集成工具来提升工作效率的,以及实践经验和心得。
52 1
利用AI集成工具提升工作效率的实践经验
|
21天前
|
SQL 存储 NoSQL
贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践
本文投稿自贝壳家装数仓团队,在结合家装业务场景下所探索出的一种基于 Flink+Paimon 的排序方案。这种方案可以在实时环境对全量数据进行准确的分组排序,同时减少对内存资源的消耗。在这一方案中,引入了“事件时间分段”的概念,以避免 Flink State 中冗余数据对排序结果的干扰,在保证排序结果准确性的同时,减少了对内存的消耗。并且基于数据湖组件 Paimon 的聚合模型和 Audit Log 数据在数据湖内构建了拉链表,为排序结果提供了灵活的历史数据基础。
28625 1
贝壳找房基于Flink+Paimon进行全量数据实时分组排序的实践
|
6天前
|
数据采集 运维 Cloud Native
Flink+Paimon在阿里云大数据云原生运维数仓的实践
构建实时云原生运维数仓以提升大数据集群的运维能力,采用 Flink+Paimon 方案,解决资源审计、拓扑及趋势分析需求。
460 0
Flink+Paimon在阿里云大数据云原生运维数仓的实践
|
21天前
|
人工智能 Cloud Native Java
从云原生视角看 AI 原生应用架构的实践
本文核心观点: • 基于大模型的 AI 原生应用将越来越多,容器和微服务为代表的云原生技术将加速渗透传统业务。 • API 是 AI 原生应用的一等公民,并引入了更多流量,催生企业新的生命力和想象空间。 • AI 原生应用对网关的需求超越了传统的路由和负载均衡功能,承载了更大的 AI 工程化使命。 • AI Infra 的一致性架构至关重要,API 网关、消息队列、可观测是 AI Infra 的重要组成。
50497 13
|
19天前
|
敏捷开发 存储 前端开发
【美团技术】领域驱动设计DDD在B端营销系统的实践
【美团技术】领域驱动设计DDD在B端营销系统的实践
|
25天前
|
机器学习/深度学习 数据采集 人工智能
智能化运维的探索与实践:AI在IT运维中的应用
【6月更文挑战第19天】随着人工智能技术的不断成熟,其在IT运维领域的应用也愈发深入。本文将探讨AI技术如何赋能传统IT运维,提升效率和响应速度,实现故障预测、自动化处理及优化决策。通过分析AI在运维中的实际应用案例,我们能更好地了解其潜力与挑战,并预见未来智能化运维的发展路径。
247 6
|
26天前
|
人工智能 自然语言处理 算法
AI 应用之成本节约实践
本文探讨了如何避免高成本的模型微调,通过任务拆解和提示词调优实现业务目标。文中提到,当大语言模型不能直接满足需求时,微调涉及大量工作,包括数据准备、模型训练及GPU资源。为降低成本,作者提出了两步方法:1) 任务拆解,将复杂任务分解为简单子任务,利用模型优势处理部分;2) 提示词调优,优化输入以引导模型更高效地响应。虽然这可能不适用于所有情况,但能有效减少对模型微调的依赖。
65 1
|
1月前
|
机器学习/深度学习 人工智能 搜索推荐
构建基于AI的个性化新闻推荐系统:技术探索与实践
【6月更文挑战第5天】构建基于AI的个性化新闻推荐系统,通过数据预处理、用户画像构建、特征提取、推荐算法设计及结果评估优化,解决信息爆炸时代用户筛选新闻的难题。系统关键点包括:数据清洗、用户兴趣分析、表示学习、内容及协同过滤推荐。实践案例证明,结合深度学习的推荐系统能提升用户体验,未来系统将更智能、个性化。
|
1月前
|
语音技术 人工智能 机器学习/深度学习
构建基于AI的语音合成系统:技术探索与实践
【6月更文挑战第3天】本文探讨了构建基于AI的语音合成系统,包括文本预处理、声学模型、语音生成和后期处理四个步骤。关键技术和挑战涉及分词、词性标注、语调预测、HMM、DNN、RNN模型、波形合成及后期音质优化。实践中,获取高质量语音数据、训练计算资源和系统实时性是主要挑战。随着技术进步,未来语音合成将在多语种、个性化领域有更多应用。
|
2月前
|
人工智能 对象存储 异构计算
AI模型推理服务在Knative中最佳配置实践
Knative和AI结合提供了快速部署、高弹性和低成本的技术优势,对于一些需要频繁变动计算资源的AI应用,如模型推理等尤其明显。那么在Knative上部署AI模型推理时可以遵循这些最佳实践,以提升AI推理服务能力和GPU资源利用率。

相关产品

  • 实时计算 Flink版