升级JSONB列式存储,Hologres助力淘宝搜索2022双11降本增效!

news2025/1/10 17:24:56

作者:陆晨炜(花名遣云)阿里巴巴智能引擎事业部数据开发

前言:

2022年的双11,阿里淘宝搜推集群承载上千万每秒的的流量峰值,消费者的每一次浏览、点击都通过搜推集群进行流转,与往年双11不同的是,降本增效在今年也变成了特别重要的一个技术课题。在此背景下,阿里搜索推荐团队与Hologres深度合作,在技术上,通过将传统的Text Array升级为JSONB,并使用JSONB列式存储,相比去年双11实现查询性能提升 400%+ ,存储下降45%,共资源节省数千core(预计节省成本数百万元),接受住双11生产稳定性考验,真正实现降本增效。

通过本文我们将会详细介绍Hologres JSONB在阿里搜索推荐团队的实践,以帮助更多企业通过技术手段助力业务快速增长。

业务介绍

阿里巴巴搜索推荐事业部的实时数据仓库承载了阿里巴巴集团淘宝、淘宝特价版、饿了么等多个电商业务的实时数仓场景,提供了包括实时大屏、实时报表、实时算法训练、实时A/B实验看板等多种数据应用支持。从2019年开始,搜索团队开始与Hologres进行共建,通过Hologres支撑了搜索推荐的多个应用场景,包括即席多维分析,A/B test等,详情可以查看往期精彩内容:

阿里巴巴电商搜索推荐实时数仓演进之路

Hologres在阿里搜索推荐实时数据场景下即席多维分析的最佳实践

通天塔是搜索团队对外提供的实时数据分析产品,提供了手淘搜索、手淘推荐、拍立淘等多个业务的实时A/B报表服务,其重要功能之一为对A/B实验进行实时的对比观测。举个例子,算法同学需要看实验分层layerA下的1、2两个分桶的效果对比,需要从实时的数据分别统计 layerA:1、layerA:2 两个桶的指标,并计算GAP值。算法同学通常会通过通天塔报表查询实时的A/B实验效果,并对算法模型进行评估和调整。在实时报表中,我们还提供了各种维护的筛选项帮助用户对数据进行深入分析,如:用户属性、商品属性、类目属性、卖家属性等。

在这里插入图片描述

下图为通天塔主要的实时数据链路示意图,我们将采集到原始日志从TT(Datahub)中读取,在Flink流作业中,我们会对日志进行ETL处理,其中包括根据日志中的用户ID、商品ID、商家ID等关联对应的维表,并将相关属性字段一同存储到Hologres表,最后通过实时报表生成SQL Query,进行实时数据的查询分析。

在这里插入图片描述

我们近年来一直使用Hologres作为通天塔的实时数据查询引擎,因为我们的业务场景中,有很多的用户标签、商品标签、卖家标签和算法桶号等多值属性,以用户标签为例,业务上对用户的画像属性不是一成不变的,业务可能随时需要新增一类属性进行观测,如果每次都需要用一个新的字段来存储新的用户属性,那在整个实时链路上都会显得低效。因此在建表时,我们通常使用Text Array(text [])类型作为多值字段的存储格式。

用户属性相关的标签都会以Text Array的形式存储到同一个字段中,需要业务有变化需要新增字段,Flink任务、Hologres表、实时报表中都不需要进行额外的修改。这从运维效率和数据时效性来看,都是很合适的选择。对于商品、卖家等属性标签和算法桶号,也同样是这些优点驱动我们选择了使用Text Array,并稳定支撑了历年的双11,其中2021年双11 Text Array的平均查询延迟为1070ms。

但Text Array也并不是完美无缺的,在有限的资源配置下,当查询QPS较高时,尤其是大促期间,我们会遇到查询慢、查询超时的问题,经分析这与Text Array自身在查询性能上的限制有较大关系,这就使得我们不得不断累加资源来提升性能,从而也导致我们的成本剧增。

为了解决这一问题,并实现降本提效的目标,本次双11前,通过与Hologres团队的合作,我们成功将Text Array 升级为性能更高、存储更低的 JSONB 格式作为算法桶号、用户标签等多值字段的存储格式,并在今年双11生产路落地,支撑上百万写入RPS,查询性能提升400%+,节约数千core资源。

业务实践:Text Array格式升级为JSONB格式

1. 原Text Array格式

1.1 表结构与数据示例

我们之前使用Hologres(Text Array格式)存储了实时的明细数据,表的结构如下:

CREATE TABLE wireless_pv (
  second_timestamp timestamp with time zone NOT NULL,
  pk text NOT NULL,
  uid text NOT NULL,
  item_id bigint NOT NULL,
  seller_id bigint NOT NULL,
  cate_id bigint,
  bts_tags text[] NOT NULL
  ,PRIMARY KEY (pk, user_name)
);

这张表为曝光明细表,其中主要的字段包括:

  • 时间戳
  • pk,用于写入去重
  • UID
  • 商品ID
  • 卖家ID
  • 类目ID
  • 分层分桶标签,字段类型为text array,存储该用户所属的多个分层、分桶

数据示例

second_timestamppkUIDbts_tags
2022-11-11 00:00:00+08858739e966f7ebd1cfaa49c5647413601{“layerA:1”, “layerB:11”, “layerC:111”}
2022-11-11 00:00:01+08e7e3d71fac5a92b87c3278819f6aff8c2{“layerA:1”, “layerB:12”, “layerC:112”}
2022-11-11 00:00:01+08828f07dc16f4fa2f4be5ba3a9d38f12a3{“layerA:2”, “layerB:11”, “layerC:111”}
2022-11-11 00:00:02+08b0c419c119658dfa0fd5f914e251af1d4{“layerA:2”, “layerB:12”, “layerC:112”}

1.2 Text Array查询语法与示例

我们在查询时使用了Hologres提供的array_extract()函数进行了桶号等Text Array字段的分组统计,使用 &&操作符进行数据过滤,具体查询示例如下:

SELECT
    array_extract (bts_tags, ARRAY['layerA:1', 'layerA:2']) AS "bts_tags",
    count(1) AS "pv"
FROM
    wireless_pv
WHERE
    second_timestamp >= TIMESTAMPTZ '2022-11-11 00:00'
    AND second_timestamp <= TIMESTAMPTZ '2022-11-11 23:59'
    AND bts_tags && ARRAY['layerA:1', 'layerA:2']
GROUP BY
    array_extract (bts_tags, ARRAY['layerA:1', 'layerA:2'])
;

如果业务需要临时变更标签属性,那么我们可以通过Text Array非常灵活的增加字段,对我们的开发效率和运维效率来说也是非常高效的。这种查询方式我们已经稳定使用了几年,能满足日常的业务需求,但美中不足的是,当数据量变大时,要计算的标签变多,尤其是大促期间,如上的SQL示例,如果我们要取某个标签的数据,需要经过一系列的Array解析,查询延迟就会增加,这就导致我们需要通过加资源的方式去支撑性能,我们期望能够用一种更加友好的方式,在不牺牲灵活性的前提下,平衡好性能和资源之间的关系。

2. 升级为JSONB格式并开启列式存储

Hologres从 V0.9版本就开始支持JSON了,但是在查询效率上还是不能够满足业务需求,因为要把一个JSON里面把所有的value都解析一遍,比较费劲。正好Hologres在1.3版本支持了JSON的列存存储,可以减少JSONB的存储并加速查询(关于JSONB的列式存储详细介绍可以参考Hologres的文档)。为了解决Text Array的性能问题,于是我们将实例升级到了1.3版本,并使用JSONB列式存储来替换原先的Text Array。

2.1 表结构与数据示例

升级后的表结构如下所示,我们将text[] 字段改成了JSON类型,这里仅以分层分桶字段作为示例:

CREATE TABLE wireless_pv (
  second_timestamp timestamp with time zone NOT NULL,
  pk text NOT NULL,
  uid text NOT NULL,
  item_id bigint NOT NULL,
  seller_id bigint NOT NULL,
  cate_id bigint,
  bts_tags JSONB 
  ,PRIMARY KEY (pk, user_name)
);
-- 同时需要打开JSONB列式存储优化
ALTER TABLE <table_name> ALTER COLUMN <column_name> SET (enable_columnar_type = ON);

我们使用Flink将实时数据从TT写入Hologres,由于TT中存储的bts_tags字段是用分隔符分隔的多个分层分桶,因此我们还实现了UDF,将分隔符分隔的字符串数据转换为JSON格式的字符串。因为是直接写入JSON格式,因此也能达到像Array一样的灵活性,即使需要加标签,也可以随时加,不会牺牲开发效率。

写入后的数据示例如下,其中分层分桶字段是符合JSON的格式:

second_timestamppkUIDbts_tags
2022-11-11 00:00:00+08858739e966f7ebd1cfaa49c5647413601{“layerA”:“1”, “layerB”:“11”, “layerC”:“111”}
2022-11-11 00:00:01+08e7e3d71fac5a92b87c3278819f6aff8c2{“layerA”:“1”, “layerB”:“12”, “layerC”:“112”}
2022-11-11 00:00:01+08828f07dc16f4fa2f4be5ba3a9d38f12a3{“layerA”:“2”, “layerB”:“11”, “layerC”:“111”}
2022-11-11 00:00:02+08b0c419c119658dfa0fd5f914e251af1d4{“layerA”:“2”, “layerB”:“12”, “layerC”:“112”}

2.2 JSONB查询语法与示例

在对JSONB格式数据查询和过滤时,我们主要使用了 ->>操作符提取JSONB中的value,这里分组查询时候变得更为简单,不再需要使用性能相对一般的array_extract函数,相应的查询示例如下:

SELECT
    'layerA:' || (bts_tags ->> 'layerA') AS "bts_tags",
    COALESCE(sum(scene_count), 0) AS "pv"
FROM
    wireless_pv
WHERE
    second_timestamp >= TIMESTAMPTZ '2022-11-11 00:00'
    AND second_timestamp <= TIMESTAMPTZ '2022-11-11 23:59'
    AND bts_tags ->> 'layerA' IN ('1', '2')
GROUP BY
    'layerA:' || (bts_tags ->> 'layerA')
;

3. 数据验证与性能测试

3.1 性能测试准备

在对Hologres格式正式升级切换前,我们对JSONB存储的数据和Text Array对比进行了性能验证。

  • 准备相同Text Array和JSON数据:从日常的查询中采样一部分Text Array Query,将Query转为JSONB查询语法,然后将转换前后的Query分别进行查询,并对比查询结果是否一致。
  • 导入手淘搜索数据,时间范围为:20220920 11:00-15:00
  • set hg_experimental_enable_result_cache=off;不查缓存

3.2查询性能测试结果

在同一个集群下,依次执行以上Query,循环6次,统计每个Query的平均耗时(毫秒):

表名Array格式查询平均延迟(ms)JSONB格式查询平均延迟(ms)JSONB性能提升
wireless_pv5975.51553.8280%
wireless_dpv862.5455.889%

可以看到:在同等资源配置下,在手淘搜索查询的典型场景下,分层分桶等多值字段升级到JSONB格式后,将带来至少100%以上的查询耗时降低。这一性能上的巨大提升,大大改善了我们之前遇到的查询高峰期的查询慢和查询超时问题;同时按此估算,我们可以对当前Hologres实例的CPU资源缩减一半以上,有力推动完成降低成本的目标。

3.3存储成本对比

同时,上文也提到,我们开启了Hologres的JSONB列式存储,通过对比,我们也发现开启列式存储之后,数据的存储也有一定的下降。以淘宝搜索的曝光、点击表为例,

表名Array 格式存储量JSONB格式存储量存储下降%
wireless_pv35 TB15 TB-57%
wireless_dpv3472 GB1562 GB-55%

可以看到:升级到JSONB列式存储后,表存储整体下降了55%+,这也可以进一步帮助业务节省存储资源。

接受双11生产考验,JSONB查询性能提升400%+

在今年双11,搜推集群承载了上千万每秒的流量峰值,上百万每秒的查询流量峰值,同时JSONB升级也在部分业务场景中上线,历经双11大促流量高峰的考验,写入RPS达百万每秒,在未对写入和查询执行限流的情况下,Flink实时写入未发生延迟问题,平均查询延迟仅199ms。

相比去年双11,升级JSONB格式后,查询性能提升400%+(2021双11平均查询延迟为1070ms),存储下降45%,资源节省数千core,有效节约数百万元成本,真正实现降本增效,而系统的灵活性和业务开发效率没有丝毫下降,进一步助力万千消费者买到心仪物品,进一步提升购物体验!

在后续的工作中,我们也准备对通天塔接入其他业务,根据业务特点设计JSON格式,对实时数据表进行JSONB格式的升级,预计将带来接近50%的Hologres计算成本的降低。

了解Hologres:https://www.aliyun.com/product/bigdata/hologram

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

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

相关文章

[附源码]Python计算机毕业设计高校学生心理健康信息咨询系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

万字长文——MySQL基础一篇打通

准备工作 直接使用MySQL提供的数据&#xff0c;下载MySQL示例数据库 MySQL示例数据库模式由以下表组成&#xff1a; Customers&#xff1a;存储客户的数据。Products&#xff1a;存储比例模型车列表。ProductLines&#xff1a;存储产品系列类别列表。Orders&#xff1a;存储…

Web(九)JavaScript概述-JavaSript知识训练-入门基础

1、JavaScript是运行在( B)的脚本语言。 A、 服务器端 B、 客户端 C、 在服务器运行后&#xff0c;把结果返回到客户端 D、 在客户端运行后&#xff0c;把结果返回到服务端 2、JavaScript代码通常是用&#xff08; D&#xff09;标签嵌入到html文档的。 A、 JavaScript B、 La…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.5 查询Tomcat【实现查询】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.5 查询Tomcat【实现查询】48.5.1 使用Http函数查询数据48 多级缓存 48.5 查询Tomcat【…

docker容器监控

docker容器监控 一、docker介绍 Docker的中文意思就是码头工人&#xff0c;进入到Docker的官方网站后&#xff0c;也可以看到Docker的图标&#xff0c;如下图所示。 这个Docker图标上就是一条鲸鱼&#xff0c;上面有很多集装箱&#xff0c;集装箱就相当于虚拟环境&#xff0c…

股票信息网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

基于java+springmvc+mybatis+vue+mysql的志愿者招募网站

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把志愿者招募管理与现在网络相结合&#xff0c;利用java技术建设志愿者招募网站&#xff0c;后端使用ssm框架&#xff0c;前端使用vue技术&#xff0c;实现志愿者招募的信息化。对于进一步提高志愿者招募管理发展&#xf…

【Java寒假打卡】Java基础-面向对象

【Java寒假打卡】Java基础-面向对象一、面向对象和面相过程二、类的定义三、对象的使用四、手机类的创建和使用五、单个对象的内存图六、两个引用指向同一内存图七、成员变量和局部变量八、priavte九、this关键字十、封装十一、构造方法十二、标准类一、面向对象和面相过程 对象…

童年辣条神话卫龙,首日破发“辣条第一股”,跌超10亿

“辣条第一股”的神话破了&#xff1f; 今日&#xff08;12月15日&#xff09;“辣条大王”卫龙美味全球控股有限公司&#xff08;下称“卫龙”&#xff0c;09985.HK&#xff09;正式挂牌港交所&#xff0c;但上市首日即遭破发。 作为千禧一代撑起的童年“神话”&#xff0c;…

GNN Algorithms (1): DeepWalk

DeepWalk Concept 图表示Graph Embedding based on Random Walk -> Graph GNN based neighbor aggregation. Graph Embedding使用低维稠密向量的形式表示图中的节点&#xff0c;使得在原始图中相似的节点在低维表达空间中也相似。 DeepWalk关键基础是Random Walk和word…

Hubbell EDI 855 采购订单确认报文详解

Hubbell于纽约证券交易所上市&#xff0c;全球员工近12000名&#xff0c;在欧美地区以其高品质获得人们的青睐&#xff0c;成为家喻户晓的品牌&#xff0c;同类产品占有份额达95%以上。 在数字化的今天&#xff0c;HUBBELL延续了在一个多世纪前建立的增长和创新传统&#xff0…

Sql Server 生成 Word 文档 表结构

打开数据库编辑器&#xff0c;输入以下代码并执行&#xff08;F5&#xff09; SELECT 表名 case when a.colorder1 then d.name else end, 表说明 case when a.colorder1 then isnull(f.value,) else end, 序号 a.colorder, 列名 a.name, …

QT6+CloudCompare显示3D点云

CloudCompare是一个三维点云&#xff08;网格&#xff09;编辑和处理软件。最初&#xff0c;它被设计用来对稠密的三维点云进行直接比较。它依赖于一种特定的八叉树结构&#xff0c;在进行点云对比这类任务时具有出色的性能。此外&#xff0c;由于大多数点云都是由地面激光扫描…

文本转语音免费 微软Azure官网,在线就可以转语音。

使用跨 140 种语言和变体的 400 种神经网络语音吸引全球受众。使用极具表现力和类似人类的声音&#xff0c;使文本阅读器和已启用语音的助理等方案栩栩如生。神经网络文本转语音支持多种朗读风格&#xff0c;包括新闻广播、客户服务、呼喊、耳语以及高兴、悲伤等情感。 地址 文…

【Java寒假打卡】Java基础-数组学习笔记

【Java寒假打卡】Java基础-数组学习笔记一、定义二、定义格式三、数组动态初始化四、数组元素访问五、内存分配六、多个数组的不同内存图七、数组的静态初始化八、数组操作的两个小问题九、求数组的最大值十、查找数组的特定值一、定义 数组是一个容器&#xff0c;存储一种数组…

6 CPP之C风格字符串

CPP之C风格字符串 c中的string类&#xff0c;封装了C风格的字符串。 使用方便&#xff0c;能自动扩展&#xff0c;不用担心内存问题 在某些场景中&#xff0c;C风格字符串更方便&#xff0c;更高效 C标准库、Linux系统和开源库&#xff0c;大部分开源库一定有C语言版本&…

Vue前端浏览器链接/接口参数实现加密

场景 由于项目创建之前后端设计不合理&#xff0c;导致详情页链接参数id为顺序序数(例&#xff1a;1,2,3…等等)&#xff0c;安全系数非常低&#xff08;虽然我们前端做了菜单权限、按钮权限、Api权限等等&#xff09;&#xff0c;现在要前端解决下浏览器链接/接口参数实现加密…

《Linux运维总结:基于xtrabackup8工具全量物理备份Mysql8数据自动化工具(方案一)》

一、背景信息 说明&#xff1a;由于业务系统的特殊性&#xff0c;对数据的备份要求非常高&#xff0c;且数据量非常大&#xff0c;所以这里采用xtrabackup工具来对Mysql数据库进行全量物理备份。由于xtrabackup工具操作复杂&#xff0c;这里为了简便&#xff0c;基于xtrabackup…

张驰咨询:快速提高流程效率的5个关键精益生产工具

精益&#xff0c;又称“精益制造”或“精益生产”&#xff0c;注重通过消除浪费、消除缺陷&#xff0c;实现客户价值最大化。精益工具是关于理解过程&#xff0c;发现浪费&#xff0c;防止错误和记录你所做的事情。 让我们来看看流程改进中使用的五种精益工具&#xff0c;它们…

建立企业数据共享机制,打破数据壁垒

很多人可能也比较疑惑&#xff0c;为什么数据这么重要&#xff0c;能够有着数据治理、数据标准、数据管理以及我们接下来要讲的数据共享&#xff0c;各种针对数据的机制体系。一方面是因为数据在数字经济和数字化转型进程中发挥了巨大作用&#xff0c;甚至可以称得上是两者的核…