在 10TB 原始语料上,如何用 MinHash LSH 在 4 小时内完成近似去重?

解读

面试官问的是“10TB 原始语料”“4 小时内”完成“近似去重”,核心考察三点:

  1. MinHash LSH 原理与误差的掌握;
  2. PB 级数据分布式工程的落地经验;
  3. 国内机房带宽、机型、成本的敏感度和取舍。
    回答必须给出可落地的端到端方案,包括数据分片、Hash 流水线、资源估算、失败重试、质量验证等环节,否则会被追问“你真的跑过 10TB 吗?”

知识点

  1. MinHash:用 k 个 64 bit 哈希函数对 5-gram 签名,签名矩阵行数 k 通常取 128~256
  2. LSH 波段:把签名拆成 b 波段×r 行,候选对相似度阈值 t ≈ (1/b)^(1/r),国内业务一般取 t=0.8
  3. Spark 原生 MinHash 在 10TB 场景下会 OOM 或 shuffle 爆炸,必须二次分桶+布隆过滤器做两级剪枝;
  4. 国内主流云厂商 8×A100 节点 1 Gbps 内网,单节点顺序读 3 GB/s,10TB 纯 IO 约 1 小时,CPU 是瓶颈
  5. 数据倾斜是面试必考点,需用 随机前缀+二次聚合 把热点文档打散;
  6. 质量验证不能只靠“肉眼”,需采样 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 万元以内,符合公司预算红线。

二、数据准备

  1. 切块:原始语料按 256 MB HDFS block 存储,SequenceFile 压缩 (Snappy),保证读盘 3 GB/s;
  2. 清洗:用 正则+Unicode 归一化 去 html 标签,统一 UTF-8,减少哈希噪音;
  3. 分片:Spark 读入后 repartition(8000),保证每分区 300 MB,避免 shuffle 阶段 2 GB 限制

三、MinHash 签名

  1. 5-gram 滑动窗口,MurmurHash3 64 bit 做 0-base 哈希;
  2. k=200 个哈希函数用 双重哈希技巧 h_i(x) = (a_i·x + b_i) mod 2^64,省内存
  3. 每个文档输出 (docId, Signature: Array[Long]) 宽 1.6 KB,总中间数据 4 TB开启 Spark ZSTD 压缩后落到 400 GB,内存压力可控

四、LSH 候选生成

  1. b=25 波段,r=8 行,相似度阈值 t≈0.82
  2. 每波段生成 key=bandId#hash(subSignature)reduceByKey 把同桶 docId 收集到内存;
  3. 单桶大于 5 000 文档 时,二次哈希再拆桶,防止单点 30 GB 大对象导致 Executor OOM
  4. 候选对去重后用 布隆过滤器Jaccard<0.6 的对快速剔除,减少 70% 后续计算

五、精确验证与输出

  1. 对候选对并行计算 真实 Jaccard保留>0.8
  2. 并查集 Union-Finddriver 端内存 32 GB 内完成连通分量计算,docId 用 Long 压缩位图
  3. 每簇保留 最长文档,其余写入 删除清单
  4. 最终 输出压缩 SequenceFile + 校验和总去重后 7.2 TB压缩率 28%

六、失败恢复

  • 开启 Spark speculation黑名单慢节点
  • 每波段落地 checkpoint 到 OSSstage 失败可增量重跑 10 min
  • driver HAYARN 自动重启checkpoint 自动加载

七、质量监控

  • 采样 10 000 对 人工标注,Precision=96.4%,Recall=95.1%
  • SimHash 全量回扫diff<0.5% 的交叉验证,通过评审

拓展思考

  1. 如果预算砍半,只能给 220 台,可把 k 降到 128 并把 IO 放大到 5 TB 内存表近似精度下降 1.2%时间仍守住 4 h
  2. 若数据敏感不能上云,私有化机房无 10 GbE,可用 Alluxio+SSD 缓存重复读降到 20%网络不再是瓶颈
  3. 后续大模型训练,可把去重后的 7.2 TB 直接按 BloomId 分桶每桶 200 GB方便后续增量微调
  4. 面试官可能追问 “为什么不用 SimHash+Hamming LSH?” 可答:SimHash 对长文档 5-gram 顺序敏感,MinHash 对集合无序更稳在中文重复段落场景 F1 高 3~5 个百分点
  5. 若要求精确去重,可用 Suffix Array + 并行归并,但时间>24 h不符合 4 h SLA,所以近似是业务最优解