关于大数据:升级JSONB列式存储Hologres助力淘宝搜索2022双11降本增效

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

前言:

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_timestamp pk UID bts_tags
2022-11-11 00:00:00+08 858739e966f7ebd1cfaa49c564741360 1 {“layerA:1”, “layerB:11”, “layerC:111”}
2022-11-11 00:00:01+08 e7e3d71fac5a92b87c3278819f6aff8c 2 {“layerA:1”, “layerB:12”, “layerC:112”}
2022-11-11 00:00:01+08 828f07dc16f4fa2f4be5ba3a9d38f12a 3 {“layerA:2”, “layerB:11”, “layerC:111”}
2022-11-11 00:00:02+08 b0c419c119658dfa0fd5f914e251af1d 4 {“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_timestamp pk UID bts_tags
2022-11-11 00:00:00+08 858739e966f7ebd1cfaa49c564741360 1 {“layerA”:”1″, “layerB”:”11″, “layerC”:”111″}
2022-11-11 00:00:01+08 e7e3d71fac5a92b87c3278819f6aff8c 2 {“layerA”:”1″, “layerB”:”12″, “layerC”:”112″}
2022-11-11 00:00:01+08 828f07dc16f4fa2f4be5ba3a9d38f12a 3 {“layerA”:”2″, “layerB”:”11″, “layerC”:”111″}
2022-11-11 00:00:02+08 b0c419c119658dfa0fd5f914e251af1d 4 {“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_pv 5975.5 1553.8 280%
wireless_dpv 862.5 455.8 89%

能够看到:在等同资源配置下,在手淘搜寻查问的典型场景下,分层分桶等多值字段降级到JSONB格局后,将带来至多100%以上的查问耗时升高。这一性能上的微小晋升,大大改善了咱们之前遇到的查问高峰期的查问慢和查问超时问题;同时按此估算,咱们能够对以后Hologres实例的CPU资源缩减一半以上,无力推动实现降低成本的指标。

3.3存储老本比照

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

表名 Array 格局存储量 JSONB格局存储量 存储降落%
wireless_pv 35 TB 15 TB -57%
wireless_dpv 3472 GB 1562 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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理