小迈科技 X Hologres:高可用的百亿级广告实时数仓建设

通过本文,我们将会介绍小迈科技如何通过Hologres搭建高可用的实时数仓。

一、业务介绍

小迈科技成立于 2015 年 1 月,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司。始终坚持以用户价值为中心,以数据为驱动,为用户开发丰富的工具应用 、休闲游戏 、益智 、运动等系列的移动应用 。以成为全球领先开发者增长服务平台为愿景及使命,小迈希望通过标准化的产品和服务赋能,为开发者提供全链路解决方案,以技术+服务全方位保驾护航,助燃产品持续增长,帮助工具和休闲游戏的开发者提升产品的成功率。

小迈科技累计开发 400 余款产品,累计用户下载安装量破七亿 ,日活500-1000w,数据量每天 100 亿+。围绕高质量APP、用户增长和商业化变现,公司通过大数据技术相继搭建了商业化变现、智能推广、财务管理等10+应用系统。但用户量指数级增长,业务团队对数据实时化、精细化的要求提升,大数据系统开始备受挑战,如何更好的通过数仓建设为业务增长赋能成为重要突破点。

二、小迈数仓发展历程:从神策到流批一体实时数仓

为了满足业务团队的数据需求,小迈大数据技术团队从业务发展早期就开始建设数仓系统,从传统的神策阶段过渡到离线数仓,再发展到如今稳定的流批一体实时数仓共经历了3个阶段,从业务和技术的挑战中,不断对数仓系统进行迭代优化,从而支撑业务快速增长。下面将会进一步介绍小迈的大数据平台发展历程:

1、神策阶段

在最原始的阶段,业务系统基于神策实现。APP数据直接接入神策,初期只能看到APP内的行为数据, 以及广告数据,分析能力有限,不够灵活,无法自定义处理,不能和第三方数据进行整合分析,无法满足业务进一步要求。但因为业务还是起步阶段,数据平台的建设以满足现有业务需求为主,如果业务有特殊需求,再单独搭建对应的分析系统。

2、离线数仓(引入MaxCompute)

随着公司业务的不断发展,服务的用户越来越多,数据量指数级增长,对应的业务系统越来越多,每个系统之前也是割裂的,并且系统稳定性开始面临巨大挑战。基于神策的局限性,业务开始引入阿里云的MaxCompute、DataWorks和某分布式数据库(以下简称某DB)搭建离线数仓。业务的主要流程:

  1. 通过JDBC的方式拉去神策罗盘服务器,并通过DataWorks将数据离线同步至MaxCompute;
  2. 在MaxCompute中通过数仓四层建模(ODS、DWD、DWS、ADS),结果数据通过DataWorks离线同步至某DB;
  3. 在某DB中对接业务系统的各种分析需求。

离线数仓的引入基本满足了整个公司各个角色的分析决策,但随着业务的不断发展,会出现以下问题:

  • 系统间通过神策系统以JDBC的方式拉取数据,过度依赖第三方神策,过于耦合,神策出问题的时候,整个计算流程无法继续,无法满足业务的敏捷分析需求。神策恢复之后,手动参与重新跑数据,浪费了许多人力。
  • 数据统计完之后,数据入库慢,大大影响了整个链路的跑数时间,而业务对数据计算的实时性要求越来越高,现阶段无法支撑。
  • 数据量呈现指数级别的增长,分析维度越来越多,结果数据基本达到了明细数据级别,现有的数据查询引擎某DB不足以支撑这么大数据的多维度分析,面临最大的挑战就是对百亿级规模的行为数据做低延迟、高QPS的查询分析。
  • 为了解决查询引擎不足以支撑大数据量查询的问题,因此数据做了很多的前置计算,造成计算冗余,成本上升。
  • 同时系统越来越多,导致运维成本、开发成本也随之线性增长,导致无法快速满足业务的各种诉求。

由于上面阐述的痛点,导致频繁出现的现象就是数据产出变慢,经常卡死,严重影响业务决策,经常被业务部门投诉,影响极其不好。基于此,技术部门迫切需要找到解决方案。

3、流批一体实时数仓(引入Hologres+Flink)

为了更好的解决业务诉求,第三阶段在原有基础上引入了阿里云的Hologres和Flink,并由Hologres替换某DB,搭建了流批一体的实时数仓。主要数据链路如下:

1、日志数据和业务数据Kafka通过DataWorks实时同步写入MaxCompute,实时落地ODS层;对于数据时效性要求较要的业务,直接写入Flink,Flink里面进行实时ETL处理,然后写入Hologres。

2、三方数据则是通过DataWorks离线同步至MaxCompute,在MaxCompute中进行数仓分层(ODS、DWD、DWS、ADS)建设,并将处理好的数据直接写入Hologres。

3、由Hologres存储实时和离线数据,并直接对接上层应用,承载业务系统的多种查询要求,实现流批一体的实时数仓。

通过第三阶段Hologres+Flink+MaxCompute的流批一体实时数仓建设,已经成功支撑小迈科技的众多业务,包括数据化运营,BI,数据接口,业务中台等。新架构带来的好处有:

  • 数据结构化更清晰:对于不同层级的数据,它们的作用域不相同,每一个数据分层都有其作用域,这样业务在使用表的时候能更方便地定位和理解。
  • 数据血缘追踪:提供给业务使用的是一张业务表,但是这张业务表可能来源很多张表。如果有一张来源表出问题了,我们可以快速准确的定位到问题,并清楚每张表的作用范围。
  • 减少重复开发:数据分层规范化,开发一些通用的中间层数据,能够减少重复计算,提高单张业务表的使用率。
  • 简化复杂的问题:把一个复杂的业务分成多个步骤实现,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。有点类似Spark RDD的容错机制。
  • 减少业务的影响:业务可能会经常变化,这样做就不必改一次业务就需要重新接入数据。
  • 数据更加实时,业务决策更加迅速。
  • 数据与第三方进行解耦,稳健性更强。

三、为什么选择Hologres?

选择Hologres是我们从多个方面调研以及测试验证的结论。下面我们将结合业务从技术和使用场景两个方面讲述选择Hologres的原因。

1、支持高性能写入和极速复杂查询

最开始我们分别基于某DB和Hologres进行了性能验证,核心是针对查询 、写入进行验证, 因为离线数仓阶段,数据库最大的瓶颈就是查询性能和写入性能。

  • 查询性能: 基于目前实际的业务场景,包括简单及复杂 SQL进行查询性能验证,前期未做优化表现差不多,后面对Hologres的表设计和底层优化,我们验证出Hologres基本能有4倍左右的提升,后面也会跟阿里的同事一起做更多性能调优工作。
  • 写入性能:之前在某DB 的环境上,MaxCompute写入某DB的时间非常长(1 亿数据一个小时左右),特别是查询业务上来后, 写入性能有几倍的降速 ,甚至会宕机。而写入MaxCompute数据至Hologres的性能表现非常强悍, 1个亿的数据导入10多秒左右即可完成。

2、满足多个分析场景

结合MaxCompute+Hologres+Flink搭建的流批一体实时数仓,使得我们的系统应用场景更加丰富,主要包括:

  • 实时数仓: 由于Hologres 与 Flink 集成性好,通过实时的采集数据,Flink实时计算,直接将数据写到入 Hologres 中,就能实时构建实时大屏 、实时监控预警 、实时推荐 、实时训练等应用,快速响应业务需求。
  • MaxCompute加速查询:Hologres 可以直接通过外表的方式,对 MaxCompute 的数据进行查询,如果需要更高的性能,则可以将数据导入到 Hologres 中更高性能的查询处理。如果是前一种方式,则可以在数据不输出的情况下,对离线数据进行查询分析。
  • 自适应广告分析场景:Hologres有很多丰富的分析函数,比如留存分析函数和漏斗分析函数,这对广告业务的相关场景非常适用,无需我们二次开发,直接就能使用。

综上所述,无论从性能支撑还是使用场景都非常符合我们公司的业务需求。

四、百亿级用户行为分析最佳实践

用户行为是指用户在产品上产生的行为,通过对用户行为的分析,为提供下一步运营运策略提供辅助决策,同时也为产品迭代和发展提供方向。用户行为分析在互联网公司是非常普遍的一种场景,但大多数业务其核心痛点就是用户数据量大,计算逻辑复杂,导致计算性能不够好,往往不能及时拿到计算结果,从而影响下一步决策。

小迈在广告人群数据分析这个场景上,数据量约有上百亿,并且有很多的数亿行大表关联查询场景,之前的系统计算比较吃力,经常受到业务质疑。在现在的系统上,我们通过对Hologres中表的索引设计和性能调优,已经能达到非常明显的性能效果,下面我们具体介绍如何实现。

用户行为分析的流程如下:

1、MaxCompute中存放收入表income_dt_test,小时周期调度至Hologres结果表holo_ad_income_dt_test

2、Hologres存储用户行为表holo_dws_usr_label_df,通过Maxcompute周期性调度写入。

4、在Hologres中对两张表做关联Join计算,进行人群分析,示例分析SQL如下:

结合业务场景对表和SQL做了如下优化操作:

1.因为用户收入表和用户行为表需要做关联查询,因此设置分布字段distribution_key,保证相同的记录会被分配到同一个shard上,尽最大可能减少shuffle,尽量Local Join,所以设置以下分布键,大大提高了关联查询的速度,

CALL set_table_property('holo_dws_usr_label_df', 'distribution_key', 'product_id,device_id');
CALL set_table_property('holo_ad_income_dt_test', 'distribution_key', 'product_id,device_id');

2.因为报表筛选经常使用product_id、ad_id、position_id 三个字段,而bitmap_columns的使用场景就是等值查询,所以把这三个字段设置为bitmap_columns

CALLSET_TABLE_PROPERTY('public.holo_ad_income_dt_test','bitmap_columns','"product_id:on","ad_id:on","position_id:on"');

3.粗略估算每天的增量数据在1亿左右,因此设置为分区表,提高查询速度,数据量较小的时候不太建议设置分区,否则会影响查询性能。

4.在用户数去重的时候,需要用到大量count(distinct a.device_id),但是会消耗很多的资源,因此我们改用APPROX_COUNT_DISTINCT (a.device_id) 方式,性能提升很多,但是会丢失一定的精度,通过参数

set hg_experimental_approx_count_distinct_precision=20调节精度。

通过对表结构和SQL的优化,我们的广告人群数据分析能够实现秒级响应,大大提升了计算效率,也能快速响应业务需求。

五、Hologres读写分离高可用实现

1、优化背景:读写不分离相互影响

随着迁移到Hologres的业务越来越多,写入任务的频率越来越高,在高峰期实例开始出现查询异常和写入任务报错的情况。具体原因主要有:

  1. 每天上午十点左右是离线(T+1)任务写入的高峰期,在这个时间段大量报表统计任务聚集,对Hologres写入操作占用资源很多。
  2. 其中部分写入任务的数据量特别大,天增量的结果数据达到了几亿条,写入时间长,持续占用资源。而又有部分结果表字段数太多,达到了一千多个,消耗资源较多。
  3. 写入的同时,有部分MaxCompute读取Hologres外表的任务,造成连接数使用上涨,影响其他任务。
  4. 出报表的时间段也是是业务进行查询的高峰期,大量写入的同时有大量的查询在同时执行,相互影响。
  5. 写入任务存在自动重试机制,每次oom、timeout或其它异常报错时,任务会自动重跑占用资源,导致大面积的写入任务异常越来越多。

2、优化手段:Hologres共享存储实例部署

在这种情况下,我们对Hologres实例做了一些调整和优化,配置了Hologres的共享存储多实例,把读和写分离,将一个读写实例调整为一个主实例读写以及一个只读从实例,两个实例共用一份存储:

  • 将业务分成不同模块,同时将报表后台、tableau、生产业务等模块的只读查询迁移到只读从实例
  • 同步任务和少量的读写任务保留在读写主实例,不同模块数据存放在不同的schema,方便管理。

调整前:

调整后:

与此同时我们还根据业务现状做了一些其他优化,包括:

1、大写入任务增加session级的超时时间设置:set statement_timeout = 'Xmin' ;

2、写入之前对外表和内表进行ANALYZE ,更新统计信息加速写入;

3、取消Hologres写入任务的自动重试机制,避免影响后续的其它写入任务;

4、减少非必要的MaxCompute读取Hologres外表数据的操作,降低连接数的使用;

5、某几个数据量特别大的表,错开写入和查询高峰期,调整为其它时间段写入;

3、优化效果:系统稳定性显著提升

通过Hologres的读写分离实例部署和相关写入优化后,写入任务不再对查询任务造成影响,报表等系统能提供稳定的查询服务,同时写入任务资源使用和分配也更合理,不再出现oom之类的写入异常,系统服务稳定性有较大的提升。

后续,我们将会尝试把不同模块业务拆分到不同的只读实例,进一步增强服务的稳定性,带给服务使用方更好的体验。

六、业务价值

通过Hologres+Flink+MaxCompute搭建的流批一体实时数仓平台,支撑了小迈多个应用场场景,包括监控大盘,DMP人群等智能投放,财务分析等。显著的业务收益有:

1、上层服务共享数据

数据共享之后就由平台统一对外输出服务,各个业务线无需自行重复开发,就能快速得到平台提供的数据支撑,减少了数据孤岛。

2、亿级复杂查询秒级响应

通过Hologres自身的优秀查询性能,再配合建表和SQL的优化手段,大大提高了报表的响应速度,即使是用户画像、行为分析等亿级大表复杂关联查询也能很快出结果,得到了业务的认可。

3、系统读写分离稳定性强

通过Hologres共享存储实例部署的方式,让业务实现了读写分离,同时也只用了一份存储,既保证了系统的稳定性,同时也不会带来额外的成本压力。

作者:李云,小迈高级数据仓库开发工程师,数据仓库负责人、雷文,小迈数仓开发工程师。

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动云探索自主技术核心地带,拥抱开发者共筑全新技术生态

在数字经济向更多新领域渗透,5G、物联网等数字经济核心技术应用加速的助推下,云计算作为最主流的算力解决方案,需求增长迅速。随着国内云计算技术生态发展的不断成熟,各行各业上云的步伐也在不断加快。同时,由于企业的…

深度解读 RocketMQ 存储机制

RocketMQ 实现了灵活的多分区和多副本机制,有效的避免了集群内单点故障对于整体服务可用性的影响。存储机制和高可用策略是 RocketMQ 稳定性的核心,社区上关于 RocketMQ 目前存储实现的分析与讨论一直是一个热议的话题。本文想从一个不一样的视角&#x…

IOC-golang 的 AOP 原理与应用

AOP 与 IOC 的关系 AOP (面向切面编程)是一种编程设计思想,旨在通过拦截业务过程的切面,实现特定模块化的能力,降低业务逻辑之间的耦合度。这一思路在众多知名项目中都有实践。例如 Spring 的切点 PointCut 、 gRPC的…

达摩院技术创新全景|懂你的语音AI

过去十年,语音AI从实验室走向应用,语音搜索、交互早已融入日常。本文将带你一览达摩院语音AI技术创新全景,一起感受能听、会说、懂你的语音AI。 当你在家中与智能音箱进行交互对话,当你使用天猫超市或菜鸟裹裹,接到机器…

闲鱼对 Flutter-Native 混合工程解耦的探索

1. 闲鱼Flutter现状 闲鱼是第一个使用Flutter混合开发的大型应用,但闲鱼客户端开发最深入体会的痛点就是编译时长影响开发体验。在FlutterNative这种开发模式下,Native编译速度慢,模块开发无法突破。闲鱼集成了集团众多中间件,很…

算法通关第二十关-青铜挑战认识图结构

大家好我是苏麟 , 今天来聊聊图结构 . 我们平时在工作、学习中会大量使用图结构,不过呢在使用代码进行具体实现的时候极少使用图,主要是图里容易产生环,难以处理。 在算法里,考察图也不是很多,主要是图的表示非常复杂&…

我的前端成长之路:中医药大学毕业的业务女前端修炼之路

大家好,我是风月,2014年二进宫进入阿里,目前是业务平台体验技术数据服务前端团队负责人,负责 BizCharts 横向建设以及财鲸数据业务支撑。本次分享我将回顾作为业务前端从前端工程转型到数据可视化过程中的心路历程。 前端工程师的…

过去5年,PolarDB云原生数据库是如何进行性能优化的?

云数据库实现计算存储分离,支持计算与存储的独立扩展,其用户还可以享受按量付费等特性。这使得基于云数据库的系统更加高效、灵活。因此,构建并使用云原生数据库的势头愈演愈烈。另一方面,云化存储服务已经是云的标准能力&#xf…

ChatGPT 玩「脱」了,写了份毁灭人类计划书,还遭到了 Stack Overflow 的封杀.........

【CSDN 编者按】OpenAI 的新通用聊天机器人原型 ChatGPT 可谓是风靡一时,但却突遭 StackOverflow 封禁。整理 | 刘春霖 责编 | 张红月出品 | CSDN(ID:CSDNnews)在上周发布的《挑战 Google 搜索?OpenAI 发布最强 …

基于任务调度的企业级分布式批处理方案

背景 先来谈下什么是分布式批处理,从字面来理解就是有大批量的业务数据需要应用程序去批量计算处理,而通过单机模式去执行会耗费很长的处理时间,也不能充分发挥业务集群中每个应用节点处理能力。通过一些常见的分布式批处理方案,…

如何用一个插件解决 Serverless 灰度发布难题?

导读本文适合:想了解 Serverless 灰度发布的同学。认为当前 Serverless 灰度发布配置太复杂,寻求简洁版灰度发布流程的同学。想了解 Serverless Devs 组件和插件之间关系的同学。Serverless 灰度发布 什么是 Serverless ? Serverless 顾名思义就是无服…

阿里云云原生一体化数仓 — 分析服务一体化新能力解读

分析服务一体化一直都是阿里云离线实时一体化数仓的重要能力创新 分析服务一体化需求分析 业务在线化、运营精细化驱动数据实时化 随着互联网的信息,业务对于在线化、运营精细化的需求日益强烈,领导驾驶舱、实时大屏等,起到了越来越重要的…

Fortinet谢青:有信心在未来几年跻身SD-WAN市场份额首位

自创立以来,Fortinet始终引领网络和安全行业的融合创新发展,跻身变革前沿20余载。作为创始人、董事会主席兼首席执行官,谢青专门就目前行业的关键发展趋势、业务发展动向以及 Fortinet 如何帮助广大用户实现可持续发展目标畅谈了其观点和看法…

一位 sealer maintainer 的心路历程

引言 在 2021 年四月左右,我有幸在 sealer 启动初期了解到其相关工作,并且不久后就作为初始的几位开发同学之一,加入到了 sealer 的开发工作中。 本文,我将回顾个人参与 sealer 开源项目的机缘巧合,参与过程中的挑战…

龙蜥社区开源 coolbpf,BPF 程序开发效率提升百倍

引言 BPF 是一个新的动态跟踪技术,目前这项技术正在深刻的影响着我们的生产和生活。BPF 在四大应用场景发挥着巨大作用: 系统故障诊断:它可以动态插桩透视内核。网络性能优化:它可以对接收和发送的网络包做修改和转发。系统安全…

线上故障突突突?如何紧急诊断、排查与恢复

概述 稳定性大于一切,因此我们需要有更有效的方式避免线上故障。在发生故障不可避免的假设下,我们需要能够快速修复,减少线上影响。基于以上这些想法,我们提出了 1-5-10 的快恢目标,所谓 1-5-10 的目标就是是要我们对…

巧用 API 网关构建大型应用体系架构

近期阿里云重磅发布了BizWorks一体化的云原生应用的开发和运营平台,内置阿里巴巴业务中台构建的最佳技术实践。BizWorks提供的产品能力,普遍适用于企业云原生应用高效开发以及企业业务能力沉淀和复用的场景。BizWorks提供业务架构师一整套的可视化业务建…

可观测|时序数据降采样在 Prometheus 实践复盘

基于 Prometheus 的监控实践中,尤其是在规模较大时,时序数据的存储与查询是其中非常关键,而且问题点较多的一环。如何应对大数据量下的长周期查询,原生的 Prometheus 体系并未能给出一个令人满意的答案。对此,ARMS Pro…

倒计时1天!中国移动算力网络创新成果即将发布!

数字时代,随着计算机技术的普及,电脑及相关电子产品日新月异,给人们日常生活带来了翻天覆地的变化。多样化的电脑功能提高了各项事务协同管理的便捷性,电脑游戏也极大地丰富了人们的娱乐生活。未来电脑又会使人们的办公模式、娱乐…

托管式服务网络:云原生时代的应用体系架构进化

背景 回顾下应用服务架构体系的演进。从服务调用方与提供方的处理方式来看, 可以分为 3 个阶段。 第一个阶段是集中式负载均衡, 也就是说服务调用方是通过一个外部的负载均衡路由到对应的服务提供方。其优势显而易见, 对应用本身无侵入, 可以支持多语言多框架来开发实现应用本…