題幹與適用場景
這是資料工程與可觀測性場景中的近似統計題。事件以串流方式到達,節點記憶體有限,結果要按窗口輸出並支援跨節點合併。重點不是背誦某個函式庫 API,而是解釋近似百分位數的目標、誤差界線與可驗證性。
面試官考察什麼
- 能否先區分精確百分位數、固定桶直方圖與可合併 sketch 的限制。
- 能否說明 t-digest 為什麼把較多摘要容量放在分布兩端。
- 能否處理重複值、極端值、窗口邊界、合併順序與空輸入。
- 能否用離線真值和誤差指標驗證近似結果,而不是只報告看似精確的數字。
回答前需要釐清的問題
先確認查詢百分位點是否集中在尾端、資料是否有權重、窗口是否滑動、是否需要跨機器合併、允許的絕對或相對誤差是多少,以及結果是否用於告警、計費或合規。若必須提供稽核級精確值,近似 sketch 不能取代原始排序或可證明的精確結構。
30 秒回答框架
我會選擇可合併的 t-digest,而不是保存所有樣本。它把排序後的值壓縮成帶權重的叢集,並讓尾端叢集更小,因此 P95/P99 的解析度高於中部。每個節點獨立更新,窗口結束時合併摘要,再查詢百分位數。壓縮參數決定大小與誤差;我會用保留的離線樣本計算精確值,按百分位點和窗口測量誤差,並在極端值、重複值和不同合併順序下做回歸測試。
分步驟深入解答
1. 先定義精確目標與替代方案
精確百分位數需要保留並排序所有樣本,記憶體隨事件數增長。固定桶直方圖容易聚合,但桶邊界決定誤差,尾端可能很粗。t-digest 保存有序叢集及其權重,適合串流更新與摘要合併;它仍是近似結果,不能把輸出格式化成精確百分位。
2. 理解叢集和尺度函數
一個叢集包含中心值與權重,權重表示它覆蓋的樣本數。壓縮時要求叢集權重上限隨其百分位位置變化:靠近零和一的尾端允許的叢集更小,中間區域可使用更大的叢集。尺度函數與壓縮參數共同決定摘要大小與尾端精度,不能只說「壓縮越高越準」而不說明記憶體代價。
3. 設計分散式合併路徑
每個分片先按時間窗口維護自己的 digest,窗口關閉或達到大小門檻後輸出摘要。合併時把叢集按中心排序並重新壓縮,而不是簡單平均各節點的 P99;百分位數不是線性可平均的統計量。窗口識別、取樣權重和版本要隨摘要傳遞,避免跨窗口或重複消費。
4. 處理邊界與數值問題
空窗口應回傳明確的缺失狀態;所有值相同或重複率很高時,權重會集中在少數叢集,測試應確認查詢仍穩定。極端大值、NaN、負延遲和單位混用必須在寫入前拒絕或規範化。滑動窗口要定義遲到事件落在哪個窗口,以及摘要過期後如何釋放。
5. 建立誤差驗證與告警規則
從生產流量抽取可控樣本並保留原始值,離線排序得到真值,再比較 P50、P95、P99 的絕對誤差、相對誤差和超標比例。測試不同資料分布、樣本量、分片數、合併樹形和合併順序;若摘要大小或誤差超過預算,降低窗口粒度、調整壓縮參數或改用合適的 sketch。告警應同時展示樣本量與誤差估計,避免小樣本尾端誤報。
6. 何時不用 t-digest
需要精確稽核、樣本量小或查詢百分位點固定且桶邊界穩定時,排序或直方圖更簡單。資料有嚴格可證明誤差預算時,可比較 KLL 等 quantile sketch。若分布需要長時間回放,保留可重建的原始或分層取樣資料,不能把壓縮摘要當作永久事實來源。
高品質示範回答
我會先確定 P95/P99 的誤差預算、窗口與是否需要跨節點合併。t-digest 用帶權重的有序叢集表示分布,並在兩端使用更小的叢集,因此適合延遲這類關心尾端的指標。每個分片獨立更新,窗口結束後合併叢集並重新壓縮,絕不平均各分片的 P99。寫入時清洗 NaN、單位和異常值,記錄窗口與權重。驗證時保留抽樣原始值,計算精確百分位數,按分布、分片數和合併順序比較誤差;若超過預算,就調整壓縮與窗口或改用直方圖、KLL 或精確排序。
常見錯誤
- 平均各機器的 P99 → 百分位數不可線性平均 → 合併摘要或原始樣本後再查詢。
- 把 t-digest 當精確結果 → 壓縮會遺失排序細節 → 明確誤差預算並輸出樣本量。
- 只調大壓縮參數 → 摘要變大且尾端收益不一定線性 → 用離線真值測量大小與誤差曲線。
- 忽略遲到事件 → 窗口統計不可重現 → 定義水位線、遲到策略和摘要版本。
- 用小樣本 P99 直接告警 → 尾端估計變異很大 → 同時設定最小樣本量和誤差護欄。
追問及應對
為什麼不能直接合併各節點的 P99?
P99 是非線性統計量,各節點樣本量和分布可能不同。只合併 P99 會遺失中間排序資訊;應合併可攜帶權重的摘要或原始樣本。
合併順序會影響結果嗎?
近似摘要的壓縮過程可能讓結果有小幅差異。把合併實作為排序後統一壓縮,固定版本與參數,並將不同合併樹形納入誤差回歸測試。
P99 誤差突然升高,先改哪個參數?
先檢查樣本量、異常值、窗口遲到和合併是否重複,再觀察摘要大小。只有確認是表示能力不足時,才提高尾端精度或降低窗口粒度,並用真值驗證收益。
什麼時候 KLL 更合適?
當需要更明確的秩誤差保證、查詢百分位點較均勻且不特別偏向尾端時,可評估 KLL。選擇應依據誤差定義、合併特性、記憶體預算和實作成熟度,而不是只看單一 benchmark。