
📖 资源简介
今天分享一套Spark大数据互联网项目实战推荐系统的课程资源,内容挺系统的,适合想认真学习的同学。
✨ 资源亮点
- 内容扎实:82节视频课程,跟着老师一步步操作,比自学摸索快得多。
📚 课程内容
资源清单
| 类型 | 数量 |
|---|---|
| 视频教程 | 82 节 |
| 压缩文件 | 0 个 |
| 合计 | 82 |
为什么用 Spark 做推荐系统
打开任何一个 App,首页那一排”猜你喜欢”背后,几乎都站着一个推荐系统。推荐系统的核心矛盾是:用户行为数据每天 TB 级增长,而在线响应要求毫秒级返回。Hadoop MapReduce 跑一轮全量离线训练要几小时,根本撑不住每日迭代;而 Spark 把中间结果放在内存里,迭代计算比 MR 快 10~100 倍,恰好契合推荐算法”反复训练-反复调参”的特点。再加上 Spark MLlib 内置了 ALS 协同过滤算法、Spark SQL 做特征工程极其顺手、Structured Streaming 支撑实时行为流,Spark 已经成为工业界推荐系统离线/准实时链路的事实标准。
这套课程正好覆盖了”Spark 核心 → 特征工程 → ALS 模型训练 → 召回排序 → 项目实战”的完整链路,下面把关键知识点拆解一遍。
Spark 核心:先把引擎搞懂
RDD、DataFrame、Dataset 的关系
- RDD:最底层的弹性分布式数据集,只存元素不存结构,编译期不感知 Schema,性能最靠程序员手写。
- DataFrame:在 RDD 上加了 Schema,类似关系型数据库的表, Catalyst 优化器可以下推谓词、自动选择执行计划,写 SQL 风格代码就能跑出高性能。
- Dataset:DataFrame 的强类型版本,在 Scala/Java 中兼具类型安全与优化。
生产上90% 的场景直接用 DataFrame/Spark SQL,只有需要自定义聚合、复杂数据结构时才回 RDD。
Transformation 与 Action
val df = spark.read.parquet("hdfs://path/events")
// Transformation:惰性求值,只记录血缘
val hot = df.filter($"event" === "click")
.groupBy($"user_id", $"item_id").count()
.filter($"count" > 5)
// Action:真正触发作业提交
hot.write.parquet("hdfs://path/hot_events")
Transformation(filter、groupBy、join、map)不立刻执行,只有遇到 Action(count、collect、write、show)才会生成 DAG 并提交。理解这一点,才能看懂 Spark UI 上的 Stage 划分。
宽依赖、窄依赖与 Stage 划分
- 窄依赖:父 RDD 的一个分区只被子 RDD 的一个分区用(map、filter),不需要 shuffle。
- 宽依赖:父 RDD 的一个分区被子 RDD 的多个分区用(groupByKey、reduceByKey、join),必须 shuffle。
Spark 以宽依赖为界切分 Stage:窄依赖的算子串成一个 pipelined Stage,宽依赖处落盘 shuffle 数据。调优的核心思路就是尽量减少 shuffle——能用 broadcast join 就别用普通 join,能预先分区就别 groupByKey 后再聚合。
内存管理
Spark 1.6 以后采用统一内存管理,堆内空间大致分为:Execution 内存(shuffle/sort/join)、Storage 内存(缓存 RDD/数据集)、用户内存。两者可以动态借用,但被对方占用后不能强抢。生产上常见问题是 spark.sql.shuffle.partitions 默认 200,数据量大时每个 task 处理太少、调度开销大;数据量小时又会产生大量小文件。建议按数据量调整到 200~1000 之间。
推荐系统:从协同过滤到 ALS
协同过滤(CF)的两种思路
User-based CF:找和你品味相似的人,把他们喜欢而你没看过的东西推荐给你。
Item-based CF:买过 A 的人还买了 B,就把 B 推荐给买过 A 的人。电商首页”猜你喜欢”大多是 Item-based。
CF 的问题是矩阵稀疏——一个用户可能只点过几百个物品,而全站有上百万物品,直接算相似度浪费且不准。这就引出了矩阵分解。
ALS:交替最小二乘
ALS(Alternating Least Squares)把”用户×物品”的评分矩阵 R 分解成两个低维矩阵:
- 用户隐因子矩阵 U(n × rank)
- 物品隐因子矩阵 I(m × rank)
用 U × Iᵀ 去逼近原始 R,缺失的评分就是预测分。ALS 交替固定 U 求 I、固定 I 求 U,逐步收敛,非常适合并行化——这正是 Spark MLlib 把它做成内置算法的原因。
MLlib ALS 最小示例
from pyspark.ml.recommendation import ALS
from pyspark.ml.evaluation import RegressionEvaluator
als = ALS(
userCol="user_id",
itemCol="item_id",
ratingCol="rating",
rank=10, # 隐向量维度,常用 10~200
maxIter=10, # 迭代次数
regParam=0.1, # L2 正则,防过拟合
coldStartStrategy="drop" # 预测时遇到训练集没见过的用户/物品直接丢
)
model = als.fit(train_df)
predictions = model.transform(test_df)
evaluator = RegressionEvaluator(
metricName="rmse",
labelCol="rating",
predictionCol="prediction"
)
rmse = evaluator.evaluate(predictions)
print(f"RMSE = {rmse:.4f}")
三个核心超参:
| 参数 | 含义 | 调参建议 |
|---|---|---|
| rank | 隐向量维度 | 小数据 10~50,大数据 100~200 |
| maxIter | 迭代轮数 | 10~20,过大容易过拟合 |
| regParam | 正则系数 | 0.01~0.2,越大越保守 |
冷启动问题
推荐系统三大冷启动:
- 用户冷启动:新用户没有行为,靠注册信息(年龄、性别、地域)+ 热门内容兜底。
- 物品冷启动:新上架物品没被点过,靠内容特征(标签、类目)找相似旧物品。
- 系统冷启动:全新平台没有任何数据,先靠人工规则 + 运营位引导采集首批行为。
推荐系统工程架构:召回 → 排序 → 重排
工业界推荐系统不是”跑一个 ALS 就完事”,而是三层漏斗:
全库物品(百万级)
│
▼ 召回(多路并行:ALS 召回 / 热门召回 / 标签召回 / 社交召回)
候选集(千级)
│
▼ 排序(GBDT / LR / DeepFM 等精排模型,逐条打分)
Top-N(百级)
│
▼ 重排(业务规则:去重、打散、时效性、多样性、过滤已看)
最终结果(几十条,返回前端)
- 召回追求快和广,多路并用,每路取几百条;
- 排序追求准,特征最全、模型最复杂;
- 重排负责把”算法结果”翻译成”业务能上线的结果”。
项目实战流程梳理
跟着课程做完整项目时,建议按这条主线走:
- 数据采集:用户行为日志(点击、收藏、购买、时长)落在 HDFS / Kafka。
- ETL 清洗:用 Spark SQL 过滤异常请求、去重、会话切分,生成标准行为表。
- 特征工程:用户画像(活跃度、类目偏好)、物品画像(点击率、上架时长)、交叉特征。
- 模型训练:ALS 离线训练,用 RMSE 做交叉验证选超参。
- 召回结果落 Redis:把每个用户的 Top-K 推荐物提前算好放缓存,在线请求直接查。
- 在线服务:实时请求到达后,拼上用户实时行为,走精排 + 重排返回。
高频面试要点
- RDD 为什么慢?DataFrame 为什么快? RDD 是行级对象,Java 对象 overhead 大、没有 Schema;DataFrame 是列式存储 + Catalyst 优化 + Tungsten 堆外内存管理,省内存省 CPU。
- 窄依赖和宽依赖的区别? 是否需要 shuffle,是 Stage 切分依据。
- ALS 的原理? 把评分矩阵分解成用户隐因子 × 物品隐因子,交替最小二乘求解,适合并行。
- 推荐系统冷启动怎么解决? 用户侧靠注册信息 + 热门兜底;物品侧靠内容特征;系统侧靠规则运营。
- RMSE 高就一定推荐得好吗? 不一定。RMSE 衡量评分预测精度,但推荐看的是 Top-N 命中率、NDCG、Recall@K,要结合业务指标。
常见踩坑
- 直接用 ALS 跑全量用户:百亿级行为数据单机扛不住,要先过滤低活用户、长尾物品。
- 忘了
coldStartStrategy="drop":测试集里出现训练集没有的用户/物品,预测结果变成 NaN,直接把评估指标搞崩。 - shuffle 分区数没调:默认 200,小数据浪费、大数据不够,按每个分区 128MB 左右估算。
- 把召回结果直接当最终推荐:没有重排,首页全是同类型物品,体验很差。
总结
Spark 推荐系统这门课的难点不在某个 API,而在”离线训练 → 在线服务“这一整条链路怎么串起来。建议学习时把重点放在三件事上:一是把 Spark Core 的 DAG/shuffle 原理吃透,后面调参才不是玄学;二是亲手跑一遍 MLlib 的 ALS,理解 rank、regParam 对结果的影响;三是把”召回-排序-重排”的架构图默写出来,面试时能讲清楚就已经超过大部分候选人。
资源获取
💡 建议:尽快保存到本地网盘或电脑,避免分享链接后期失效。
整理不易,如果对你有帮助,欢迎分享给更多需要的朋友。













请登录后查看评论内容