华为云企业级redis揭秘第13期:如何搞定推荐系统存储难题?-星辰平台

发表于 2021/09/02 15:34:06 2021/09/02
【摘要】 云数据库gaussdb(for redis)作为华为云旗下企业级redis,致力于为客户提供稳定可靠、超高并发,且能够极速弹性扩容的kv存储服务。


七夕过后,笔者的一个朋友遇到了尴尬事:当女友点开他的购物app,竟然自动弹出一系列推荐:玫瑰包邮、感动哭了、浪漫小夜灯……回想七夕那天,礼物并没有出现,于是问题出现了:从实招来,你送谁了?

 

 

为了帮助友人重建信任,笔者进行了一番技术调研:这一定是“推荐系统”出了偏差。

 

 

 

推荐系统是一种信息过滤系统,它能够快速分析海量用户行为数据,预测出用户喜好,从而进行有效推荐。

在商品推荐、广告投放等业务中,推荐系统责任重大。根据亚马逊2019年度报告,其40%的营收来自内部稳定的推荐系统

在本文开篇的例子中,正是由于推荐系统问题,才导致了尴尬的场面。笔者决定力挺友人,用可靠的知识让人信服!

 

 

通常来说,在一套成熟的推荐系统中,分布式计算、特征存储、推荐算法是关键的三大环节,缺一不可。

下面介绍一类完整的推荐系统,在系统中gaussdb(for redis)负责核心的特征数据存储。该系统也是华为云诸多客户案例中较为成熟的最佳实践之一。

第一部分:获取特征数据

 

 

  • 原始数据采集

点赞、收藏、评论、购买……这些行为都属于原始数据,他们随时都在发生,因此数据量庞大。经由kafka、redis stream等流组件向下游传递,或存入数仓,等待后期提取使用。

  • 分布式计算

原始数据离散、含义模糊,无法直接给算法使用。此时就要进行大规模的离线、在线计算,对数据加工。spark、flink都是典型的大数据计算组件,其强大的分布式计算能力是推荐系统不可或缺的。

  • 特征数据存储

经过加工的数据也就是特征、标签,是推荐算法所需的宝贵数据源。在特定场景下,也可以称之为用户画像、物品画像。这部分数据有着反复共享、复用的价值,不仅能用于训练算法模型,还能为生产环境提供服务。

确保特征数据的可靠存储,是推荐系统中极为关键的一环。

第二部分:消费特征数据

 

 

  • 线下模型训练

有了关键的特征数据,业务就可以开始训练算法模型。

只有充分利用特征库,以及最新行为数据,不断打磨推荐算法,这样才能提升推荐系统整体水平,最终带给用户更好的体验。

  • 线上推理预测

算法模型训练结束后,将被部署到线上生产环境。

它将继续利用已有的特征存储,根据用户的实时行为进行推理,快速预测出与用户最匹配的优质内容,形成推荐列表,并推送给终端用户。

很显然, “特征数据”在整个系统中起到了关键的衔接作用。

由于kv形式的数据抽象与特征数据极为接近,因此推荐系统里往往少不了redis的身影。

在上述系统的方案中,数据库选型为gaussdb(for redis),而不是开源redis。

原因是开源redis在大数据场景下还是存在显而易见的痛点:

1. 数据无法可靠存储

推荐系统其实希望既能使用kv数据库,又能放心将数据长久保存。

但开源redis的能力更侧重于数据的缓存加速,而不是数据存储。而且开源redis毕竟是纯内存设计,即使有aof持久化,但通常也只能秒级落盘,数据的保存并不可靠。

2. 数据量上不去,成本下不来

涉及推荐的业务往往用户体量也不会小,随着业务发展,也会有更多的特征数据需要保存。

实际上,相同容量的内存与极速ssd相比,价格贵10倍以上都很正常。

于是,当数据量达到几十gb、几百gb,开源redis会变得越来越“烧钱”,因此一般只当做“小”缓存使用。

除此之外,开源redis自身fork问题导致容量利用率低,硬件资源有很大的浪费。

3. 灌库表现不佳

特征数据需要定期更新,往往以小时或天为周期进行大规模数据灌入任务。

如果存储组件不够“皮实”,大量写入造成数据库故障,将导致整个推荐系统发生异常。

这就可能造成开篇提到的尴尬用户体验。

开源redis抗写能力并不强,这是由于集群中有一半节点是备节点,它们只能处理读请求。当大批量写入到来时,主节点容易出问题,引发连锁反应。


理论上,架构设计并不是越复杂越好,如果可以,谁不想使用一种既能兼顾特征数据kv类型、成本友好、性能又有保障的可靠数据存储引擎?

与开源redis不同,gaussdb (for redis)基于存算分离架构,为推荐系统这一类大数据场景带来关键的技术价值:

1. 可靠存储

数据命令级落盘,在底层存储池中三副本冗余存储,真正做到了0丢失。

2. 降本增效

高性能持久化技术 细粒度存储池,帮助企业将数据库使用成本降低75%以上。

3. 抗写能力强

多线程设计 全部节点可写,抗写能力足够强大,从容应对spark灌库压力和实时更新。


华为云企业级数据库gaussdb (for redis)提供稳定、可靠的kv存储能力,正是推荐系统核心数据的极佳选型。

其实,在spark后端接入redis已经成为一种主流方案,而使用flink从redis中提取维度表也是很常见的用法。它们也都提供了用于接入redis的连接器。

gaussdb(for redis)完全兼容redis协议,即开即用,用户随时都可以快速创建实例并接入业务。

1. spark-redis-connector

spark-redis-connector完美实现了spark rdd、dataframe到gaussdb(for redis)实例中string、hash、list、set等结构的映射。

用户可使用熟悉的spark sql语法轻松访问gaussdb(for redis),完成特征数据灌库、更新、提取等关键任务。

使用方法非常简单:

1)当需要读取hash、list、set结构到spark rdd时,分别只用一行即可搞定。

 

 

 

 

2)而当推荐系统进行灌库或特征数据更新时,可以按如下方式轻松完成写入。

 

 

2. flink-redis-connector

flink这款计算引擎流行程度不亚于spark,它同样有成熟的redis连接方案。

使用flink提供的connector或结合jedis客户端,都可轻松完成flink到redis的读写操作。

以使用flink统计单词频次的简单场景为例,数据源经过flink加工后,便可轻松存入gaussdb(for redis)中。

 

 

大数据应用对核心数据的存储有着很高的要求。云数据库gaussdb(for redis)拥有存算分离的云原生架构,在完全兼容redis协议的基础上,同时做到了稳定性、可靠性的全面领先。

面对海量核心数据存储,它还能为企业带来相当可观的成本节约。

面向未来,gaussdb(for redis)极有潜力成为下一个大数据浪潮的新星。

本文作者:华为云数据库gaussdb(for redis)团队

杭州/西安/深圳简历投递:[email protected]

gaussdb(for redis)产品星辰平台主页:

更多技术文章,关注gaussdb(for redis)官方博客:


gaussdb(for redis)揭秘第12期:2021最新架构分享

gaussdb(for redis)揭秘第11期:迁移系列下

gaussdb(for redis)揭秘第10期:迁移系列上

gaussdb(for redis)揭秘第9期:与hbase的对比

gaussdb(for redis)揭秘第8期:用高斯redis进行计数

gaussdb(for redis)揭秘第7期:高斯redis与强一致

gaussdb(for redis)揭秘第6期:feed流场景中的应用

gaussdb(for redis)揭秘第5期:高斯 redis 在im场景中的应用

gaussdb(for redis)揭秘第4期:geo场景应用

gaussdb(for redis)揭秘第3期:探讨redis fork带来的性能抖动

gaussdb(for redis)揭秘第2期:stream场景应用

gaussdb(for redis)揭秘第1期:redis与存算分离,讲架构设计

【星辰平台的版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。