Backend / Data Engineer · Screening

Oracle 海量 URL 日志:全局与过去 24 小时 Top K

区分精确外部分区聚合与在线滑动窗口;在内存受限条件下说明无法无状态地精确维护无限 URL 流。

题目重点:区分精确外部分区聚合与在线滑动窗口;在内存受限条件下说明无法无状态地精确维护无限 URL 流。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 同一 URL 的规范化规则先固定,如大小写、端口、查询参数与重定向;否则统计对象不稳定。
  • 先问是否要求精确。全局可对有限历史日志离线计算,24 小时结果以事件时间窗口 (now−24h,now] 为训练约定。

解题路线

  1. 有限历史全局精确解:按规范化 URL 哈希分区写磁盘或分布式存储,每个分区内按 URL 聚合计数;各分区只输出本地 Top K,再用大小 K 的堆合并。任一全局 Top K 必在其所属分区的本地 Top K 中。
  2. 若单个分区仍超内存,继续分区或外部排序;不能声称一个 K 大小的堆在只看原始日志一遍时就能精确识别任意高基数的频繁 URL。
  3. 24 小时精确窗口需要保存可过期的时间桶贡献或原始事件,过期时扣减;桶宽是近似边界时,明确最大时间误差。精确任意时刻窗口则需事件级状态或可重算的持久日志。
  4. 若状态预算仍不够,可用 Count-Min Sketch、heavy-hitter 候选和时间分桶近似;必须报告过估计误差、候选遗漏风险、删除/过期策略,并用精确样本校验。

手动走一遍

假设两分区,本地 Top 2 分别有 [A:100,B:90] 与 [C:95,D:80],全局 Top 2 从四个候选中得 A、C。24 小时窗若 A 的 70 次在边界外,仍把历史总数 100 当窗口数就会错;必须扣掉过期贡献。

规模与取舍

历史 N 条、U 个 URL、P 个分区:分区写入 O(N),每分区聚合总计 O(N),候选合并 O(PK log(PK)) 或 O(PK log K),内存由单分区基数和 K 控制;外部存储 O(N) 或 O(U+事件日志)。在线精确窗口至少需要能恢复尚未过期的贡献。

易错点与追问

容易失分的边界

  • 直接把全局计数 map 放内存,却未检查 U 是否超过预算。
  • 只保留当前 Top K,认为新 URL 永远不可能追上历史热门 URL。
  • 用小时桶回答“任意过去 24 小时精确 Top K”却不说明桶边界误差。

继续深挖

  • 迟到日志应该按接收时间还是事件时间入窗?如何修正已经发布的排行?
  • URL query 参数爆炸导致高基数时,规范化规则怎样避免合并不同资源?
  • 对 Top K 并列计数如何定义稳定排序?
✓已复制微信号!