Repository files navigation

个性化菜品推荐系统

Big_Data 项目集中的大数据处理与推荐系统实践项目。

这是一个面向课程设计的大数据个性化推荐项目,围绕“用户-菜品-评分/评论”数据构建离线推荐、实时点评流处理和 Web 展示闭环。系统使用 Spark 在 HDFS 上完成数据检查、特征准备、ALS 协同过滤、ItemCF 相似度计算;使用 Kafka 承接用户点评事件;使用 Flink 计算实时滑动窗口热度;使用 MySQL 存储业务数据、离线推荐结果和实时统计结果;使用 Flask 提供登录、推荐、搜索、详情、看板和可视化页面。

技术栈

层级技术
Web 应用Python, Flask, Jinja2, HTML, CSS, JavaScript
数据访问PyMySQL, MySQL 8.x
离线计算Apache Spark, PySpark, Spark MLlib ALS
推荐算法ALS 矩阵分解, ItemCF 基于物品的协同过滤, 热门菜品冷启动
流式处理Kafka, kafka-python, Apache Flink / PyFlink
数据存储HDFS, Parquet, CSV, MySQL
可视化ECharts, Flask API JSON
测试unittest / pytest

项目结构

.
├── webapp/ # Flask Web 应用
│ ├── app.py # 路由、登录注册、推荐页面、API、点评提交
│ ├── config.py # MySQL / Kafka / Flask 配置
│ ├── repository.py # MySQL 查询、Kafka 点评事件发布
│ ├── services.py # 推荐策略编排、冷启动、看板数据组织
│ ├── static/ # CSS 和前端刷新/图表脚本
│ └── templates/ # Jinja2 页面模板
├── 代码Code/ETL/ # Spark 离线处理与推荐模型脚本
│ ├── 01_spark_data_check.py
│ ├── 02_prepare_als_data.py
│ ├── 03_train_als_model.py
│ ├── 08_als_item_similarity_recommendation.py
│ └── 09_itemcf_recommendation.py
├── scripts/ # MySQL 初始化、Kafka 回放、Flink 实时统计
│ ├── init_web_business_tables.py
│ ├── init_realtime_window_tables.py
│ ├── 10__kafka_review_replay_producer.py
│ ├── 11_kafka_review_consumer_to_mysql.py
│ └── 12_flink_review_window_stats.py
├── tests/ # 服务层、路由、Kafka 脚本测试
├── run_webapp_5001.py # 以 5001 端口启动 Web 应用
└── user_meal_rating_cleaned.csv # 本地演示数据文件,默认不上传 GitHub

核心业务逻辑

微信图片_20260629111512_1382_94

1. 离线推荐链路

  1. 01_spark_data_check.pyhdfs:///Data/user_meal_rating_cleaned.csv 读取用户菜品评分数据,检查行数、用户数、菜品数、评分分布、重复评分、活跃用户和热门菜品。
  2. 02_prepare_als_data.py 对同一用户和菜品保留最新评分,使用 StringIndexeruser_idmeal_id 编码为 ALS 可训练的数值索引,并输出到 hdfs:///Data/processed/ratings_for_als
  3. 03_train_als_model.py 使用 Spark MLlib ALS 训练多个参数组合,按 RMSE 选择最优模型,生成每个用户 Top 10 推荐结果,并保存模型指标。
  4. 08_als_item_similarity_recommendation.py 读取 ALS item factors,通过余弦相似度生成每个菜品的相似菜品列表。
  5. 09_itemcf_recommendation.py 使用 ItemCF 计算菜品共现相似度,并基于用户历史评分生成辅助推荐,同时输出 RMSE、MAE、覆盖率等指标。

2. 实时点评链路

  1. Web 端用户在历史点餐页面提交评分和评论。
  2. webapp.repository.MySQLRepository.publish_review_event() 将点评封装为 JSON 事件并写入 Kafka topic meal_review_stream
  3. scripts/11_kafka_review_consumer_to_mysql.py 消费 Kafka 点评事件,幂等写入 meal_reviewsuser_order_history
  4. scripts/12_flink_review_window_stats.py 通过 PyFlink 消费同一 topic,以菜品为 key 计算 2 秒窗口内的评分次数、平均评分和热度分,并写入:
    • meal_realtime_window_stats
    • meal_realtime_stats_current
  5. Web 首页、菜品详情页和数据看板读取实时统计表,展示实时热门菜品和窗口评分变化。

3. Web 推荐逻辑

webapp.services.RecommendationService 统一封装推荐策略:

  • 新注册用户或无历史行为用户:使用热门高评分菜品做冷启动推荐。
  • 有历史行为用户:同时展示 ALS 主推荐和 ItemCF 辅助推荐。
  • 离线推荐缺失时:自动回退到热门菜品,保证页面始终有可展示内容。
  • 菜品详情页:同时展示 ALS 相似菜品、ItemCF 相似菜品、历史评论和 Flink 实时窗口统计。
  • 看板和可视化页:聚合评分概况、评分分布、热门菜品、活跃用户、模型指标、最新评论和实时热门菜品。 效果演示图
微信图片_20260629111639_1386_94微信图片_20260629111603_1383_94微信图片_20260629111639_1384_94

MySQL 主要表

表名作用
usersWeb 登录用户、注册日期、用户类型
meals菜品基础信息、平均评分、热度排名
meal_reviews用户对菜品的评分和评论
user_order_history用户历史点餐和评分行为
rating_summary全局评分统计汇总
rating_distribution1 到 5 星评分分布
popular_meals热门高评分菜品
active_users活跃用户画像
als_user_recommendationsALS 用户推荐结果
itemcf_user_recommendationsItemCF 用户推荐结果
als_meal_similaritiesALS 菜品相似度
itemcf_meal_similaritiesItemCF 菜品相似度
model_metricsALS / ItemCF 模型评估指标
meal_realtime_window_statsFlink 窗口统计历史
meal_realtime_stats_current每个菜品最新实时热度

环境变量

Web 应用默认读取以下环境变量,未设置时使用 webapp/config.py 中的开发默认值。

变量默认值说明
MENU_DB_HOST192.168.10.128MySQL 主机
MENU_DB_PORT3306MySQL 端口
MENU_DB_USERrootMySQL 用户
MENU_DB_PASSWORDrootMySQL 密码
MENU_DB_NAMEmenu_recommendationMySQL 数据库
MENU_DB_CHARSETutf8mb4MySQL 字符集
SECRET_KEYmenu-recommendation-devFlask Session 密钥
MENU_KAFKA_BOOTSTRAP_SERVERS192.168.10.128:9092Kafka 地址
MENU_REVIEW_TOPICmeal_review_stream点评事件 topic

本地运行

1. 安装依赖

python -m venv .venv
pip install -r requirements.txt

2. 初始化业务表和演示数据

确保 MySQL 可连接,并且根目录存在 user_meal_rating_cleaned.csv

python scripts/init_web_business_tables.py
python scripts/init_realtime_window_tables.py

初始化后可使用演示账号:

demo_old / 123456
demo_new / 123456

3. 启动 Web 应用

python run_webapp_5001.py

浏览器访问:

http://127.0.0.1:5001

4. 启动实时链路

先启动 Zookeeper、Kafka、Hadoop/HDFS,然后按需运行:

python scripts/10__kafka_review_replay_producer.py --bootstrap-servers localhost:9092 --interval 2 --limit 100
python scripts/11_kafka_review_consumer_to_mysql.py --bootstrap-servers localhost:9092 --mysql-host localhost
python scripts/12_flink_review_window_stats.py --bootstrap-servers localhost:9092 --mysql-host localhost

5. 运行测试

python -m pytest

关键页面与接口

路径功能
/登录入口
/register用户注册
/home用户首页、个性化推荐、冷启动推荐、实时热门菜品
/history历史点餐与点评提交
/search菜品搜索
/meal/<meal_id>菜品详情、评论、相似菜品、实时统计
/dashboard推荐系统数据看板
/visualizationECharts 数据可视化
/models模型评估指标
/api/dashboard看板 JSON 数据
/api/visualization可视化 JSON 数据
/api/recommend/<user_id>指定用户推荐结果
/api/similar/<meal_id>指定菜品相似推荐

About

基于 Spark、Kafka、Flink、MySQL 和 Flask 的个性化菜品推荐系统,包含 ALS、ItemCF、冷启动推荐、实时点评流处理和数据可视化。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

个性化菜品推荐系统

Big_Data 项目集中的大数据处理与推荐系统实践项目。

这是一个面向课程设计的大数据个性化推荐项目,围绕“用户-菜品-评分/评论”数据构建离线推荐、实时点评流处理和 Web 展示闭环。系统使用 Spark 在 HDFS 上完成数据检查、特征准备、ALS 协同过滤、ItemCF 相似度计算;使用 Kafka 承接用户点评事件;使用 Flink 计算实时滑动窗口热度;使用 MySQL 存储业务数据、离线推荐结果和实时统计结果;使用 Flask 提供登录、推荐、搜索、详情、看板和可视化页面。

技术栈

层级技术
Web 应用Python, Flask, Jinja2, HTML, CSS, JavaScript
数据访问PyMySQL, MySQL 8.x
离线计算Apache Spark, PySpark, Spark MLlib ALS
推荐算法ALS 矩阵分解, ItemCF 基于物品的协同过滤, 热门菜品冷启动
流式处理Kafka, kafka-python, Apache Flink / PyFlink
数据存储HDFS, Parquet, CSV, MySQL
可视化ECharts, Flask API JSON
测试unittest / pytest

项目结构

.
├── webapp/ # Flask Web 应用
│ ├── app.py # 路由、登录注册、推荐页面、API、点评提交
│ ├── config.py # MySQL / Kafka / Flask 配置
│ ├── repository.py # MySQL 查询、Kafka 点评事件发布
│ ├── services.py # 推荐策略编排、冷启动、看板数据组织
│ ├── static/ # CSS 和前端刷新/图表脚本
│ └── templates/ # Jinja2 页面模板
├── 代码Code/ETL/ # Spark 离线处理与推荐模型脚本
│ ├── 01_spark_data_check.py
│ ├── 02_prepare_als_data.py
│ ├── 03_train_als_model.py
│ ├── 08_als_item_similarity_recommendation.py
│ └── 09_itemcf_recommendation.py
├── scripts/ # MySQL 初始化、Kafka 回放、Flink 实时统计
│ ├── init_web_business_tables.py
│ ├── init_realtime_window_tables.py
│ ├── 10__kafka_review_replay_producer.py
│ ├── 11_kafka_review_consumer_to_mysql.py
│ └── 12_flink_review_window_stats.py
├── tests/ # 服务层、路由、Kafka 脚本测试
├── run_webapp_5001.py # 以 5001 端口启动 Web 应用
└── user_meal_rating_cleaned.csv # 本地演示数据文件,默认不上传 GitHub

核心业务逻辑

微信图片_20260629111512_1382_94

1. 离线推荐链路

  1. 01_spark_data_check.pyhdfs:///Data/user_meal_rating_cleaned.csv 读取用户菜品评分数据,检查行数、用户数、菜品数、评分分布、重复评分、活跃用户和热门菜品。
  2. 02_prepare_als_data.py 对同一用户和菜品保留最新评分,使用 StringIndexeruser_idmeal_id 编码为 ALS 可训练的数值索引,并输出到 hdfs:///Data/processed/ratings_for_als
  3. 03_train_als_model.py 使用 Spark MLlib ALS 训练多个参数组合,按 RMSE 选择最优模型,生成每个用户 Top 10 推荐结果,并保存模型指标。
  4. 08_als_item_similarity_recommendation.py 读取 ALS item factors,通过余弦相似度生成每个菜品的相似菜品列表。
  5. 09_itemcf_recommendation.py 使用 ItemCF 计算菜品共现相似度,并基于用户历史评分生成辅助推荐,同时输出 RMSE、MAE、覆盖率等指标。

2. 实时点评链路

  1. Web 端用户在历史点餐页面提交评分和评论。
  2. webapp.repository.MySQLRepository.publish_review_event() 将点评封装为 JSON 事件并写入 Kafka topic meal_review_stream
  3. scripts/11_kafka_review_consumer_to_mysql.py 消费 Kafka 点评事件,幂等写入 meal_reviewsuser_order_history
  4. scripts/12_flink_review_window_stats.py 通过 PyFlink 消费同一 topic,以菜品为 key 计算 2 秒窗口内的评分次数、平均评分和热度分,并写入:
    • meal_realtime_window_stats
    • meal_realtime_stats_current
  5. Web 首页、菜品详情页和数据看板读取实时统计表,展示实时热门菜品和窗口评分变化。

3. Web 推荐逻辑

webapp.services.RecommendationService 统一封装推荐策略:

  • 新注册用户或无历史行为用户:使用热门高评分菜品做冷启动推荐。
  • 有历史行为用户:同时展示 ALS 主推荐和 ItemCF 辅助推荐。
  • 离线推荐缺失时:自动回退到热门菜品,保证页面始终有可展示内容。
  • 菜品详情页:同时展示 ALS 相似菜品、ItemCF 相似菜品、历史评论和 Flink 实时窗口统计。
  • 看板和可视化页:聚合评分概况、评分分布、热门菜品、活跃用户、模型指标、最新评论和实时热门菜品。 效果演示图
微信图片_20260629111639_1386_94微信图片_20260629111603_1383_94微信图片_20260629111639_1384_94

MySQL 主要表

表名作用
usersWeb 登录用户、注册日期、用户类型
meals菜品基础信息、平均评分、热度排名
meal_reviews用户对菜品的评分和评论
user_order_history用户历史点餐和评分行为
rating_summary全局评分统计汇总
rating_distribution1 到 5 星评分分布
popular_meals热门高评分菜品
active_users活跃用户画像
als_user_recommendationsALS 用户推荐结果
itemcf_user_recommendationsItemCF 用户推荐结果
als_meal_similaritiesALS 菜品相似度
itemcf_meal_similaritiesItemCF 菜品相似度
model_metricsALS / ItemCF 模型评估指标
meal_realtime_window_statsFlink 窗口统计历史
meal_realtime_stats_current每个菜品最新实时热度

环境变量

Web 应用默认读取以下环境变量,未设置时使用 webapp/config.py 中的开发默认值。

变量默认值说明
MENU_DB_HOST192.168.10.128MySQL 主机
MENU_DB_PORT3306MySQL 端口
MENU_DB_USERrootMySQL 用户
MENU_DB_PASSWORDrootMySQL 密码
MENU_DB_NAMEmenu_recommendationMySQL 数据库
MENU_DB_CHARSETutf8mb4MySQL 字符集
SECRET_KEYmenu-recommendation-devFlask Session 密钥
MENU_KAFKA_BOOTSTRAP_SERVERS192.168.10.128:9092Kafka 地址
MENU_REVIEW_TOPICmeal_review_stream点评事件 topic

本地运行

1. 安装依赖

python -m venv .venv
pip install -r requirements.txt

2. 初始化业务表和演示数据

确保 MySQL 可连接,并且根目录存在 user_meal_rating_cleaned.csv

python scripts/init_web_business_tables.py
python scripts/init_realtime_window_tables.py

初始化后可使用演示账号:

demo_old / 123456
demo_new / 123456

3. 启动 Web 应用

python run_webapp_5001.py

浏览器访问:

http://127.0.0.1:5001

4. 启动实时链路

先启动 Zookeeper、Kafka、Hadoop/HDFS,然后按需运行:

python scripts/10__kafka_review_replay_producer.py --bootstrap-servers localhost:9092 --interval 2 --limit 100
python scripts/11_kafka_review_consumer_to_mysql.py --bootstrap-servers localhost:9092 --mysql-host localhost
python scripts/12_flink_review_window_stats.py --bootstrap-servers localhost:9092 --mysql-host localhost

5. 运行测试

python -m pytest

关键页面与接口

路径功能
/登录入口
/register用户注册
/home用户首页、个性化推荐、冷启动推荐、实时热门菜品
/history历史点餐与点评提交
/search菜品搜索
/meal/<meal_id>菜品详情、评论、相似菜品、实时统计
/dashboard推荐系统数据看板
/visualizationECharts 数据可视化
/models模型评估指标
/api/dashboard看板 JSON 数据
/api/visualization可视化 JSON 数据
/api/recommend/<user_id>指定用户推荐结果
/api/similar/<meal_id>指定菜品相似推荐

About

基于 Spark、Kafka、Flink、MySQL 和 Flask 的个性化菜品推荐系统,包含 ALS、ItemCF、冷启动推荐、实时点评流处理和数据可视化。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

个性化菜品推荐系统

Big_Data 项目集中的大数据处理与推荐系统实践项目。

这是一个面向课程设计的大数据个性化推荐项目,围绕“用户-菜品-评分/评论”数据构建离线推荐、实时点评流处理和 Web 展示闭环。系统使用 Spark 在 HDFS 上完成数据检查、特征准备、ALS 协同过滤、ItemCF 相似度计算;使用 Kafka 承接用户点评事件;使用 Flink 计算实时滑动窗口热度;使用 MySQL 存储业务数据、离线推荐结果和实时统计结果;使用 Flask 提供登录、推荐、搜索、详情、看板和可视化页面。

技术栈

层级技术
Web 应用Python, Flask, Jinja2, HTML, CSS, JavaScript
数据访问PyMySQL, MySQL 8.x
离线计算Apache Spark, PySpark, Spark MLlib ALS
推荐算法ALS 矩阵分解, ItemCF 基于物品的协同过滤, 热门菜品冷启动
流式处理Kafka, kafka-python, Apache Flink / PyFlink
数据存储HDFS, Parquet, CSV, MySQL
可视化ECharts, Flask API JSON
测试unittest / pytest

项目结构

.
├── webapp/ # Flask Web 应用
│ ├── app.py # 路由、登录注册、推荐页面、API、点评提交
│ ├── config.py # MySQL / Kafka / Flask 配置
│ ├── repository.py # MySQL 查询、Kafka 点评事件发布
│ ├── services.py # 推荐策略编排、冷启动、看板数据组织
│ ├── static/ # CSS 和前端刷新/图表脚本
│ └── templates/ # Jinja2 页面模板
├── 代码Code/ETL/ # Spark 离线处理与推荐模型脚本
│ ├── 01_spark_data_check.py
│ ├── 02_prepare_als_data.py
│ ├── 03_train_als_model.py
│ ├── 08_als_item_similarity_recommendation.py
│ └── 09_itemcf_recommendation.py
├── scripts/ # MySQL 初始化、Kafka 回放、Flink 实时统计
│ ├── init_web_business_tables.py
│ ├── init_realtime_window_tables.py
│ ├── 10__kafka_review_replay_producer.py
│ ├── 11_kafka_review_consumer_to_mysql.py
│ └── 12_flink_review_window_stats.py
├── tests/ # 服务层、路由、Kafka 脚本测试
├── run_webapp_5001.py # 以 5001 端口启动 Web 应用
└── user_meal_rating_cleaned.csv # 本地演示数据文件,默认不上传 GitHub

核心业务逻辑

微信图片_20260629111512_1382_94

1. 离线推荐链路

  1. 01_spark_data_check.pyhdfs:///Data/user_meal_rating_cleaned.csv 读取用户菜品评分数据,检查行数、用户数、菜品数、评分分布、重复评分、活跃用户和热门菜品。
  2. 02_prepare_als_data.py 对同一用户和菜品保留最新评分,使用 StringIndexeruser_idmeal_id 编码为 ALS 可训练的数值索引,并输出到 hdfs:///Data/processed/ratings_for_als
  3. 03_train_als_model.py 使用 Spark MLlib ALS 训练多个参数组合,按 RMSE 选择最优模型,生成每个用户 Top 10 推荐结果,并保存模型指标。
  4. 08_als_item_similarity_recommendation.py 读取 ALS item factors,通过余弦相似度生成每个菜品的相似菜品列表。
  5. 09_itemcf_recommendation.py 使用 ItemCF 计算菜品共现相似度,并基于用户历史评分生成辅助推荐,同时输出 RMSE、MAE、覆盖率等指标。

2. 实时点评链路

  1. Web 端用户在历史点餐页面提交评分和评论。
  2. webapp.repository.MySQLRepository.publish_review_event() 将点评封装为 JSON 事件并写入 Kafka topic meal_review_stream
  3. scripts/11_kafka_review_consumer_to_mysql.py 消费 Kafka 点评事件,幂等写入 meal_reviewsuser_order_history
  4. scripts/12_flink_review_window_stats.py 通过 PyFlink 消费同一 topic,以菜品为 key 计算 2 秒窗口内的评分次数、平均评分和热度分,并写入:
    • meal_realtime_window_stats
    • meal_realtime_stats_current
  5. Web 首页、菜品详情页和数据看板读取实时统计表,展示实时热门菜品和窗口评分变化。

3. Web 推荐逻辑

webapp.services.RecommendationService 统一封装推荐策略:

  • 新注册用户或无历史行为用户:使用热门高评分菜品做冷启动推荐。
  • 有历史行为用户:同时展示 ALS 主推荐和 ItemCF 辅助推荐。
  • 离线推荐缺失时:自动回退到热门菜品,保证页面始终有可展示内容。
  • 菜品详情页:同时展示 ALS 相似菜品、ItemCF 相似菜品、历史评论和 Flink 实时窗口统计。
  • 看板和可视化页:聚合评分概况、评分分布、热门菜品、活跃用户、模型指标、最新评论和实时热门菜品。 效果演示图
微信图片_20260629111639_1386_94微信图片_20260629111603_1383_94微信图片_20260629111639_1384_94

MySQL 主要表

表名作用
usersWeb 登录用户、注册日期、用户类型
meals菜品基础信息、平均评分、热度排名
meal_reviews用户对菜品的评分和评论
user_order_history用户历史点餐和评分行为
rating_summary全局评分统计汇总
rating_distribution1 到 5 星评分分布
popular_meals热门高评分菜品
active_users活跃用户画像
als_user_recommendationsALS 用户推荐结果
itemcf_user_recommendationsItemCF 用户推荐结果
als_meal_similaritiesALS 菜品相似度
itemcf_meal_similaritiesItemCF 菜品相似度
model_metricsALS / ItemCF 模型评估指标
meal_realtime_window_statsFlink 窗口统计历史
meal_realtime_stats_current每个菜品最新实时热度

环境变量

Web 应用默认读取以下环境变量,未设置时使用 webapp/config.py 中的开发默认值。

变量默认值说明
MENU_DB_HOST192.168.10.128MySQL 主机
MENU_DB_PORT3306MySQL 端口
MENU_DB_USERrootMySQL 用户
MENU_DB_PASSWORDrootMySQL 密码
MENU_DB_NAMEmenu_recommendationMySQL 数据库
MENU_DB_CHARSETutf8mb4MySQL 字符集
SECRET_KEYmenu-recommendation-devFlask Session 密钥
MENU_KAFKA_BOOTSTRAP_SERVERS192.168.10.128:9092Kafka 地址
MENU_REVIEW_TOPICmeal_review_stream点评事件 topic

本地运行

1. 安装依赖

python -m venv .venv
pip install -r requirements.txt

2. 初始化业务表和演示数据

确保 MySQL 可连接,并且根目录存在 user_meal_rating_cleaned.csv

python scripts/init_web_business_tables.py
python scripts/init_realtime_window_tables.py

初始化后可使用演示账号:

demo_old / 123456
demo_new / 123456

3. 启动 Web 应用

python run_webapp_5001.py

浏览器访问:

http://127.0.0.1:5001

4. 启动实时链路

先启动 Zookeeper、Kafka、Hadoop/HDFS,然后按需运行:

python scripts/10__kafka_review_replay_producer.py --bootstrap-servers localhost:9092 --interval 2 --limit 100
python scripts/11_kafka_review_consumer_to_mysql.py --bootstrap-servers localhost:9092 --mysql-host localhost
python scripts/12_flink_review_window_stats.py --bootstrap-servers localhost:9092 --mysql-host localhost

5. 运行测试

python -m pytest

关键页面与接口

路径功能
/登录入口
/register用户注册
/home用户首页、个性化推荐、冷启动推荐、实时热门菜品
/history历史点餐与点评提交
/search菜品搜索
/meal/<meal_id>菜品详情、评论、相似菜品、实时统计
/dashboard推荐系统数据看板
/visualizationECharts 数据可视化
/models模型评估指标
/api/dashboard看板 JSON 数据
/api/visualization可视化 JSON 数据
/api/recommend/<user_id>指定用户推荐结果
/api/similar/<meal_id>指定菜品相似推荐

About

基于 Spark、Kafka、Flink、MySQL 和 Flask 的个性化菜品推荐系统,包含 ALS、ItemCF、冷启动推荐、实时点评流处理和数据可视化。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

个性化菜品推荐系统

Big_Data 项目集中的大数据处理与推荐系统实践项目。

这是一个面向课程设计的大数据个性化推荐项目,围绕“用户-菜品-评分/评论”数据构建离线推荐、实时点评流处理和 Web 展示闭环。系统使用 Spark 在 HDFS 上完成数据检查、特征准备、ALS 协同过滤、ItemCF 相似度计算;使用 Kafka 承接用户点评事件;使用 Flink 计算实时滑动窗口热度;使用 MySQL 存储业务数据、离线推荐结果和实时统计结果;使用 Flask 提供登录、推荐、搜索、详情、看板和可视化页面。

技术栈

层级技术
Web 应用Python, Flask, Jinja2, HTML, CSS, JavaScript
数据访问PyMySQL, MySQL 8.x
离线计算Apache Spark, PySpark, Spark MLlib ALS
推荐算法ALS 矩阵分解, ItemCF 基于物品的协同过滤, 热门菜品冷启动
流式处理Kafka, kafka-python, Apache Flink / PyFlink
数据存储HDFS, Parquet, CSV, MySQL
可视化ECharts, Flask API JSON
测试unittest / pytest

项目结构

.
├── webapp/ # Flask Web 应用
│ ├── app.py # 路由、登录注册、推荐页面、API、点评提交
│ ├── config.py # MySQL / Kafka / Flask 配置
│ ├── repository.py # MySQL 查询、Kafka 点评事件发布
│ ├── services.py # 推荐策略编排、冷启动、看板数据组织
│ ├── static/ # CSS 和前端刷新/图表脚本
│ └── templates/ # Jinja2 页面模板
├── 代码Code/ETL/ # Spark 离线处理与推荐模型脚本
│ ├── 01_spark_data_check.py
│ ├── 02_prepare_als_data.py
│ ├── 03_train_als_model.py
│ ├── 08_als_item_similarity_recommendation.py
│ └── 09_itemcf_recommendation.py
├── scripts/ # MySQL 初始化、Kafka 回放、Flink 实时统计
│ ├── init_web_business_tables.py
│ ├── init_realtime_window_tables.py
│ ├── 10__kafka_review_replay_producer.py
│ ├── 11_kafka_review_consumer_to_mysql.py
│ └── 12_flink_review_window_stats.py
├── tests/ # 服务层、路由、Kafka 脚本测试
├── run_webapp_5001.py # 以 5001 端口启动 Web 应用
└── user_meal_rating_cleaned.csv # 本地演示数据文件,默认不上传 GitHub

核心业务逻辑

微信图片_20260629111512_1382_94

1. 离线推荐链路

  1. 01_spark_data_check.pyhdfs:///Data/user_meal_rating_cleaned.csv 读取用户菜品评分数据,检查行数、用户数、菜品数、评分分布、重复评分、活跃用户和热门菜品。
  2. 02_prepare_als_data.py 对同一用户和菜品保留最新评分,使用 StringIndexeruser_idmeal_id 编码为 ALS 可训练的数值索引,并输出到 hdfs:///Data/processed/ratings_for_als
  3. 03_train_als_model.py 使用 Spark MLlib ALS 训练多个参数组合,按 RMSE 选择最优模型,生成每个用户 Top 10 推荐结果,并保存模型指标。
  4. 08_als_item_similarity_recommendation.py 读取 ALS item factors,通过余弦相似度生成每个菜品的相似菜品列表。
  5. 09_itemcf_recommendation.py 使用 ItemCF 计算菜品共现相似度,并基于用户历史评分生成辅助推荐,同时输出 RMSE、MAE、覆盖率等指标。

2. 实时点评链路

  1. Web 端用户在历史点餐页面提交评分和评论。
  2. webapp.repository.MySQLRepository.publish_review_event() 将点评封装为 JSON 事件并写入 Kafka topic meal_review_stream
  3. scripts/11_kafka_review_consumer_to_mysql.py 消费 Kafka 点评事件,幂等写入 meal_reviewsuser_order_history
  4. scripts/12_flink_review_window_stats.py 通过 PyFlink 消费同一 topic,以菜品为 key 计算 2 秒窗口内的评分次数、平均评分和热度分,并写入:
    • meal_realtime_window_stats
    • meal_realtime_stats_current
  5. Web 首页、菜品详情页和数据看板读取实时统计表,展示实时热门菜品和窗口评分变化。

3. Web 推荐逻辑

webapp.services.RecommendationService 统一封装推荐策略:

  • 新注册用户或无历史行为用户:使用热门高评分菜品做冷启动推荐。
  • 有历史行为用户:同时展示 ALS 主推荐和 ItemCF 辅助推荐。
  • 离线推荐缺失时:自动回退到热门菜品,保证页面始终有可展示内容。
  • 菜品详情页:同时展示 ALS 相似菜品、ItemCF 相似菜品、历史评论和 Flink 实时窗口统计。
  • 看板和可视化页:聚合评分概况、评分分布、热门菜品、活跃用户、模型指标、最新评论和实时热门菜品。 效果演示图
微信图片_20260629111639_1386_94微信图片_20260629111603_1383_94微信图片_20260629111639_1384_94

MySQL 主要表

表名作用
usersWeb 登录用户、注册日期、用户类型
meals菜品基础信息、平均评分、热度排名
meal_reviews用户对菜品的评分和评论
user_order_history用户历史点餐和评分行为
rating_summary全局评分统计汇总
rating_distribution1 到 5 星评分分布
popular_meals热门高评分菜品
active_users活跃用户画像
als_user_recommendationsALS 用户推荐结果
itemcf_user_recommendationsItemCF 用户推荐结果
als_meal_similaritiesALS 菜品相似度
itemcf_meal_similaritiesItemCF 菜品相似度
model_metricsALS / ItemCF 模型评估指标
meal_realtime_window_statsFlink 窗口统计历史
meal_realtime_stats_current每个菜品最新实时热度

环境变量

Web 应用默认读取以下环境变量,未设置时使用 webapp/config.py 中的开发默认值。

变量默认值说明
MENU_DB_HOST192.168.10.128MySQL 主机
MENU_DB_PORT3306MySQL 端口
MENU_DB_USERrootMySQL 用户
MENU_DB_PASSWORDrootMySQL 密码
MENU_DB_NAMEmenu_recommendationMySQL 数据库
MENU_DB_CHARSETutf8mb4MySQL 字符集
SECRET_KEYmenu-recommendation-devFlask Session 密钥
MENU_KAFKA_BOOTSTRAP_SERVERS192.168.10.128:9092Kafka 地址
MENU_REVIEW_TOPICmeal_review_stream点评事件 topic

本地运行

1. 安装依赖

python -m venv .venv
pip install -r requirements.txt

2. 初始化业务表和演示数据

确保 MySQL 可连接,并且根目录存在 user_meal_rating_cleaned.csv

python scripts/init_web_business_tables.py
python scripts/init_realtime_window_tables.py

初始化后可使用演示账号:

demo_old / 123456
demo_new / 123456

3. 启动 Web 应用

python run_webapp_5001.py

浏览器访问:

http://127.0.0.1:5001

4. 启动实时链路

先启动 Zookeeper、Kafka、Hadoop/HDFS,然后按需运行:

python scripts/10__kafka_review_replay_producer.py --bootstrap-servers localhost:9092 --interval 2 --limit 100
python scripts/11_kafka_review_consumer_to_mysql.py --bootstrap-servers localhost:9092 --mysql-host localhost
python scripts/12_flink_review_window_stats.py --bootstrap-servers localhost:9092 --mysql-host localhost

5. 运行测试

python -m pytest

关键页面与接口

路径功能
/登录入口
/register用户注册
/home用户首页、个性化推荐、冷启动推荐、实时热门菜品
/history历史点餐与点评提交
/search菜品搜索
/meal/<meal_id>菜品详情、评论、相似菜品、实时统计
/dashboard推荐系统数据看板
/visualizationECharts 数据可视化
/models模型评估指标
/api/dashboard看板 JSON 数据
/api/visualization可视化 JSON 数据
/api/recommend/<user_id>指定用户推荐结果
/api/similar/<meal_id>指定菜品相似推荐

About

基于 Spark、Kafka、Flink、MySQL 和 Flask 的个性化菜品推荐系统,包含 ALS、ItemCF、冷启动推荐、实时点评流处理和数据可视化。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

个性化菜品推荐系统

Big_Data 项目集中的大数据处理与推荐系统实践项目。

这是一个面向课程设计的大数据个性化推荐项目,围绕“用户-菜品-评分/评论”数据构建离线推荐、实时点评流处理和 Web 展示闭环。系统使用 Spark 在 HDFS 上完成数据检查、特征准备、ALS 协同过滤、ItemCF 相似度计算;使用 Kafka 承接用户点评事件;使用 Flink 计算实时滑动窗口热度;使用 MySQL 存储业务数据、离线推荐结果和实时统计结果;使用 Flask 提供登录、推荐、搜索、详情、看板和可视化页面。

技术栈

层级技术
Web 应用Python, Flask, Jinja2, HTML, CSS, JavaScript
数据访问PyMySQL, MySQL 8.x
离线计算Apache Spark, PySpark, Spark MLlib ALS
推荐算法ALS 矩阵分解, ItemCF 基于物品的协同过滤, 热门菜品冷启动
流式处理Kafka, kafka-python, Apache Flink / PyFlink
数据存储HDFS, Parquet, CSV, MySQL
可视化ECharts, Flask API JSON
测试unittest / pytest

项目结构

.
├── webapp/ # Flask Web 应用
│ ├── app.py # 路由、登录注册、推荐页面、API、点评提交
│ ├── config.py # MySQL / Kafka / Flask 配置
│ ├── repository.py # MySQL 查询、Kafka 点评事件发布
│ ├── services.py # 推荐策略编排、冷启动、看板数据组织
│ ├── static/ # CSS 和前端刷新/图表脚本
│ └── templates/ # Jinja2 页面模板
├── 代码Code/ETL/ # Spark 离线处理与推荐模型脚本
│ ├── 01_spark_data_check.py
│ ├── 02_prepare_als_data.py
│ ├── 03_train_als_model.py
│ ├── 08_als_item_similarity_recommendation.py
│ └── 09_itemcf_recommendation.py
├── scripts/ # MySQL 初始化、Kafka 回放、Flink 实时统计
│ ├── init_web_business_tables.py
│ ├── init_realtime_window_tables.py
│ ├── 10__kafka_review_replay_producer.py
│ ├── 11_kafka_review_consumer_to_mysql.py
│ └── 12_flink_review_window_stats.py
├── tests/ # 服务层、路由、Kafka 脚本测试
├── run_webapp_5001.py # 以 5001 端口启动 Web 应用
└── user_meal_rating_cleaned.csv # 本地演示数据文件,默认不上传 GitHub

核心业务逻辑

微信图片_20260629111512_1382_94

1. 离线推荐链路

  1. 01_spark_data_check.pyhdfs:///Data/user_meal_rating_cleaned.csv 读取用户菜品评分数据,检查行数、用户数、菜品数、评分分布、重复评分、活跃用户和热门菜品。
  2. 02_prepare_als_data.py 对同一用户和菜品保留最新评分,使用 StringIndexeruser_idmeal_id 编码为 ALS 可训练的数值索引,并输出到 hdfs:///Data/processed/ratings_for_als
  3. 03_train_als_model.py 使用 Spark MLlib ALS 训练多个参数组合,按 RMSE 选择最优模型,生成每个用户 Top 10 推荐结果,并保存模型指标。
  4. 08_als_item_similarity_recommendation.py 读取 ALS item factors,通过余弦相似度生成每个菜品的相似菜品列表。
  5. 09_itemcf_recommendation.py 使用 ItemCF 计算菜品共现相似度,并基于用户历史评分生成辅助推荐,同时输出 RMSE、MAE、覆盖率等指标。

2. 实时点评链路

  1. Web 端用户在历史点餐页面提交评分和评论。
  2. webapp.repository.MySQLRepository.publish_review_event() 将点评封装为 JSON 事件并写入 Kafka topic meal_review_stream
  3. scripts/11_kafka_review_consumer_to_mysql.py 消费 Kafka 点评事件,幂等写入 meal_reviewsuser_order_history
  4. scripts/12_flink_review_window_stats.py 通过 PyFlink 消费同一 topic,以菜品为 key 计算 2 秒窗口内的评分次数、平均评分和热度分,并写入:
    • meal_realtime_window_stats
    • meal_realtime_stats_current
  5. Web 首页、菜品详情页和数据看板读取实时统计表,展示实时热门菜品和窗口评分变化。

3. Web 推荐逻辑

webapp.services.RecommendationService 统一封装推荐策略:

  • 新注册用户或无历史行为用户:使用热门高评分菜品做冷启动推荐。
  • 有历史行为用户:同时展示 ALS 主推荐和 ItemCF 辅助推荐。
  • 离线推荐缺失时:自动回退到热门菜品,保证页面始终有可展示内容。
  • 菜品详情页:同时展示 ALS 相似菜品、ItemCF 相似菜品、历史评论和 Flink 实时窗口统计。
  • 看板和可视化页:聚合评分概况、评分分布、热门菜品、活跃用户、模型指标、最新评论和实时热门菜品。 效果演示图
微信图片_20260629111639_1386_94微信图片_20260629111603_1383_94微信图片_20260629111639_1384_94

MySQL 主要表

表名作用
usersWeb 登录用户、注册日期、用户类型
meals菜品基础信息、平均评分、热度排名
meal_reviews用户对菜品的评分和评论
user_order_history用户历史点餐和评分行为
rating_summary全局评分统计汇总
rating_distribution1 到 5 星评分分布
popular_meals热门高评分菜品
active_users活跃用户画像
als_user_recommendationsALS 用户推荐结果
itemcf_user_recommendationsItemCF 用户推荐结果
als_meal_similaritiesALS 菜品相似度
itemcf_meal_similaritiesItemCF 菜品相似度
model_metricsALS / ItemCF 模型评估指标
meal_realtime_window_statsFlink 窗口统计历史
meal_realtime_stats_current每个菜品最新实时热度

环境变量

Web 应用默认读取以下环境变量,未设置时使用 webapp/config.py 中的开发默认值。

变量默认值说明
MENU_DB_HOST192.168.10.128MySQL 主机
MENU_DB_PORT3306MySQL 端口
MENU_DB_USERrootMySQL 用户
MENU_DB_PASSWORDrootMySQL 密码
MENU_DB_NAMEmenu_recommendationMySQL 数据库
MENU_DB_CHARSETutf8mb4MySQL 字符集
SECRET_KEYmenu-recommendation-devFlask Session 密钥
MENU_KAFKA_BOOTSTRAP_SERVERS192.168.10.128:9092Kafka 地址
MENU_REVIEW_TOPICmeal_review_stream点评事件 topic

本地运行

1. 安装依赖

python -m venv .venv
pip install -r requirements.txt

2. 初始化业务表和演示数据

确保 MySQL 可连接,并且根目录存在 user_meal_rating_cleaned.csv

python scripts/init_web_business_tables.py
python scripts/init_realtime_window_tables.py

初始化后可使用演示账号:

demo_old / 123456
demo_new / 123456

3. 启动 Web 应用

python run_webapp_5001.py

浏览器访问:

http://127.0.0.1:5001

4. 启动实时链路

先启动 Zookeeper、Kafka、Hadoop/HDFS,然后按需运行:

python scripts/10__kafka_review_replay_producer.py --bootstrap-servers localhost:9092 --interval 2 --limit 100
python scripts/11_kafka_review_consumer_to_mysql.py --bootstrap-servers localhost:9092 --mysql-host localhost
python scripts/12_flink_review_window_stats.py --bootstrap-servers localhost:9092 --mysql-host localhost

5. 运行测试

python -m pytest

关键页面与接口

路径功能
/登录入口
/register用户注册
/home用户首页、个性化推荐、冷启动推荐、实时热门菜品
/history历史点餐与点评提交
/search菜品搜索
/meal/<meal_id>菜品详情、评论、相似菜品、实时统计
/dashboard推荐系统数据看板
/visualizationECharts 数据可视化
/models模型评估指标
/api/dashboard看板 JSON 数据
/api/visualization可视化 JSON 数据
/api/recommend/<user_id>指定用户推荐结果
/api/similar/<meal_id>指定菜品相似推荐

About

基于 Spark、Kafka、Flink、MySQL 和 Flask 的个性化菜品推荐系统,包含 ALS、ItemCF、冷启动推荐、实时点评流处理和数据可视化。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

个性化菜品推荐系统

Big_Data 项目集中的大数据处理与推荐系统实践项目。

这是一个面向课程设计的大数据个性化推荐项目,围绕“用户-菜品-评分/评论”数据构建离线推荐、实时点评流处理和 Web 展示闭环。系统使用 Spark 在 HDFS 上完成数据检查、特征准备、ALS 协同过滤、ItemCF 相似度计算;使用 Kafka 承接用户点评事件;使用 Flink 计算实时滑动窗口热度;使用 MySQL 存储业务数据、离线推荐结果和实时统计结果;使用 Flask 提供登录、推荐、搜索、详情、看板和可视化页面。

技术栈

层级技术
Web 应用Python, Flask, Jinja2, HTML, CSS, JavaScript
数据访问PyMySQL, MySQL 8.x
离线计算Apache Spark, PySpark, Spark MLlib ALS
推荐算法ALS 矩阵分解, ItemCF 基于物品的协同过滤, 热门菜品冷启动
流式处理Kafka, kafka-python, Apache Flink / PyFlink
数据存储HDFS, Parquet, CSV, MySQL
可视化ECharts, Flask API JSON
测试unittest / pytest

项目结构

.
├── webapp/ # Flask Web 应用
│ ├── app.py # 路由、登录注册、推荐页面、API、点评提交
│ ├── config.py # MySQL / Kafka / Flask 配置
│ ├── repository.py # MySQL 查询、Kafka 点评事件发布
│ ├── services.py # 推荐策略编排、冷启动、看板数据组织
│ ├── static/ # CSS 和前端刷新/图表脚本
│ └── templates/ # Jinja2 页面模板
├── 代码Code/ETL/ # Spark 离线处理与推荐模型脚本
│ ├── 01_spark_data_check.py
│ ├── 02_prepare_als_data.py
│ ├── 03_train_als_model.py
│ ├── 08_als_item_similarity_recommendation.py
│ └── 09_itemcf_recommendation.py
├── scripts/ # MySQL 初始化、Kafka 回放、Flink 实时统计
│ ├── init_web_business_tables.py
│ ├── init_realtime_window_tables.py
│ ├── 10__kafka_review_replay_producer.py
│ ├── 11_kafka_review_consumer_to_mysql.py
│ └── 12_flink_review_window_stats.py
├── tests/ # 服务层、路由、Kafka 脚本测试
├── run_webapp_5001.py # 以 5001 端口启动 Web 应用
└── user_meal_rating_cleaned.csv # 本地演示数据文件,默认不上传 GitHub

核心业务逻辑

微信图片_20260629111512_1382_94

1. 离线推荐链路

  1. 01_spark_data_check.pyhdfs:///Data/user_meal_rating_cleaned.csv 读取用户菜品评分数据,检查行数、用户数、菜品数、评分分布、重复评分、活跃用户和热门菜品。
  2. 02_prepare_als_data.py 对同一用户和菜品保留最新评分,使用 StringIndexeruser_idmeal_id 编码为 ALS 可训练的数值索引,并输出到 hdfs:///Data/processed/ratings_for_als
  3. 03_train_als_model.py 使用 Spark MLlib ALS 训练多个参数组合,按 RMSE 选择最优模型,生成每个用户 Top 10 推荐结果,并保存模型指标。
  4. 08_als_item_similarity_recommendation.py 读取 ALS item factors,通过余弦相似度生成每个菜品的相似菜品列表。
  5. 09_itemcf_recommendation.py 使用 ItemCF 计算菜品共现相似度,并基于用户历史评分生成辅助推荐,同时输出 RMSE、MAE、覆盖率等指标。

2. 实时点评链路

  1. Web 端用户在历史点餐页面提交评分和评论。
  2. webapp.repository.MySQLRepository.publish_review_event() 将点评封装为 JSON 事件并写入 Kafka topic meal_review_stream
  3. scripts/11_kafka_review_consumer_to_mysql.py 消费 Kafka 点评事件,幂等写入 meal_reviewsuser_order_history
  4. scripts/12_flink_review_window_stats.py 通过 PyFlink 消费同一 topic,以菜品为 key 计算 2 秒窗口内的评分次数、平均评分和热度分,并写入:
    • meal_realtime_window_stats
    • meal_realtime_stats_current
  5. Web 首页、菜品详情页和数据看板读取实时统计表,展示实时热门菜品和窗口评分变化。

3. Web 推荐逻辑

webapp.services.RecommendationService 统一封装推荐策略:

  • 新注册用户或无历史行为用户:使用热门高评分菜品做冷启动推荐。
  • 有历史行为用户:同时展示 ALS 主推荐和 ItemCF 辅助推荐。
  • 离线推荐缺失时:自动回退到热门菜品,保证页面始终有可展示内容。
  • 菜品详情页:同时展示 ALS 相似菜品、ItemCF 相似菜品、历史评论和 Flink 实时窗口统计。
  • 看板和可视化页:聚合评分概况、评分分布、热门菜品、活跃用户、模型指标、最新评论和实时热门菜品。 效果演示图
微信图片_20260629111639_1386_94微信图片_20260629111603_1383_94微信图片_20260629111639_1384_94

MySQL 主要表

表名作用
usersWeb 登录用户、注册日期、用户类型
meals菜品基础信息、平均评分、热度排名
meal_reviews用户对菜品的评分和评论
user_order_history用户历史点餐和评分行为
rating_summary全局评分统计汇总
rating_distribution1 到 5 星评分分布
popular_meals热门高评分菜品
active_users活跃用户画像
als_user_recommendationsALS 用户推荐结果
itemcf_user_recommendationsItemCF 用户推荐结果
als_meal_similaritiesALS 菜品相似度
itemcf_meal_similaritiesItemCF 菜品相似度
model_metricsALS / ItemCF 模型评估指标
meal_realtime_window_statsFlink 窗口统计历史
meal_realtime_stats_current每个菜品最新实时热度

环境变量

Web 应用默认读取以下环境变量,未设置时使用 webapp/config.py 中的开发默认值。

变量默认值说明
MENU_DB_HOST192.168.10.128MySQL 主机
MENU_DB_PORT3306MySQL 端口
MENU_DB_USERrootMySQL 用户
MENU_DB_PASSWORDrootMySQL 密码
MENU_DB_NAMEmenu_recommendationMySQL 数据库
MENU_DB_CHARSETutf8mb4MySQL 字符集
SECRET_KEYmenu-recommendation-devFlask Session 密钥
MENU_KAFKA_BOOTSTRAP_SERVERS192.168.10.128:9092Kafka 地址
MENU_REVIEW_TOPICmeal_review_stream点评事件 topic

本地运行

1. 安装依赖

python -m venv .venv
pip install -r requirements.txt

2. 初始化业务表和演示数据

确保 MySQL 可连接,并且根目录存在 user_meal_rating_cleaned.csv

python scripts/init_web_business_tables.py
python scripts/init_realtime_window_tables.py

初始化后可使用演示账号:

demo_old / 123456
demo_new / 123456

3. 启动 Web 应用

python run_webapp_5001.py

浏览器访问:

http://127.0.0.1:5001

4. 启动实时链路

先启动 Zookeeper、Kafka、Hadoop/HDFS,然后按需运行:

python scripts/10__kafka_review_replay_producer.py --bootstrap-servers localhost:9092 --interval 2 --limit 100
python scripts/11_kafka_review_consumer_to_mysql.py --bootstrap-servers localhost:9092 --mysql-host localhost
python scripts/12_flink_review_window_stats.py --bootstrap-servers localhost:9092 --mysql-host localhost

5. 运行测试

python -m pytest

关键页面与接口

路径功能
/登录入口
/register用户注册
/home用户首页、个性化推荐、冷启动推荐、实时热门菜品
/history历史点餐与点评提交
/search菜品搜索
/meal/<meal_id>菜品详情、评论、相似菜品、实时统计
/dashboard推荐系统数据看板
/visualizationECharts 数据可视化
/models模型评估指标
/api/dashboard看板 JSON 数据
/api/visualization可视化 JSON 数据
/api/recommend/<user_id>指定用户推荐结果
/api/similar/<meal_id>指定菜品相似推荐

About

基于 Spark、Kafka、Flink、MySQL 和 Flask 的个性化菜品推荐系统,包含 ALS、ItemCF、冷启动推荐、实时点评流处理和数据可视化。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

个性化菜品推荐系统

Big_Data 项目集中的大数据处理与推荐系统实践项目。

这是一个面向课程设计的大数据个性化推荐项目,围绕“用户-菜品-评分/评论”数据构建离线推荐、实时点评流处理和 Web 展示闭环。系统使用 Spark 在 HDFS 上完成数据检查、特征准备、ALS 协同过滤、ItemCF 相似度计算;使用 Kafka 承接用户点评事件;使用 Flink 计算实时滑动窗口热度;使用 MySQL 存储业务数据、离线推荐结果和实时统计结果;使用 Flask 提供登录、推荐、搜索、详情、看板和可视化页面。

技术栈

层级技术
Web 应用Python, Flask, Jinja2, HTML, CSS, JavaScript
数据访问PyMySQL, MySQL 8.x
离线计算Apache Spark, PySpark, Spark MLlib ALS
推荐算法ALS 矩阵分解, ItemCF 基于物品的协同过滤, 热门菜品冷启动
流式处理Kafka, kafka-python, Apache Flink / PyFlink
数据存储HDFS, Parquet, CSV, MySQL
可视化ECharts, Flask API JSON
测试unittest / pytest

项目结构

.
├── webapp/ # Flask Web 应用
│ ├── app.py # 路由、登录注册、推荐页面、API、点评提交
│ ├── config.py # MySQL / Kafka / Flask 配置
│ ├── repository.py # MySQL 查询、Kafka 点评事件发布
│ ├── services.py # 推荐策略编排、冷启动、看板数据组织
│ ├── static/ # CSS 和前端刷新/图表脚本
│ └── templates/ # Jinja2 页面模板
├── 代码Code/ETL/ # Spark 离线处理与推荐模型脚本
│ ├── 01_spark_data_check.py
│ ├── 02_prepare_als_data.py
│ ├── 03_train_als_model.py
│ ├── 08_als_item_similarity_recommendation.py
│ └── 09_itemcf_recommendation.py
├── scripts/ # MySQL 初始化、Kafka 回放、Flink 实时统计
│ ├── init_web_business_tables.py
│ ├── init_realtime_window_tables.py
│ ├── 10__kafka_review_replay_producer.py
│ ├── 11_kafka_review_consumer_to_mysql.py
│ └── 12_flink_review_window_stats.py
├── tests/ # 服务层、路由、Kafka 脚本测试
├── run_webapp_5001.py # 以 5001 端口启动 Web 应用
└── user_meal_rating_cleaned.csv # 本地演示数据文件,默认不上传 GitHub

核心业务逻辑

微信图片_20260629111512_1382_94

1. 离线推荐链路

  1. 01_spark_data_check.pyhdfs:///Data/user_meal_rating_cleaned.csv 读取用户菜品评分数据,检查行数、用户数、菜品数、评分分布、重复评分、活跃用户和热门菜品。
  2. 02_prepare_als_data.py 对同一用户和菜品保留最新评分,使用 StringIndexeruser_idmeal_id 编码为 ALS 可训练的数值索引,并输出到 hdfs:///Data/processed/ratings_for_als
  3. 03_train_als_model.py 使用 Spark MLlib ALS 训练多个参数组合,按 RMSE 选择最优模型,生成每个用户 Top 10 推荐结果,并保存模型指标。
  4. 08_als_item_similarity_recommendation.py 读取 ALS item factors,通过余弦相似度生成每个菜品的相似菜品列表。
  5. 09_itemcf_recommendation.py 使用 ItemCF 计算菜品共现相似度,并基于用户历史评分生成辅助推荐,同时输出 RMSE、MAE、覆盖率等指标。

2. 实时点评链路

  1. Web 端用户在历史点餐页面提交评分和评论。
  2. webapp.repository.MySQLRepository.publish_review_event() 将点评封装为 JSON 事件并写入 Kafka topic meal_review_stream
  3. scripts/11_kafka_review_consumer_to_mysql.py 消费 Kafka 点评事件,幂等写入 meal_reviewsuser_order_history
  4. scripts/12_flink_review_window_stats.py 通过 PyFlink 消费同一 topic,以菜品为 key 计算 2 秒窗口内的评分次数、平均评分和热度分,并写入:
    • meal_realtime_window_stats
    • meal_realtime_stats_current
  5. Web 首页、菜品详情页和数据看板读取实时统计表,展示实时热门菜品和窗口评分变化。

3. Web 推荐逻辑

webapp.services.RecommendationService 统一封装推荐策略:

  • 新注册用户或无历史行为用户:使用热门高评分菜品做冷启动推荐。
  • 有历史行为用户:同时展示 ALS 主推荐和 ItemCF 辅助推荐。
  • 离线推荐缺失时:自动回退到热门菜品,保证页面始终有可展示内容。
  • 菜品详情页:同时展示 ALS 相似菜品、ItemCF 相似菜品、历史评论和 Flink 实时窗口统计。
  • 看板和可视化页:聚合评分概况、评分分布、热门菜品、活跃用户、模型指标、最新评论和实时热门菜品。 效果演示图
微信图片_20260629111639_1386_94微信图片_20260629111603_1383_94微信图片_20260629111639_1384_94

MySQL 主要表

表名作用
usersWeb 登录用户、注册日期、用户类型
meals菜品基础信息、平均评分、热度排名
meal_reviews用户对菜品的评分和评论
user_order_history用户历史点餐和评分行为
rating_summary全局评分统计汇总
rating_distribution1 到 5 星评分分布
popular_meals热门高评分菜品
active_users活跃用户画像
als_user_recommendationsALS 用户推荐结果
itemcf_user_recommendationsItemCF 用户推荐结果
als_meal_similaritiesALS 菜品相似度
itemcf_meal_similaritiesItemCF 菜品相似度
model_metricsALS / ItemCF 模型评估指标
meal_realtime_window_statsFlink 窗口统计历史
meal_realtime_stats_current每个菜品最新实时热度

环境变量

Web 应用默认读取以下环境变量,未设置时使用 webapp/config.py 中的开发默认值。

变量默认值说明
MENU_DB_HOST192.168.10.128MySQL 主机
MENU_DB_PORT3306MySQL 端口
MENU_DB_USERrootMySQL 用户
MENU_DB_PASSWORDrootMySQL 密码
MENU_DB_NAMEmenu_recommendationMySQL 数据库
MENU_DB_CHARSETutf8mb4MySQL 字符集
SECRET_KEYmenu-recommendation-devFlask Session 密钥
MENU_KAFKA_BOOTSTRAP_SERVERS192.168.10.128:9092Kafka 地址
MENU_REVIEW_TOPICmeal_review_stream点评事件 topic

本地运行

1. 安装依赖

python -m venv .venv
pip install -r requirements.txt

2. 初始化业务表和演示数据

确保 MySQL 可连接,并且根目录存在 user_meal_rating_cleaned.csv

python scripts/init_web_business_tables.py
python scripts/init_realtime_window_tables.py

初始化后可使用演示账号:

demo_old / 123456
demo_new / 123456

3. 启动 Web 应用

python run_webapp_5001.py

浏览器访问:

http://127.0.0.1:5001

4. 启动实时链路

先启动 Zookeeper、Kafka、Hadoop/HDFS,然后按需运行:

python scripts/10__kafka_review_replay_producer.py --bootstrap-servers localhost:9092 --interval 2 --limit 100
python scripts/11_kafka_review_consumer_to_mysql.py --bootstrap-servers localhost:9092 --mysql-host localhost
python scripts/12_flink_review_window_stats.py --bootstrap-servers localhost:9092 --mysql-host localhost

5. 运行测试

python -m pytest

关键页面与接口

路径功能
/登录入口
/register用户注册
/home用户首页、个性化推荐、冷启动推荐、实时热门菜品
/history历史点餐与点评提交
/search菜品搜索
/meal/<meal_id>菜品详情、评论、相似菜品、实时统计
/dashboard推荐系统数据看板
/visualizationECharts 数据可视化
/models模型评估指标
/api/dashboard看板 JSON 数据
/api/visualization可视化 JSON 数据
/api/recommend/<user_id>指定用户推荐结果
/api/similar/<meal_id>指定菜品相似推荐

About

基于 Spark、Kafka、Flink、MySQL 和 Flask 的个性化菜品推荐系统,包含 ALS、ItemCF、冷启动推荐、实时点评流处理和数据可视化。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

个性化菜品推荐系统

Big_Data 项目集中的大数据处理与推荐系统实践项目。

这是一个面向课程设计的大数据个性化推荐项目,围绕“用户-菜品-评分/评论”数据构建离线推荐、实时点评流处理和 Web 展示闭环。系统使用 Spark 在 HDFS 上完成数据检查、特征准备、ALS 协同过滤、ItemCF 相似度计算;使用 Kafka 承接用户点评事件;使用 Flink 计算实时滑动窗口热度;使用 MySQL 存储业务数据、离线推荐结果和实时统计结果;使用 Flask 提供登录、推荐、搜索、详情、看板和可视化页面。

技术栈

层级技术
Web 应用Python, Flask, Jinja2, HTML, CSS, JavaScript
数据访问PyMySQL, MySQL 8.x
离线计算Apache Spark, PySpark, Spark MLlib ALS
推荐算法ALS 矩阵分解, ItemCF 基于物品的协同过滤, 热门菜品冷启动
流式处理Kafka, kafka-python, Apache Flink / PyFlink
数据存储HDFS, Parquet, CSV, MySQL
可视化ECharts, Flask API JSON
测试unittest / pytest

项目结构

.
├── webapp/ # Flask Web 应用
│ ├── app.py # 路由、登录注册、推荐页面、API、点评提交
│ ├── config.py # MySQL / Kafka / Flask 配置
│ ├── repository.py # MySQL 查询、Kafka 点评事件发布
│ ├── services.py # 推荐策略编排、冷启动、看板数据组织
│ ├── static/ # CSS 和前端刷新/图表脚本
│ └── templates/ # Jinja2 页面模板
├── 代码Code/ETL/ # Spark 离线处理与推荐模型脚本
│ ├── 01_spark_data_check.py
│ ├── 02_prepare_als_data.py
│ ├── 03_train_als_model.py
│ ├── 08_als_item_similarity_recommendation.py
│ └── 09_itemcf_recommendation.py
├── scripts/ # MySQL 初始化、Kafka 回放、Flink 实时统计
│ ├── init_web_business_tables.py
│ ├── init_realtime_window_tables.py
│ ├── 10__kafka_review_replay_producer.py
│ ├── 11_kafka_review_consumer_to_mysql.py
│ └── 12_flink_review_window_stats.py
├── tests/ # 服务层、路由、Kafka 脚本测试
├── run_webapp_5001.py # 以 5001 端口启动 Web 应用
└── user_meal_rating_cleaned.csv # 本地演示数据文件,默认不上传 GitHub

核心业务逻辑

微信图片_20260629111512_1382_94

1. 离线推荐链路

  1. 01_spark_data_check.pyhdfs:///Data/user_meal_rating_cleaned.csv 读取用户菜品评分数据,检查行数、用户数、菜品数、评分分布、重复评分、活跃用户和热门菜品。
  2. 02_prepare_als_data.py 对同一用户和菜品保留最新评分,使用 StringIndexeruser_idmeal_id 编码为 ALS 可训练的数值索引,并输出到 hdfs:///Data/processed/ratings_for_als
  3. 03_train_als_model.py 使用 Spark MLlib ALS 训练多个参数组合,按 RMSE 选择最优模型,生成每个用户 Top 10 推荐结果,并保存模型指标。
  4. 08_als_item_similarity_recommendation.py 读取 ALS item factors,通过余弦相似度生成每个菜品的相似菜品列表。
  5. 09_itemcf_recommendation.py 使用 ItemCF 计算菜品共现相似度,并基于用户历史评分生成辅助推荐,同时输出 RMSE、MAE、覆盖率等指标。

2. 实时点评链路

  1. Web 端用户在历史点餐页面提交评分和评论。
  2. webapp.repository.MySQLRepository.publish_review_event() 将点评封装为 JSON 事件并写入 Kafka topic meal_review_stream
  3. scripts/11_kafka_review_consumer_to_mysql.py 消费 Kafka 点评事件,幂等写入 meal_reviewsuser_order_history
  4. scripts/12_flink_review_window_stats.py 通过 PyFlink 消费同一 topic,以菜品为 key 计算 2 秒窗口内的评分次数、平均评分和热度分,并写入:
    • meal_realtime_window_stats
    • meal_realtime_stats_current
  5. Web 首页、菜品详情页和数据看板读取实时统计表,展示实时热门菜品和窗口评分变化。

3. Web 推荐逻辑

webapp.services.RecommendationService 统一封装推荐策略:

  • 新注册用户或无历史行为用户:使用热门高评分菜品做冷启动推荐。
  • 有历史行为用户:同时展示 ALS 主推荐和 ItemCF 辅助推荐。
  • 离线推荐缺失时:自动回退到热门菜品,保证页面始终有可展示内容。
  • 菜品详情页:同时展示 ALS 相似菜品、ItemCF 相似菜品、历史评论和 Flink 实时窗口统计。
  • 看板和可视化页:聚合评分概况、评分分布、热门菜品、活跃用户、模型指标、最新评论和实时热门菜品。 效果演示图
微信图片_20260629111639_1386_94微信图片_20260629111603_1383_94微信图片_20260629111639_1384_94

MySQL 主要表

表名作用
usersWeb 登录用户、注册日期、用户类型
meals菜品基础信息、平均评分、热度排名
meal_reviews用户对菜品的评分和评论
user_order_history用户历史点餐和评分行为
rating_summary全局评分统计汇总
rating_distribution1 到 5 星评分分布
popular_meals热门高评分菜品
active_users活跃用户画像
als_user_recommendationsALS 用户推荐结果
itemcf_user_recommendationsItemCF 用户推荐结果
als_meal_similaritiesALS 菜品相似度
itemcf_meal_similaritiesItemCF 菜品相似度
model_metricsALS / ItemCF 模型评估指标
meal_realtime_window_statsFlink 窗口统计历史
meal_realtime_stats_current每个菜品最新实时热度

环境变量

Web 应用默认读取以下环境变量,未设置时使用 webapp/config.py 中的开发默认值。

变量默认值说明
MENU_DB_HOST192.168.10.128MySQL 主机
MENU_DB_PORT3306MySQL 端口
MENU_DB_USERrootMySQL 用户
MENU_DB_PASSWORDrootMySQL 密码
MENU_DB_NAMEmenu_recommendationMySQL 数据库
MENU_DB_CHARSETutf8mb4MySQL 字符集
SECRET_KEYmenu-recommendation-devFlask Session 密钥
MENU_KAFKA_BOOTSTRAP_SERVERS192.168.10.128:9092Kafka 地址
MENU_REVIEW_TOPICmeal_review_stream点评事件 topic

本地运行

1. 安装依赖

python -m venv .venv
pip install -r requirements.txt

2. 初始化业务表和演示数据

确保 MySQL 可连接,并且根目录存在 user_meal_rating_cleaned.csv

python scripts/init_web_business_tables.py
python scripts/init_realtime_window_tables.py

初始化后可使用演示账号:

demo_old / 123456
demo_new / 123456

3. 启动 Web 应用

python run_webapp_5001.py

浏览器访问:

http://127.0.0.1:5001

4. 启动实时链路

先启动 Zookeeper、Kafka、Hadoop/HDFS,然后按需运行:

python scripts/10__kafka_review_replay_producer.py --bootstrap-servers localhost:9092 --interval 2 --limit 100
python scripts/11_kafka_review_consumer_to_mysql.py --bootstrap-servers localhost:9092 --mysql-host localhost
python scripts/12_flink_review_window_stats.py --bootstrap-servers localhost:9092 --mysql-host localhost

5. 运行测试

python -m pytest

关键页面与接口

路径功能
/登录入口
/register用户注册
/home用户首页、个性化推荐、冷启动推荐、实时热门菜品
/history历史点餐与点评提交
/search菜品搜索
/meal/<meal_id>菜品详情、评论、相似菜品、实时统计
/dashboard推荐系统数据看板
/visualizationECharts 数据可视化
/models模型评估指标
/api/dashboard看板 JSON 数据
/api/visualization可视化 JSON 数据
/api/recommend/<user_id>指定用户推荐结果
/api/similar/<meal_id>指定菜品相似推荐

About

基于 Spark、Kafka、Flink、MySQL 和 Flask 的个性化菜品推荐系统,包含 ALS、ItemCF、冷启动推荐、实时点评流处理和数据可视化。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages