存储模块如何用redis解决推荐系统特征的问题_第1页
存储模块如何用redis解决推荐系统特征的问题_第2页
存储模块如何用redis解决推荐系统特征的问题_第3页
存储模块如何用redis解决推荐系统特征的问题_第4页
存储模块如何用redis解决推荐系统特征的问题_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

模块 第1节的课后题中贴出过Netflix推荐系统的架构图(如图1)吗?Netflix采用了非常经典的Offline、Nearline、Online三层推荐系统架构。架构图中最核心的位置就是我在图中用红框标出的部分,它们是三个数据库Cassandra、MySQL和EVcache,这三个数据库就是Netflix解决特征和模型参数问题的。图1Netflix推荐系统架构中的你可能会觉得,推荐特征和模型这件事情一点儿都不难啊。不就是找一个数据库把离线的特征存起来,然后再给推荐服务器写几个SQL让它取出来用不就行了吗?为什么还要像eflix这样兴师动众地搞三个数据库呢?想要搞明白这个问题,我们就得搞清楚设计推荐系统模块的原则。对于推荐服务器来说,由于线上的QPS压力巨大,每次有推荐请求到来,推荐服务器都需要把相关的特征取出。这就要求推荐服务器一定要“快”。不仅如此,对于一个成互联网应用来说,它的用户数和物品数一定是巨大的,几千万上亿的规模是十分常见的。所以对于模块来说,这么多用户和物品特征所需的量会特别大。这个时候,事情就很难办了,又要量大,又要查询快,还要面对高QPS的压力。很不幸,没有一个独立的数据库能经济又高效地单独完成这样复杂的任务。因此,几乎所有的工业级推荐系统都会做一件事情,就是把特征的做成分级,把越频繁的数据放到越快的数据库甚至缓存中,把海量的全量数据放到便宜但是查询速举个不恰当的例子,如果你把特征数据放到基于HDFSHBase,虽然你可以轻松放下所有的特征数据,但要让你的推荐服务器直接HBase进行特征查询,等到查询完成,这边用户的请求早就超时中断了。而Netflix的三个数据库正好满足了这样分级的需图2分级的设比如说,Netflix使用的Cassanra,它作为流行的NoSQL数据库,具备大数据的能力,但为支持推荐服务器高QPS的需求,我们还需要把最常用的特征和模型参数存入EVae这类内存数据库。而对于更常用的数据,我们可以把它们在GaaCache等服务器内部缓存,甚至是服务器的内存中。总之,对于一个工程师来说,我们经常需要做出技术上的权衡,达成一个在花销和效果上平衡最优的技术方案。而对于MySQL来说,由于它是一个强一致性的关系型数据库,一般的是比较关键的系,用户的信息等等。这类信息一般是由推荐服务器进行阶段性的拉取,或者利用分级缓存进行阶段性的更新,避免因为过于频繁的压垮MySQL。总的来说,推荐系统模块的设计原则就是“分级,把越频繁的数据放到越快那在我们要实现的SparrowRecsys中,模块的设计原则又是怎么应用的呢在SparrowRecsys中,我们把模块的设计问题进行了一些简化,避免由于系统设计得我们使用基础的文件系统保存全量的离线特征和模型数据,用Redis存线上所需特征和在实现技术方案之前,对于问题的整体分析都是重要的。我们需要先确定具体的方案,这个方案必须精确到哪级对应哪些具体特征和模型数据。的工具已经知道了,那特征和模型数据分别是什么呢?这里,我们直接应用特征工程篇为SparrowRecsys准备好的一些特征就可以了。我把它们的具体含义和数据量级整理成了表格,如下:图3特征和根据上面的特征数据,我们一起做一个初步的分析。首先,用户特征的总数比较大,它们很难全部载入到服务器内存中,所以我们把用户特征载入到Reis之类的内存数据库中是合理的。其次,物品特征的总数比较小,而且每次用户请求,一般只会用到一个用户的特征,但为了物品排序,推荐服务器需要几乎所有候选物品的特征。针对这个特点,我们完全可以把所有物品特征阶段性地载入到服务器内存中,大大减少Reis的线上压力。最后,我们还要找一个地方去特征历史数据、样本数据等体量比较大,但不要求实时获取的数据。这个时候分布式文件系统(单机环境下以本机文件系统为例)往往是最好的选择,由于类似DFS之类的分布式文件系统具有近乎无限的空间,我们可以把每次处理的全量特征,每次训练的Emeding全部保存到分布式文件系统中,方便离线评估时使用。经过上面的分析,我们就得到了具体的方案,如下表图4SparrowRecsys的方此外,文件系统的操作非常简单,在SparrowRecsys中就是利用Spark的输出功能实现的,我们就不再重点介绍了。而服务器内部的操作主要是跟Redis进行交互,所以接下来我们重点介绍Redis的特性以及写入和方法。RedisRedis是业界最主流的内存数据库,那在使用它之前,我们应该清楚Redis的两个主一是所有的数据都以Key-value的形式。其中,Key只能是字符串,value可支持的数据结构包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希)。这个特点决定了Redis的使用方式,无论是还是获取,都应该以键值对的形式进行,并二是所有的数据都在内存中,磁盘只在持久化备份或恢复数据时起作用。这个特点决定了Redis的特性,一是QPS峰值可以很高,二是数据易丢失,所以我们在Redis时要充分考虑数据的备份问题,或者说,不应该把关键的业务数据唯一地放到Redis中。但对于可恢复,不关乎关键业务逻辑的推荐特征数据,就非常适合利用Redis提供高效的在实际的SparrowRecsysRedis分中,我们用到了Redis基本的操作,SET、GET和KEYS,value的数据类型用到了string。SparrowRecsysRedisRedis的实践流程还是符合我们“把大象装冰箱”的,只不过,这三步变成了安Redis,把数据写进去,把数据读出来。下面,我们来逐一来讲首先是安装Redis。Redis的安装过程在linux/Unix环境这的步骤依次执行就好。而Windows环境下的安装过程稍复杂一些,你可以参考这在启动Redis之后,如果没有特殊的设置,Redis服务会默认运行在6379端口,没有特殊情况保留这个默认的设置就可以了,因为我们的SparrowRecSys是默认从6379口和Redis数据的。然后是运行离线程序,通过jedis户端写入RedisRedis行起来之后,我们就可以在离线Spark环境下把特征数据写入Redis。这里我们以第8节课中生成的Embedding数据为例,来实现Redis的特征过程。实际的过程非常简单,首先我们利用最常用的RedisJava客户端Jedis生成redis,然后遍历训练好的Embedding向量,将Embedding向量以字符串的形式存入Redis,com.wzhe.sparrowrecsys.offline.spark.featureeng.Embedding中的trainItem2vec函123456789if(saveToRedis)valredis=newJedis(redisEndpoint,valparams=params.ex(60*60*24)//遍for(movieId<-model.getVectors.keys)//value的形式是由Embedding向量生成的字符串,例如-.set(redisKeyPrefix+":"+movieId,}}最后是在推荐服务器中把Redis数据出来在服务器端,根据刚才梳理出的方案,我们希望服务器能够把所有物品Embedding阶段性地全部缓存在服务器内部,用户Embedding则进行实时查询。这里,我把缓存物品Embedding的代码放在了下面。你可以看到,它的实现的过程也并不复杂,就是先用keys作把所有物品Embedding缀的键找出,然后依次将Embedding载入内存。123456789//创建Jedis=newJedis(REDIS_END_POINT,Set<String>movieEmbKeys=redisintvalidEmbCount=0;//遍历查出的.keys(embKey+for(StringmovieEmbKey:movieEmbKeys){StringmovieId=movieEmbKey.split(":")[1];Moviem=getMovieById(Integer.parseInt(movieId));if(null==m){}//用}Embedding,与内存中的Embedding相似度的计算,就可以得到最终的推荐列表如果你已经安装好了Redis,我非常推荐你运行SparrowRecsys中offline部分Embedding主函数,先把物品和用户Embedding生成并且插入Redis(注意把saveToRedis量改为true)。然后再运行online分的RecSysServer,看一下推荐服务器有没有正确地从Redis中读出物品和用户Embedding并产生正确的推荐结果(注意,记得要把util.Config的EMB_DATA_SOURCE置改DATA_SOURCE_REDIS)当然,除了Redis,我们还提到了多种不同的缓存和数据库,如Cassanra、Ecache、GuavaCache等等,它们都是业界非常流行的特征的工具,你有的话也可以在课后查阅相关资料进行进一步的学习。在掌握了我们特征的基本原则之后,你也可以在业余时间尝试思考一下每个数据库的不同和它们最合适的应用场景。今天我们学习了推荐系统模块的设计原则和具体的解决方案,并且利SparrowRecsys进行了实战在设计推荐系统方案时,我们一般要遵循“分级”的原则,在开销和性能之间取得权衡。在SparrowRecsys的实战中,我们安装并操作了内存数据库Redis,你要记住Redis的特点“Key-value形式”和“纯内存数据库”。在具体的特征存取过程中,我们应该熟悉利用jedis执行SET,GET等Redis常用操作的方法。最后,我也把重要的知识点总结在了文稿中,你可以再回顾一对于搭建一套完整的推荐服务来说,我们已经迈过了两关,分别是用JettyServer搭建推荐服务器问题,以及用Redis解决特征的问题。下节课,我们会一起来线上你觉得课程中Embedding的方式还有优化的空间吗?除了string,我们是不是还可以用其他Redisvalue的数据结构Embedding数据,那从效率的角度考虑,使

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论