论文部分内容阅读
随着互联网的迅速发展,网络所承载的数据信息也在爆炸式增长。在面对这些海量信息时,人们往往很难找到自己想要的,感兴趣的内容,为了解决这个问题从而诞生了搜索引擎,那些目的很明确的用户可以根据关键字搜索来快速,准确的找到自己想要的内容。然而在实际的日常生活中,很多用户的需求是模糊的,潜在的,为了挖掘出这些用户的潜在兴趣从而又诞生了推荐系统。推荐系统是一种解决信息过载的工具,能够帮助用户发现自己可能感兴趣的信息,使用户寻找感兴趣内容所花费的时间大大减少,从而增加网站的用户黏性。决定推荐系统性能的关键是系统架构设计和推荐算法这两个方面。传统基于离线批计算平台Hadoop的推荐系统,虽然可以通过对海量数据的计算获得较为准确的推荐,但其计算时间较长,无法满足推荐的实时性需求,而目前基于Lambda架构构建的实时推荐系统,采用离线批处理层和在线实时层结合的策略,虽然具有计算准确以及高容错等优点,但也存在结果汇总困难,系统复杂,维护困难等问题,且推荐的结果依赖离线层,如果短时间用户行为发生较大变化则会发生离线层的结果滞后现象,导致推荐不能及时反映用户的兴趣变化。在推荐算法方面,目前常用的推荐算法如协同过滤等一开始只是为了解决离线环境下的推荐任务而提出的,每次的推荐都要基于整个评分矩阵计算得出物品相似度或者用户相似度,当矩阵维度过大计算代价会变得非常高,耗时较长,很难满足实时推荐的需求,而且在实时数据流环境下评分矩阵会经常改变,导致用户相似度和物品相似度的频繁变动,如何在这种环境下实时更新推荐计算结果以及尽量减少不必要的计算成为了推荐算法要面对的一个重要问题。针对上述问题,本文在深入研究了推荐系统的架构设计和推荐算法的基础上,利用Spark的流处理组件Spark Streaming所具有的微批次流数据处理特性,设计并实现了一个推荐计算部分完全由在线层组成的实时推荐系统,和目前广泛使用的Lambda架构相比,本系统不依赖离线层,使得系统的复杂度有了很大降低,并且不存在结果汇总困难等问题,同时因为基于完全在线层的设计提高了推荐的实时性。本文工作具体表现在以下几个方面:首先,对实时推荐系统的需求进行了详细的分析,对可用实时推荐的架构进行论证和对比。在此基础上,基于Spark,Kafka,HBase,Redis实现一个推荐计算部分完全由在线层组成的实时推荐系统架构,即利用Spark Streaming的微批次流处理特性对数据流进行实时计算,以满足实时推荐系对吞吐量和计算延时的需求;利用Kafka消息队列来作为数据缓存模块,以解决实际应用场景中实时数据流不稳定的问题;利用HBase数据库对海量数据提供的存储和随机访问能力,再结合基于内存的数据库Redis提供的快速缓存性能来满足数据处理过程中对数据读写性能的要求。然后,对协同过滤推荐算法在数据流环境下存在的问题进行深入研究,通过在推荐算法中引入Hoeffding界理论实现对数据流的实时过滤,以及通过用户对物品评价正负一致度的物品相似度计算方法实现物品相似度的增量更新,将基于物品的协同过滤推荐算法应用到数据流环境中,在秒级的延时内更新推荐结果。最后,在实时推荐系统架构和推荐算法研究的基础上,对基于Spark的实时推荐系统进行了具体的实现,并通过Movielens数据集对系统进行了测试,结果表明本系统能够在保证推荐准确率的前提下实现秒级延时下的推荐更新,很好的满足推荐实时性需求。