免费查看采购信息的平台,百度小程序关键词优化,wordpress批量定时更新,网站建设的技术问题hadoop电影推荐系统 大数据电影推荐系统源码
技术栈:javaspringbootlayuihadoop
数据集:豆瓣电影
推荐思路:用户注册登录后浏览电影#xff0c;对电影进行评分#xff0c;算法模块定时执行#xff0c;从mysql读取数据上传到hdfs#xff0c;并通过执行mapreduce实现的基于用…hadoop电影推荐系统 大数据电影推荐系统源码 技术栈:javaspringbootlayuihadoop 数据集:豆瓣电影 推荐思路:用户注册登录后浏览电影对电影进行评分算法模块定时执行从mysql读取数据上传到hdfs并通过执行mapreduce实现的基于用户协同过滤算法计算用户推荐结果再将推荐结果拉取回来等待业务系统读取展示推荐结果假装这里有张架构图咱们今天聊聊怎么用Hadoop搞个能实战的电影推荐系统。这个系统最带劲的地方在于用户随便点几个电影打个分后台就能算出他可能喜欢的片子。别看听着玄乎其实就是协同过滤算法在Hadoop集群上跑MapReduce实现的。先说数据怎么流动。用户在前端用LayUI做的页面打分后SpringBoot会把评分数据存到MySQL的movie_ratings表里。每隔6小时生产环境建议凌晨跑咱们用Sqoop抽数脚本把新数据怼到HDFS上sqoop export \ --connect jdbc:mysql://192.168.1.100/movie_db \ --username root \ --password 123456 \ --table movie_ratings \ --export-dir /input/movie_ratings不过真实项目建议用Spring Scheduler写定时任务比crontab更可控Scheduled(cron 0 0 */6 * * *) public void syncToHDFS() { // 调用HDFS API上传增量数据 }重头戏在MapReduce阶段。咱们的协同过滤算法分三步走计算用户相似度-找相似用户-聚合推荐结果。Mapper阶段得把原始评分数据转成用户ID, 电影ID:评分的格式// 相似度计算的Mapper片段 public void map(LongWritable key, Text value, Context context) { String[] parts value.toString().split(,); String userId parts[0]; String movieId parts[1]; String rating parts[2]; context.write(new Text(userId), new Text(movieId : rating)); }Reducer里用余弦相似度算用户之间的匹配度。这里有个坑——直接双重循环计算会O(n²)所以咱们要做分片优化// 相似度Reducer的关键逻辑 ListMapString, Double userRatings new ArrayList(); for (Text val : values) { MapString, Double ratingMap parseRating(val.toString()); userRatings.add(ratingMap); } for(int i0; iuserRatings.size(); i){ for(int ji1; juserRatings.size(); j){ double similarity calculateCosineSimilarity( userRatings.get(i), userRatings.get(j) ); // 只保留相似度前10的用户对 if(similarity 0.8){ context.write(...); } } }跑完MapReduce作业后推荐结果得从HDFS拉回MySQL。这里建议用Hive建外部表映射结果文件再用JDBC分批写入避免单次查询爆内存-- 创建Hive外部表 CREATE EXTERNAL TABLE rec_results( user_id STRING, rec_movies ARRAYSTRING ) LOCATION /output/recommendations;前端展示推荐结果时用LayUI的卡片布局直接渲染JSON数据。注意要做冷启动处理——新用户还没打分时直接返回热门电影榜单layui.use(table, function(){ table.render({ elem: #recList, data: [{ title: 肖申克的救赎, score: 9.7, reason: 与您喜欢的《阿甘正传》类型相似 },{ title: 盗梦空间, score: 9.3, reason: 同类型悬疑题材高分作品 }] }); });实际跑起来发现两个性能瓶颈1. MySQL到HDFS的数据同步速度 2. MapReduce任务的shuffle时间。第一个问题可以通过分库分表 增量同步解决第二个得调优YARN的内存分配把mapreduce.reduce.shuffle.parallelcopies调到50以上效果明显。最后给想自己部署的兄弟提个醒豆瓣数据集需要先做数据清洗原始数据里的中文片名在Hadoop里容易编码错误。建议跑个预处理脚本把非ASCII字符过滤掉否则MapReduce阶段会报莫名奇妙的异常。