演示入口:行情大屏 https://dashboard.zl4629.xyz ,业务后台 https://admin.zl4629.xyz (后台需登录账号,此处不提供凭据)。域名备案问题解决之前,从大陆公网访问这两个地址可能被拦截,链路本身是通的。

01这个项目在做什么

电脑硬件的价格没有官方行情。能拿到的只有各导购站每天挂出来的条目:商品标题、零散的规格、厂商参考价、评论热度、榜单名次。它们格式不统一、口径不一致、还会被源站悄悄改掉。

HWLens 要做的就是把这批脏输入变成可解释、可复现的行情数据,并在上面搭三层应用:给普通用户看的行情大屏、给业务方用的管理后台、以及用自然语言问数和生成研报的智能体。

论文叙事不是我一开始选的,是数据形状逼出来的:挂牌价几乎不动,所以“预测价格”没有信号;而两个源对同一条商品的报价差异稳定存在,于是核心问题换成跨源价格融合、实体对齐、特征定价,最后用“结论对方法论变更是否稳健”收尾。

02整体链路

text
采集机  Scrapy 多源(日更 / 周频 / 按需参数补采)
   → 原始页面留档 + JSONL 分区(Hive 式 dt 目录)
   → 打包拉取 → HDFS ODS
   → Spark 多阶段:清洗 → 参数抽取 → 实体对齐 → 双源对价 → 截面特征
   → 导出 staging → Doris Stream Load(ADS)→ 对账校验
   → 同一份 pipeline 以开关控制双写 Iceberg 湖表
   → 读路径可切湖(环境变量 + systemd drop-in)
   → FastAPI 大屏后端 / Django 业务后台 / 智能体
   → 公网入口:Caddy + SSH 反向隧道

分层职责我守得很死:ODS 只做搬运留痕、DWD 把事实粒度写死、DIM 挂代理键、DWS 做固定粒度的轻度汇总、ADS 只服务具体展示。“回写 DWD”和“只服务一张临时报表的怪表”都算违规。

03机器分工

角色承担
大数据主节点HDFS NameNode、Spark Master、Doris FE/BE、Iceberg 仓库
提交与调度节点代码根目录、Spark Driver、每日 nightly 编排
算力节点Spark Worker / HDFS DataNode
应用节点FastAPI、Django、MySQL 业务库、反向隧道(服务只监听 loopback)
公网采集机Scrapy 爬虫、Caddy HTTPS 入口、前端静态产物

集群节点出公网只开一个端口,所以公网 URL 必须在那台公网机上或浏览器里验证——在集群内测出的“失败”通常是拓扑造成的,不是服务故障。

04我认为最有价值的三个模块

·采集与契约

爬虫不是脚本,是有一个显式契约的生产者:主键是“源 + 源条目 + 快照日期”,价格字段带状态(解析成功 / 缺失 / 面议 / 下架 / 可疑),区间价不强行折成单值,结构版本与解析器版本分开记录,行级与页面级指纹各一份。

原始页面全部留档,所以解析器改版后可以在同一批输入上重放比对——这让“改进解析”变成一件可验证的事,而不是一次赌注。

·跨源实体对齐

平台里所有比价结论的前提是“这两条 listing 是同一个商品”。这条链路踩了最多的坑:总容量做键会把套装和单条合并,concat_ws 会把缺失字段静默跳段,规格键的粒度到系列就失效。

最后落到一个分层确定性键结构:证据充分时用规格加系列,不足时逐级回退到标题的字符多重集键,而不是丢弃记录。

支配全部取舍的原则只有一条:误判成不同是召回损失,误判成相同是数据造假。

代价也如实承担了:改键定义会让商品身份 ID 全部换代,含 ID 的跨日特征与 ADS 必须全量重放。

·湖仓一体改造

分阶段推进:可行性验证 → 明细与汇总层旁路双写 → 查询引擎直连湖 → 应用读路径切换 → 时间旅行分析。

两个设计我比较满意:双写时读回刚写的分区再入湖,保证湖表与生产落盘逐行一致(否则对账是在对比两个中间态);读路径切换用单点注入 + drop-in 环境变量,回滚只是改个文件名再重启。

05明确没做完 / 不能对外声称的部分

写论文时这几条被我明确标注,不放进去当成果:

  • **向量检索没有实现。**检索增强那部分是结构化表的全表扫描,不是向量库召回。设计稿里的向量方案未落地。
  • **没有自动化测试。**应用侧后端缺测试,这意味着它的正确性依赖人工核验,不能声称可回归。
  • **解析覆盖率偏低。**部分类目大量面议、品牌词典未覆盖、把规格写成营销长句的源本身结构化程度低,属治理项。
  • **补数链路有已知缺陷。**重放的幂等性依赖断点水位与装载 label,早期两处会静默“成功”,现在靠规范约束而不是靠机制保证。
  • **一批实验数字口径已过期。**收紧对齐键之后必须用新键重算,旧数字与新数字不可混用。
  • **一个采集源的定时触发方式尚未收口。**日志显示它每天在跑,但不在我管理的调度入口里,属未结项。

我认为这部分比成果更值得写:一个数据平台的可信度,来自它敢说“这里我没法验证”。

06系列笔记

链路里每个坑单独成篇,都在这个专题下: