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

6次阅读

共计 5884 个字符,预计需要花费 15 分钟才能阅读完成。

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

前言:

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

正文完
 0