推荐系统学习笔记——四、Netfilx经典推荐系统架构
四、Netfilx经典推荐系统架构
Netflix公司发布的经典推荐系统架构,一共分为3层:
- ONLINE(在线层)
- NEARLINE(近线层)
- OFFLINE(离线层)
这三层分别做自己的事情,配合组合一起完成系统的运行。
在线层:就是用户看到的层。 用户和产品(Client,就是电脑端、APP等等)进行交互,用户除了看到内容之外,还会有很多操作,比如说播放、评分、浏览点击、购买等等,这些操作就是事件的序列,产生打点日志 。打点日志会有两个分发,一个离线分发到Hadoop,第二个是以队列的形式分发到Netflix.Manhattan(类似于Storm的实时流式计算框架)
所谓打点日志,是指用于数据统计的日志,一般前端会有打点的方法,而后端也会有类似需求。按理说,后端的一般的日志也可以做到打点的效果,但是因为一般的日志离散,风格不统一,得到的日志格式不好,不容易切分统计,所以就会想要一个独立的打点日志来实现打点。
离线层一般是天粒度或者小时粒度进行计算 。得到打点日志以后,一般会存储于Hadoop的HDFS,然后使用HIVE、PIG或者Spack,进行大数据的计算,包括:数据的过滤、提取,得到查询结果Query results,把查询结果打进一个调度平台Netflix.Hermes。
- Netflix.Hermes调度平台,结合当天离线数据和历史离线数据两方面的数据,进行两个分发,第一个是离线计算,第二个是模型训练,就是机器学习的算法,得到一个模型,一般指模型的参数。
- 模型有两个使用,第一个打到在线层,当用户的实时请求过来之后,会使用模型实时的进行计算,进行预测。另一个是到离线层的计算,这个计算综合很多的数据,比如这个模型可以预算两个结果,一个是提前预算用户的推荐列表,另一个是进行矩阵分解,得到用户向量和物品向量,可以用于在线使用。
近线层,位与在线层和离线层之间,起一个桥梁的作用。优点:几乎可以进行实时处理。事件流:比如说Kafka得到队列形式的日志之后,会进入流式计算的平台,进行近线层的计算。这个近线层的计算会获取离线数据、调用机器学习的算法、获取在线层的输入。
- 比如说用户做了什么发出了一个信号,近线层的计算结果会存储一些高速缓存(Cassandra、MySQl、EVcache[evcache类似于redis])。
- 一个系统通常由多种缓存。Cassandra可以存储大辣的数据,T级别,主要提供高速的读取服务。
- EVcache和Cassandra搭配,也是高速缓存,读取更快,也接受写操作,类似于redis
- MySQL,结构化存储和查询,主要支持事务型操作,问题是在线访问的时候读写很慢。
在线层用户操作之后,发出了结果,用户怎么得到推荐列表
- 一般来说,一个应用服务,都会有一个统一的算法服务来进行调度,这个算法服务,会从高速缓存中获取数据,然后调用在线的计算,需要很快的返回结果。可以使用数据服务,获取需要使用的数据,也可以在线使用机器学习训练好的模型,可以得到离线系统发出的信号。
- 当计算好了之后,会把结果推给计算服务,计算服务给用户展示最终的结果
这个架构,需要解决的是工程问题。
挑战:架构技能处理海量数据,又能及时响应用户交互
在线层:需要快速响应
-
特点:快速响应,使用最新数据输入;比如200MS。
- 需要读取的数据存储在高速缓存,可以迅速读取,几毫秒、几十毫秒进行返回
- 需要的机器学习的算法也是简单的,比如LR。
-
缺点:不能使用复杂算法,只能读取少量数据
离线层:
-
特点:大部分计算包括模型训练都在这层完成
-
优点:可采用复杂算法,不受限制;可扫描海量数据
-
缺点:不能对最新情景和新数据做响应,比如天粒度
近线层:
-
特点:离线和在线的折中,一般将结果存入高速缓存
-
优点:能使用几乎最新数据计算,延迟10秒~1分钟级别
-
优点:允许更复杂的算法处理,加载查询更多数据
-
能实现海量数据、复杂算法的实时响应的映射
组合使用的例子:
1、天粒度:离线层对用户数据做矩阵分解,得到用户向量和物品向量做数据存储MySQL
2、10秒钟:近线层根据用户行为,查询TOPN相似的物品列表,存入Cassandra
3、200毫秒:在线层查询第2步的结果,更新推荐列表