天猫国际通过Hologres进行排行榜的实时交互式分析

简介: 本文将会为您分享天猫国际如何通过Hologres实现计算、存储、服务统一的实时交互式分析。

作者:景闻 阿里巴巴数据技术及产品部数据技术专家

一.业务背景

天猫国际营销活动分析实时排行榜是在大促中帮助业务快速的分析商家或者品牌的交易和流量的数据情况,给下一步大促的销售目标,流量蓄水等等做出运营决策;尤其是在活动当天当发现行业的问题之后,仅仅靠子行业的拆分不足以确定具体的问题,也不一定有具体的业务抓手,所以需要有到商家、品牌和商品粒度的数据来快速定位问题。

1.png

二.原技术方案

原始技术方案的架构如下图所示,可以看到是非常典型的Lambda架构,实时和离线分别是两套系统,离线数据通过MaxCompute(原MaxCompute)轻度汇总同步至MySQL,实时增量数据通过Blink清洗后同步至HBase,最后在数据服务里面以View的形式将实时和离线数据合并,提供对外服务。
2.png

整个架构在实际业务执行中会有非常多的痛点,典型的有以下几个:

1)ADS层模型任务多

流计算和批处理任务都分别需要开发基于商品,卖家,品牌粒度的满足应用层的三个ADS模型数据,三个数据同步任务,分别需要创建三个oneservice服务,满足三个数据模块应用。

2)计算过程数据膨胀

在营销活动分析的场景下,看数据都是基于天猫国际业务类型和行业为大前提,因此通常在离线和实时的计算任务中,我们都是并行同时计算好不同的bu类型和所有的行业粒度的数据,这就导致了计算的过程中的数据的大量膨胀。

3)流批分离

当前产品上根据时间进行选择读取实时数据还是离线数据,三天之内的数据通过实时任务计算的数据,三天前的历史数据是通过批处理任务计算的离线数据,存在两套任务同时运行,增加了运维的复杂性。

4)产品搭建逻辑复杂

每一个产品展示的报表模块都需要通过实时数据提供的os接口和离线数据提供的os来进行,产品搭建的工作量比较大,通过时间来判断什么时候来读取离线os的数据,什么时候来读取实时os的数据,逻辑比较繁杂。

三.架构升级思考策略

思考:为了提升研发效率和产品搭建的效率,我们只需要开发到DWD层的明细数据,明细数据只需要存储叶子类目,在交互式分层层面按需去关联行业维表,来提供对外随机的查询服务,从而节省了构建ADS层的多个模型数据以及数据服务接口的时间,在产品搭建上基于一个数据接口就能满足多个不同的应用场景的数据服务,提升产品搭建层面的效率,降低了产品搭建时的逻辑代码的复杂性。

策略:我们希望能够有一款产品,能统一计算写入任务,做到流批统一,对外提供自由的交互式查询服务。

3.png

四.产品技术选型

在产品技术选型之前,需要先梳理业务需要用到的表以及数据量,选取几张最具代表性的表用于验证实际业务场景中产品技术可行性,以及验证关键指标性能问,包括查询QPS、写入TPS等。主要选取的表以及数据量如下:

(1) 交易明细数据表

| buyer_id + item_id +order_id |
|  20191111   |    4800W       |
|  20200618   |    600W        |
|  20200721   |    300W        |

(2)流量IPV明细数据表

| visitor_id + item_id           |
|  20191111   |    2.1亿         |
|  20200618   |    7000W         |
|  20200721   |    2600W         |

在技术选型方面,我们锁定了两款产品,一款是AnalyticDB for MySQL,一款是Hologres。ADB是阿里云数据库事业部团队提供的云原生数据仓库AnalyticDB MySQL版,是阿里巴巴自主研发的海量数据实时高并发在线分析云计算服务。Hologres是阿里云计算平台事业部提供的一款全面兼容PostgreSQL协议并与大数据生态无缝打通的实时交互式分析产品。从实际业务场景出发,两者的主要区别有以下几点:
1)与MaxCompute的打通性

Hologres:与MaxCompute打通,可以直接通过外部表读取MaxCompute数据进行查询分析,无需存储就能查询。

ADB:能加速查询MaxCompute,提供复杂交互式分析、实时混合数据仓库等多种场景。

2)成本方面
从我们每年ADB和Hologres的的单价上对比,Hologres成本相比ADB略微低。

3)灵活度
均能满足OLAP场景,Hologres兼容兼容PostgreSQL生态,ADB坚兼容MySQL协议,均能满足实时和离线批量的数据导入和分析。

4)性能
以下是Hologers的测试性能,数据量和大小均以MaxCompute的存储格式为准,没有进行一些特殊的索引和优化处理。

|  数据量              |   测试项                    |   响应时间
|  4600W(20.64GB)     |    SUM                      |   2.7s
|  2300W(5.04GB)      |    SUM                      |   1.1s
|  4600W(20.64GB)     |    COUNT                    |   2.5s
|  2300W(5.04GB)      |    COUNT                    |   1.0s
|  4600W(5.04GB)      |    COUNT(distinct)          |   2.8s
|  2300W(5.04GB)      |    COUNT(distinct)          |   1.6s
|  4600W(20.64GB)     |    AVG                      |   1.7s
|  2300W(5.04GB)      |    AVG                      |   0.9s
|  4600W(20.64GB)     |    ROW_NUMBER               |   2.6s
|  2300W(5.04GB)      |    AVG                      |   2.2s

结论:综合很多种种因素,我们最终选择Hologres作为交互式分析的查询引擎

五.技术架构升级

使用Hologres后的架构如下图所示。

4.png

技术架构升级后,主要有以下几个优势:

1. 计算统一

商品和卖家以及品牌粒度页面的数据统一通过一个实时计算任务来统一计算,计算过程中不关联行业和业务BU类型的维表,在交互式分析端按需统一通过商品ID和叶子类目ID进行关联维表查询。提升了研发的效率和降低了运维的难度,也没有做到计算任务的膨胀,节省了计算资源。

2. 存储统一

统一通过Hologres的内部分区表的形式存储实时写入的交易和流量明细数据,提供的统一的数据管理和维护,将存储统一即可实现同库间的任意交互式分析查询服务。

3. 服务统一

商品和卖家以及品牌粒度的页面均可以通过一份通用的具有占位符的FBI的数据集来实现,通过FBI的报表模式实现数据可视化,提升了产品搭建的效率。

六.Hologres实战

下面将会讲述Hologres在实时排行榜中的具体实践过程:

1.建表模型设计

首先第一个是表设计,合理的表设计能够大大提升查询效率,尤其是当数据量变大的时候,相关索引的选择和配置对性能优化有着非常大的作用。所以在Hologres中创建表之前,一定要想清楚表的使用场景,查询逻辑。
在该方案中,由于需要涉及到交易的明细数据按照商品,卖家,品牌粒度汇总和流量数据进行join,同时还需要按照行业以及bu类型进行检索,主要用到的表DDL如下:

sql
CREATE TABLE IF NOT EXISTS public.dwd_intl_trd_pay_itm_buyer_ri( 
stat_date text not null 
,stat_hour text not null 
,bu_id text not null
,bu_id_level1 text not null
,bu_id_level2 text not null
,item_id text not null
,item_title text
,item_tier text
,seller_id text
,seller_nick text
,seller_level text
,brand_id text
,brand_name text
,cate_id text not null
,pay_time text
,buyer_id text not null 
,div_idx_actual_total_fee float8
,is_wap text
,is_jhs text
,biz_order_id text not null
,buy_amount int8
,PRIMARY KEY (stat_date,stat_hour,item_id,buyer_id,biz_order_id)
)
PARTITION BY LIST(stat_date);
CALL SET_TABLE_PROPERTY('public.dwd_intl_trd_pay_itm_buyer_ri', 'orientation', 'column');
CALL set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri', 'storage_format', 'segment');
CALL set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri', 'segment_key', 'stat_date,stat_hour,bu_id,bu_id_level1,bu_id_level2,cate_id');
call set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri', 'distribution_key', 'stat_date,stat_hour');
CALL set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri', 'shard_count’, ‘30');CREATE TABLE IF NOT EXISTS public.dwd_intl_log_ipv_itm_visitor_ri( 
stat_date text not null 
,stat_hour text not null 
,bu_id text not null
,bu_id_level1 text not null
,bu_id_level2 text not null
,item_id text not null
,item_title text
,seller_id text
,seller_nick text
,brand_id text
,brand_name text
,cate_id text not null
,visitor_id text not null 
,ipv int8 
,PRIMARY KEY (stat_date,stat_hour,item_id,visitor_id)
)
PARTITION BY LIST(stat_date);
CALL SET_TABLE_PROPERTY('public.dwd_intl_log_ipv_itm_visitor_ri', 'orientation', 'column');
CALL set_table_property('public.dwd_intl_log_ipv_itm_visitor_ri', 'storage_format', 'segment');
CALL set_table_property('public.dwd_intl_log_ipv_itm_visitor_ri', 'segment_key', 'stat_date,stat_hour,bu_id,bu_id_level1,bu_id_level2,cate_id');
call set_table_property('public.dwd_intl_log_ipv_itm_visitor_ri', 'distribution_key', 'stat_date,stat_hour');
CALL set_table_property('public.dwd_intl_log_ipv_itm_visitor_ri', 'shard_count', ‘50');

同时借助Hologres的表属性设置,根据业务场景针对性优化,主要有以下几点:

(1)基础属性的设置

distribution_key

指定分布列,数据将按照指定列,shuffle到各个shard

set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri', 'distribution_key', 'stat_date,stat_hour,brand_id,seller_id');

clustering_key

指定一些列作为聚簇索引

set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri‘, 'clustering_key‘,'stat_date,stat_hour,cate_id');

segement_key

文件索引,数据按该索引划分文件,可以通过segement_key快速索引到某一文件

set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri', 'segment_key', 'stat_date,stat_hour,bu_id,bu_id_level1,bu_id_level2,cate_id');

(2)高级属性的设置

设置合理的TableGroup

Table Group非常关键的作用就是做local join,从而大大提升join效率,尤其是多表和比较大数据量join的时候

call set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri', 'colocate_with', 'public.dwd_intl_log_ipv_itm_visitor_ri');

设置Shard_count

数据量:7亿/230GB的数据量,设置在2Kcore左右,交易30和流量50
实例资源:1个shard至少需要1个core来负责计算
写入性能:根据交易和流量的RPS来指定
Join需求:有夺标join的查询case时,需要考虑TableGroup

sql
CALL set_table_property('public.dwd_intl_trd_pay_itm_buyer_ri', 'shard_count', '30');
CALL set_table_property('public.dwd_intl_log_ipv_itm_visitor_ri', 'shard_count', '30');

通过一系列的优化,在实际业务场景中达到的优化效果如下:

1)用户增加五端通模块从90s-->8s
2)淘宝直播模块查询从9s-->2s
3)当前实时查询1.8s

2.Hologres与实时Blink的融合

当前流计算任务的开发是基于dataphin平台上采用BlinkSql进行的,这个平台让实时任务的开发变得相当的容易,这里主要记录下当Hologres作为实时任务的sink的时候的一些需要注意的点:

1)sink表创建

  • 在实时任务开发的时候,任务的sink operator需要写到Hologres的时候,需要在dataphin平台上创建源表,这个表需要同Hologres中的表字段和类型都要保持一致,否则就会出现写入成功,完全查询不出来数据的情况发生。

2)分区路由设置

  • 当Hologres中的表是分区表的时候,实时任务是写父表,数据会根据分区字段进行数据的路由动态写入子表中(就是分区表),但是这个子表需要提前创建好,否则实时任务会Failouver。分区子表的创建一般是通过dataworks的离线调度进行创建,天/周/月的创建都行。
  • dataphin设置:set tovsbi.dwd_intl_log_ipv_itm_visitor_ri.partitionRouter='true'
  • sdp原生的设置:创建sink表的时候,在with后面添加 partitionRouter = 'true'

3)数据写入策略

  • 对于Hologres中有设置主键的表,这个时候需要考虑实时任务写入Hologres的数据写入策略。insertOrUpdate这个属性进行控制,Holo导入时默认会丢弃掉重复的pk,配置为true将开启Update功能
  • dataphin设置:set tovsbi.dwd_intl_log_ipv_itm_visitor_ri.insertOrUpdate='true'
  • sdp原生的设置:创建sink表的时候,在with后面添加 insertOrUpdate

3.数据可视化展现

Hologres兼容PostgreSQL生态,提供JDBC/ODBC Driver,因此可以直接对接BI工具实现可视化展现,在实际业务中,主要用到数据服务(阿里内部叫oneservice)和FBI(阿里集团内的一款可视化报表工具)。

1)数据服务

在数据中台的数据建设和数据服务的链路上,我们常常需要按照生产者和消费者的模式一样,通过oneservice将我们开发好的持久化的数据提供的统一的数服务。最初原生的方案设计是按照如下链路[1]进行的

5.png

但是在实际过程中,由于oneservice对于交互分析这样的场景支持的很弱,尤其是涉及到查询逻辑涉及到join的实时,就会出现timeout以及一些其他的问题。其次oneservice将查询query下推到Hologres查询的时候,oneservice很多的pg生态的语法都不支持。最终我们通过上图的链路[2]也就是通过FBI内置的Postgresql引擎来直接连Hologres实现数据查询服务的。

2)FBI可视化

数据集动态配置

FBI层面通过创建数据集,将商品,卖家,品牌的三个页面统一分析,力争通过一个数据集来动态实现查询服务,这里需要涉及到数据集中应用到的占位符和基于vilocity语法来实现动态的配置。

pythonfrom    dwd_intl_trd_pay_itm_buyer_riwherestat_date = '${bizdate:20200722}' #if ((! ${bu_level_two} ) and (${bu_level_one} == "111"))and bu_id = '${bu_level_one}' #elseif ((! ${bu_level_two}  ) and (${bu_level_one} != "111"))and bu_id_level2 = '${bu_level_two}' #elseif (( ${bu_level_two}  ) and (${bu_level_one} == "111"))and bu_id = '${bu_level_one}' #elseif (( ${bu_level_two}  ) and (${bu_level_one} != "111"))and bu_id_level1 = '${bu_level_one}' #elseand bu_id_level1 = '${bu_level_one}'#endgroup  by  '${dims}'

页面布局设计

FBI的页面布局设计这个比较简单,直接通过报表的模式展示即可,但是需要同营销活动分析的级联模式保持一致,尤其是涉及到行级关联的一些地方还是需要一些技巧和设置的,否则初始化的性能不太好。最终的页面和查询如下:
6.png

七.业务价值

总结来说,使用Hologres之后,除了上面讲诉的做到了计算、存储、服务统一的优势之外,从业务上来说还有以下几个突出价值:

1.提升数据分析效率

将公共层的明细数据存入Hologres,提供给业务方能够进行随意交互式分析,相比于以前的cube模型的需要关联多个模型的取数方式,极大的提升了数据分析的效率。

2.节省数据回刷资源

整个公共层明细数据在行业的维度只包含叶子类目数据,在每年的行业类目调整中,不会因为类目维表的变更,导致进行回刷数据,极大的节省了回刷的数据资源。

八.未来规划

1.节省存储空间

由于需要看历史数据,所以需要保存最近400天的数据,明细数据太过于庞大,因此需要将历史数据进行汇总,有成交的商品是27W X 400 = 1亿+(大促会比较大) 降低存储压力,同时也会同Hologres技术团队一起引入高压缩比的存储格式。

2.继续优化当前技术

当前通过Hologres的交互式分析技术和FBI的可视化工具能够做到查询均在3s左右,但还是有很多的一些可以化的细节的地方,比如查询的优化,FBI可视化工具搭建以及使用的一些小问题上,需要结合Hologres技术团队,FBI的技术团队一起来共建,反哺技术链的建设更加完善。

3.数据回刷方案

当前的技术方案不存在因为行业的频繁调整而带来的大量历史数据回刷的问题,但是如果存在一些逻辑的调整或者一些不可控的因素导致需要回刷历史数据,因此需要设计实时的数据回刷方案。

4.复用到更多交互式分析场景

由于当前的Hologres中存储的大量的交易和流量的IPV明细数据,因此在很多的数据看板,数据分析中都存在可以直接复用当前数据,直接在数据集上进行自由的交互式分析,提升数据研发,数据分析,产品搭建等研发效率。

 

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

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

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

相关文章

官宣!《新程序员·开发者黄金十年》正式发布

“在互联网还不发达的时代,就是《程序员》伴我成长的。”“怀念啊,曾经《程序员》的日子。”“我是看着《程序员》长大的,大二时买了创刊号。”“这可是我们这一代人大学时候满满的回忆,也是当时寝室中传阅最多的书。”“每年的《…

OpenKruise:解放 DaemonSet 运维之路

简介: 我们希望 OpenKruise 让每一位 Kubernetes 开发者和阿里云上的用户都能便捷地使用上阿里巴巴内部云原生应用所统一使用的部署发布能力! 作者 | 王思宇(酒祝) 前言 OpenKruise 是阿里云开源的大规模应用自动化管理引擎&…

云原生数据湖解决方案打破数据孤岛,大数据驱动互娱行业发展

简介: 数据湖是以集中、统一方式存储各种类型数据,数据湖可以与多种计算引擎直接对接,我们使用OSS作为数据湖底座,数据统一存储在OSS中,有效消除了数据孤岛现象,多种计算与处理分析引擎能够直接对存储在数据…

三角形已知边长求高公式_五年级数学:“长方形、正方形、三角形、平行四边形、梯形” 知识重点、难点全解析,附习题!...

张老师 - 5年级(多品小学教育)里辛镇中心小学谭老师和冰溪镇县后山小学谭老师需要的这份学习资料现在分享。本资料已制作电子版下载码是:5odc7n2i多边形的面积知识点1公式长方形:周长(长宽)2 ;字母公式:C(ab)2 面积长宽&am…

阿里技术文档:Redis+Spring全家桶+Dubbo精选+高性能+高并发

最近花了很长的时间去搜罗整理Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档。今天就把这些东西分享给老铁们,也能为老铁们省去不少麻烦,想学什么技能了,遇到哪方面的问题了 直接打开文档学一学就好…

持续定义Saas模式云数据仓库+BI

云数据仓库概述 今天和大家一起探讨一下我们Saas模式下云数据仓库加上商业智能BI能有什么新的东西出来。我们先来看一下云数据仓库的一些概述。预测到2025年, 全球数据增长至175ZB, 中国数据量增长至48.6ZB。数据量暴涨这个前提下,我们看一下…

多项式拟合lm_R语言多项式回归

含有x和y这两个变量的线性回归是所有回归分析中最常见的一种;而且,在描述它们关系的时候,也是最有效、最容易假设的一种模型。然而,有些时候,它的实际情况下某些潜在的关系是非常复杂的,不是二元分析所能解…

AI和大数据下,前端技术将如何发展?

简介: 2010年前后,各种大数据应用进入爆发期。如果说之前的Web应用更多地是在“产生”数据,那在2010年之后,如何更好地“展现”数据则被提上了新的高度,很多前端技术也随之打开了新的篇章。本文作者结合自己的实践&…

漫话云计算,这次加了点儿剧情

“云计算”这个词相信大家都非常熟悉作为目前最热门的科技概念之一它频繁地出现媒体的报道中专家们也经常将它挂在嘴边为它摇旗呐喊那么,究竟什么是云计算呢?它到底有什么用?相比传统计算,它有什么特别之处?今天这篇漫…

阿里云数据湖解决方案全面满足数据需求,帮助企业释放数据价值

简介: 基于阿里云对象存储OSS构建的数据湖解决方案,可以全面满足数据的存储、离线分析、交互查询等各种业务诉求,帮助企业释放数据的价值 1、行业综述 游戏市场需求旺盛,行业景气度持续提升 2020年突如其来的疫情,使…

微服务学习专栏

文章目录一、 Springboot 开源项目推荐1. SmartAdmin2. SPTools3. el-admin4. RuoYi-Vue5. mall6. OA系统开源一、 Springboot 开源项目推荐 1. SmartAdmin 项目地址:https://gitee.com/lab1024/smart-admin 2. SPTools 项目地址:https://gitee.com/52…

云原生时代,应用架构将如何演进?

简介: 如何借助云原生技术来提升交付速度?云原生时代背景下,研发的关注点又会有哪些转变?阿里云高级技术专家许晓斌通过本文分享从 IaaS 上云时代到 PaaS 上云时代的应用架构演进方向,以及云原生技术与应用架构演进的关…

Serverless 对研发效能的变革和创新

简介: 对企业而言,Serverless 架构有着巨大的应用潜力。随着云产品的完善,产品的集成和被集成能力的加强,软件交付流程自动化能力的提高,我们相信在 Serverless 架构下,企业的敏捷性有 10 倍提升的潜力。 作…

查看mysql服务的可视化_Prometheus 监控Mysql服务器及Grafana可视化

Prometheus 监控Mysql服务器及Grafana可视化、mysql_exporter:用于收集MySQL性能信息。使用版本mysqld_exporter 0.11.0官方地址使用文档:https://github.com/prometheus/mysqld_exporter图标模板:https://grafana.com/dashboards/7362下载地…

SprinBoot 集成 Flowable/Activiti工作流引擎

文章目录一、 Flowable工作流引擎1. flow2. flowable3. cims4. RuoYi-flowable5. springboot-flowable-modeler6. flowable-diagram二、Activiti 工作流引擎2.1. RuoYi-Vue-Process2.2. RuoYi-Process2.3. ruoyi-vue-activiti2.4. activiti7-workflow2.5. JeeSite4 JFlow2.6. a…

持续定义Saas模式云数据仓库+实时分析

简介: 从实时分析的价值、场景和数据流程,以及用户对平台能力要求展开,讲述云数据仓库MaxCompute的产品能力优势 ,面对实时分析场景的能力演进要求。进而以实时分析典型场景的全数据流程处理、建模和分析的最佳实践,讲…

超 8 成软件存已知高危开源漏洞,奇安信发布《2021 中国软件供应链安全分析报告》

编辑 | 宋 慧 出品 | CSDN云计算 头图 | 付费下载于东方IC 2020年底,SolarWinds 遭受的大规模网络攻击,使得美国和多国政府在内的 18000 机构被影响。几乎每个月,软件供应链都在遭受黑客攻击。 而从软件端看,“检测发现&#xf…

前后端分离 常用工具汇总

文章目录一、数据框架1. vue2. react二、UI框架2.1. element2.2. element-plus2.3. Ant Design Vue2.4. Ant Design of React2.5. Bootstrap三、工具3.1. Fast Mock3.2. Easy Mock3.3. Mock语法/案例一、数据框架 1. vue https://cn.vuejs.org/ 2. react https://react.do…

Fluid 0.3 新版本正式发布:实现云原生场景通用化数据加速

简介: 为了解决大数据、AI 等数据密集型应用在云原生计算存储分离场景下,存在的数据**访问延时高、联合分析难、多维管理杂**等痛点问题,南京大学 PASALab、阿里巴巴、Alluxio 在 2020 年 9 月份联合发起了开源项目 Fluid。近期我们更新了0.3…

mysql 主从 跳过_mysql主从同步如何跳过错误

mysql主从同步跳过错误的方法:1、跳过指定数量的事务,代码为【mysql>SET GLOBAL SQL_SLAVE_SKIP..】;2、修改mysql的配置文件,通过【slave_skip_errors】参数来跳所有错误。本教程操作环境:windows7系统、mysql 5.6…