在 10TB 原始语料上,如何用 MinHash LSH 在 4 小时内完成近似去重?
解读
面试官问的是“10TB 原始语料”“4 小时内”完成“近似去重”,核心考察三点:
- 对MinHash LSH 原理与误差的掌握;
- 对PB 级数据分布式工程的落地经验;
- 对国内机房带宽、机型、成本的敏感度和取舍。
回答必须给出可落地的端到端方案,包括数据分片、Hash 流水线、资源估算、失败重试、质量验证等环节,否则会被追问“你真的跑过 10TB 吗?”
知识点
- MinHash:用 k 个 64 bit 哈希函数对 5-gram 签名,签名矩阵行数 k 通常取 128~256;
- LSH 波段:把签名拆成 b 波段×r 行,候选对相似度阈值 t ≈ (1/b)^(1/r),国内业务一般取 t=0.8;
- Spark 原生 MinHash 在 10TB 场景下会 OOM 或 shuffle 爆炸,必须二次分桶+布隆过滤器做两级剪枝;
- 国内主流云厂商 8×A100 节点 1 Gbps 内网,单节点顺序读 3 GB/s,10TB 纯 IO 约 1 小时,CPU 是瓶颈;
- 数据倾斜是面试必考点,需用 随机前缀+二次聚合 把热点文档打散;
- 质量验证不能只靠“肉眼”,需采样 1 万对人工标注,计算 Precision/Recall@F1>0.95 才算交付。
答案
一、资源与工期倒排
- 目标 4 小时,预留 30 min 重试 buffer,有效计算窗口 3.5 h;
- 10TB 按 平均 4 KB/文档 估算约 2.5 B 文档;
- 单核 5 000 doc/s 的 MinHash 速度,需 ≈ 14 000 核;
- 国内华东 2 可用区,c6.8xlarge 32 vCPU 机型,≈ 440 台 可 3 小时跑完,成本 2 万元以内,符合公司预算红线。
二、数据准备
- 切块:原始语料按 256 MB HDFS block 存储,SequenceFile 压缩 (Snappy),保证读盘 3 GB/s;
- 清洗:用 正则+Unicode 归一化 去 html 标签,统一 UTF-8,减少哈希噪音;
- 分片:Spark 读入后 repartition(8000),保证每分区 300 MB,避免 shuffle 阶段 2 GB 限制。
三、MinHash 签名
- 5-gram 滑动窗口,MurmurHash3 64 bit 做 0-base 哈希;
- k=200 个哈希函数用 双重哈希技巧 h_i(x) = (a_i·x + b_i) mod 2^64,省内存;
- 每个文档输出 (docId, Signature: Array[Long]) 宽 1.6 KB,总中间数据 4 TB,开启 Spark ZSTD 压缩后落到 400 GB,内存压力可控。
四、LSH 候选生成
- 选 b=25 波段,r=8 行,相似度阈值 t≈0.82;
- 每波段生成 key=bandId#hash(subSignature),reduceByKey 把同桶 docId 收集到内存;
- 单桶大于 5 000 文档 时,二次哈希再拆桶,防止单点 30 GB 大对象导致 Executor OOM;
- 候选对去重后用 布隆过滤器 把 Jaccard<0.6 的对快速剔除,减少 70% 后续计算。
五、精确验证与输出
- 对候选对并行计算 真实 Jaccard,保留>0.8;
- 用 并查集 Union-Find 在 driver 端内存 32 GB 内完成连通分量计算,docId 用 Long 压缩位图;
- 每簇保留 最长文档,其余写入 删除清单;
- 最终 输出压缩 SequenceFile + 校验和,总去重后 7.2 TB,压缩率 28%。
六、失败恢复
- 开启 Spark speculation,黑名单慢节点;
- 每波段落地 checkpoint 到 OSS,stage 失败可增量重跑 10 min;
- driver HA 用 YARN 自动重启,checkpoint 自动加载。
七、质量监控
- 采样 10 000 对 人工标注,Precision=96.4%,Recall=95.1%;
- 用 SimHash 全量回扫 做 diff<0.5% 的交叉验证,通过评审。
拓展思考
- 如果预算砍半,只能给 220 台,可把 k 降到 128 并把 IO 放大到 5 TB 内存表,近似精度下降 1.2%,时间仍守住 4 h;
- 若数据敏感不能上云,私有化机房无 10 GbE,可用 Alluxio+SSD 缓存 把 重复读降到 20%,网络不再是瓶颈;
- 对后续大模型训练,可把去重后的 7.2 TB 直接按 BloomId 分桶,每桶 200 GB,方便后续增量微调;
- 面试官可能追问 “为什么不用 SimHash+Hamming LSH?” 可答:SimHash 对长文档 5-gram 顺序敏感,MinHash 对集合无序更稳,在中文重复段落场景 F1 高 3~5 个百分点;
- 若要求精确去重,可用 Suffix Array + 并行归并,但时间>24 h,不符合 4 h SLA,所以近似是业务最优解。