这个基于SpringBoot与Spark的豆瓣电影数据分析系统,是我在指导计算机专业毕业设计时经常遇到的一个典型应用场景。随着影视行业数据量的激增,如何从海量用户评分和评论中提取有价值的信息,成为了一个极具挑战性的课题。
系统采用前后端分离架构,后端基于SpringBoot框架搭建RESTful API服务,前端使用Vue.js配合ECharts实现数据可视化展示。核心创新点在于引入Apache Spark分布式计算引擎来处理TB级别的电影数据,相比传统单机处理方式,性能提升了5-8倍。
提示:在实际教学中发现,很多同学容易混淆Spark和Hadoop的关系。简单来说,Spark是内存计算框架,适合迭代计算;Hadoop是分布式存储+批处理框架,两者可以互补使用。
系统采用分层架构设计,主要分为四个层次:
数据采集层:使用Scrapy爬虫框架,配置XPath规则抓取豆瓣电影详情页数据。为避免被封禁,我们实现了:
数据存储层:
数据处理层:
java复制// Spark数据处理示例代码
JavaRDD<Rating> ratings = spark.read()
.textFile("hdfs://comments/*.json")
.map(JSON::parse)
.mapToPair(json -> new Tuple2<>(
json.getInt("movieId"),
json.getDouble("rating")
));
应用展示层:
在真实数据集测试中,我们发现三个关键优化点:
内存配置:
bash复制spark.executor.memory=4G
spark.driver.memory=2G
spark.memory.fraction=0.6
数据分区策略:
持久化机制:
java复制ratings.persist(StorageLevel.MEMORY_AND_DISK_SER());
针对不同数据特性采用差异化存储策略:
| 数据类型 | 存储方案 | 访问频率 | 数据量 |
|---|---|---|---|
| 电影元数据 | MySQL | 高 | 约10万条 |
| 用户评论 | HDFS | 中 | TB级 |
| 聚合结果 | Redis | 极高 | GB级 |
爬虫系统设计需要考虑豆瓣的反爬机制:
请求头伪装:
python复制headers = {
'User-Agent': random.choice(user_agents),
'Referer': 'https://movie.douban.com/'
}
异常处理机制:
使用Spark SQL进行时序分析:
sql复制SELECT
DATE_FORMAT(create_time, 'yyyy-MM') AS month,
AVG(rating) AS avg_rating,
COUNT(*) AS comment_count
FROM comments
GROUP BY month
ORDER BY month
基于HanLP中文分词库构建情感词典:
java复制public double analyzeSentiment(String comment) {
List<Term> terms = HanLP.segment(comment);
return terms.stream()
.mapToDouble(term -> sentimentDict.getOrDefault(term.word, 0.0))
.average()
.orElse(0.0);
}
热力地图的关键配置项:
javascript复制option = {
tooltip: {
position: 'top'
},
grid: {
height: '80%',
top: '10%'
},
xAxis: {
type: 'category',
data: hours,
splitArea: { show: true }
},
visualMap: {
min: 0,
max: 10,
calculable: true,
orient: 'horizontal',
left: 'center',
bottom: '15%'
}
}
针对大数据量渲染的解决方案:
数据采样:
WebWorker应用:
javascript复制const worker = new Worker('chartWorker.js');
worker.postMessage(rawData);
worker.onmessage = (e) => {
chart.setOption(e.data);
};
生产环境推荐配置:
| 组件 | 配置 | 数量 |
|---|---|---|
| Spark | 16核/32G内存/500G SSD | 3节点 |
| MySQL | 8核/16G内存/1T SSD | 主从架构 |
| Nginx | 4核/8G内存 | 2台负载均衡 |
使用Prometheus+Granfana监控体系:
关键指标:
报警规则:
yaml复制- alert: HighCPUUsage
expr: process_cpu_usage > 80%
for: 5m
labels:
severity: warning
SpringBoot后端配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST")
.maxAge(3600);
}
}
使用Eclipse Memory Analyzer分析步骤:
获取堆转储文件:
bash复制jmap -dump:format=b,file=heap.hprof <pid>
分析可疑对象:
典型问题:
在项目实践中,我们发现使用Spark的DataFrame API比直接操作RDD能减少30%左右的内存使用。对于刚接触大数据处理的开发者,建议先从Spark SQL入手,再逐步深入RDD编程模型。