最近在整理硬盘时翻到一个学生时代做的电商数据分析项目,这个基于Hadoop生态链构建的电脑商品价格监控系统,至今看来仍有不少值得分享的技术细节。当时为了完成毕业设计,花了三个月时间从零搭建了一套完整的爬虫采集+数据清洗+可视化分析平台,过程中踩过的坑和积累的经验,对现在从事数据工程的新人或许仍有参考价值。
这个项目的核心目标是通过自动化手段抓取主流电商平台的电脑商品数据(包括笔记本、台式机、配件等),建立价格波动分析模型,为消费者提供购买决策支持。系统每天采集约20万条商品数据,经过Hadoop集群处理后生成可视化报表,能直观反映各品牌产品的历史价格走势、平台比价、配置性价比等关键信息。
项目采用经典的三层架构设计:
选择这套组合主要基于以下考量:
mermaid复制graph TD
A[爬虫节点] -->|Kafka| B(HDFS)
B --> C[Hive数据仓库]
C --> D[Spark计算引擎]
D --> E[MySQL结果表]
E --> F[Spring Boot应用]
F --> G[浏览器可视化]
注:实际部署时需要特别注意Kafka消费者的offset管理,我们曾因错误配置导致数据重复消费
针对电商平台的反爬机制,我们实现了以下应对措施:
python复制class ProxyMiddleware(object):
def process_request(self, request, spider):
proxy = get_proxy_from_redis() # 从Redis获取可用代理
request.meta['proxy'] = f"http://{proxy['ip']}:{proxy['port']}"
request.headers['User-Agent'] = random.choice(UA_LIST)
原始爬取数据需要经过以下处理流程:
使用5台Dell R730服务器搭建集群:
关键配置参数调整:
xml复制<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value> <!-- 原默认值1024 -->
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>57344</value> <!-- 56GB可用 -->
</property>
采用分区表提升查询效率:
sql复制CREATE EXTERNAL TABLE product_price (
sku_id STRING,
price FLOAT,
platform STRING
) PARTITIONED BY (dt STRING, category STRING)
STORED AS PARQUET;
每日数据加载后执行:
sql复制MSCK REPAIR TABLE product_price;
使用ECharts实现的折线图组件,支持以下交互功能:
javascript复制option = {
tooltip: {
trigger: 'axis',
formatter: function(params) {
return `${params[0].seriesName}<br/>
日期: ${params[0].axisValue}<br/>
价格: ¥${params[0].data[1].toFixed(2)}`;
}
},
xAxis: { type: 'category' },
yAxis: { type: 'value' },
series: [{
type: 'line',
smooth: true,
data: priceData
}]
};
通过5个维度评估产品性价比:
建议使用Docker-compose编排服务:
yaml复制version: '3'
services:
hadoop:
image: sequenceiq/hadoop-docker:2.7.1
ports:
- "50070:50070"
- "8088:8088"
hive:
image: bde2020/hive:2.3.2-postgresql-metastore
depends_on:
- hadoop
采用Prometheus+Granfana监控体系:
现象:某个Reduce任务耗时异常长
解决方案:
sql复制-- 在Hive中启用倾斜优化
set hive.groupby.skewindata=true;
-- 或者对倾斜key单独处理
SELECT * FROM (
SELECT * FROM table WHERE key != 'hot_value'
UNION ALL
SELECT * FROM table WHERE key = 'hot_value' DISTRIBUTE BY rand()
) t
定期执行合并操作:
bash复制hadoop fs -getmerge /hdfs/path/*.csv localfile.csv
hadoop fs -put localfile.csv /hdfs/path/merged.csv
后续可考虑加入的功能扩展:
这个项目最宝贵的经验是让我深刻理解了大数据流水线中各个环节的耦合关系。比如某次爬虫规则变更导致数据格式变化,如果没有完善的schema校验机制,会引发下游Hive表加载失败。建议在数据入口处就建立严格的质量检查点,这比事后处理要高效得多。