系统架构设计
分布式架构采用Spark Core作为计算引擎,Spark MLlib提供推荐算法支持,Spark Streaming处理实时数据。数据存储层使用HDFS或HBase存储用户行为日志,Redis缓存热门视频和实时推荐结果。
前端通过REST API与后端交互,后端服务层负责特征工程、模型训练和推荐生成。推荐引擎模块包含离线批处理、近线增量学习和在线实时推荐三个子系统。
数据预处理流程
用户行为数据(点击、点赞、分享等)通过Flume或Kafka采集到数据湖。Spark作业进行数据清洗,处理缺失值和异常值。特征工程包括:
- 用户特征:年龄、性别、地域、历史行为
- 视频特征:类别、标签、时长、热度
- 上下文特征:时间、设备、网络环境
使用Spark SQL进行特征聚合,生成用户-视频交互矩阵。特征向量通过标准化和降维处理,存储至特征仓库供模型使用。
推荐算法实现
协同过滤算法:
scala
val als = new ALS()
.setRank(10)
.setMaxIter(15)
.setRegParam(0.01)
.setUserCol("userId")
.setItemCol("videoId")
.setRatingCol("rating")
val model = als.fit(trainingData)
内容相似度计算:
python
from pyspark.ml.feature import Word2Vec
w2v = Word2Vec(vectorSize=100, minCount=1, inputCol="tags", outputCol="features")
model = w2v.fit(tagData)
混合推荐策略:
- 离线阶段:ALS矩阵分解生成基础推荐
- 实时阶段:结合用户实时行为调整权重
- 冷启动:基于内容相似度和热门视频兜底
性能优化方案
内存管理:
java
spark.executor.memory=8G
spark.memory.fraction=0.6
并行度调整:
sql
SET spark.sql.shuffle.partitions=200;
SET spark.default.parallelism=100;
缓存策略对频繁访问的RDD进行持久化:
scala
val cachedRatings = ratings.persist(StorageLevel.MEMORY_AND_DISK)
评估指标体系
离线评估:
- 准确率:Precision@K, Recall@K
- 覆盖率:推荐物品占总物品比例
- 多样性:推荐列表的熵值计算
在线A/B测试:
- 点击率(CTR)
- 观看时长
- 用户留存率
使用Spark ML的RegressionEvaluator:
scala
val evaluator = new RegressionEvaluator()
.setMetricName("rmse")
.setLabelCol("rating")
.setPredictionCol("prediction")
val rmse = evaluator.evaluate(predictions)
部署实施要点
- 集群配置:YARN资源队列划分,Executor数量与核心数配比
- 增量更新:每小时更新用户特征,每天全量训练模型
- 降级策略:当实时系统故障时切换至离线推荐结果
- 监控体系:通过Grafana监控推荐耗时、吞吐量等关键指标
冷启动解决方案
- 基于内容相似度:使用TF-IDF计算视频标签相似度
- 热门榜单:综合播放量、分享量等指标排序
- 地域推荐:优先推荐同城用户喜欢的视频
- 社交传播:引入好友关系链进行推荐
实时推荐实现
Kafka消费用户实时行为事件:
java
val kafkaParams = Map("bootstrap.servers" -> "kafka:9092")
val directKafkaStream = KafkaUtils.createDirectStream[String, String](
streamingContext, PreferConsistent, Subscribe[String, String](topics, kafkaParams))
Flink+Spark联合作业:
- Flink处理实时特征拼接
- Spark Streaming每5分钟更新推荐列表
- 结果写入Redis供API查询
安全与隐私保护
- 数据脱敏:用户敏感信息加密存储
- 差分隐私:在特征计算时添加噪声
- 权限控制:基于Kerberos的HDFS访问授权
- 日志审计:记录所有推荐结果生成过程