在前邊介紹時序數據的時候, 我們可能經常會遇到計算基數(Cardinality) 和分位數 (Quantile)。 基數我們可以理解爲 count distinct。比如計算頁面訪問的獨立ip, 分位數我們舉個我們最常用的第99百分位數例子, 假設我說中國人壽命的第99百分位數是101歲, 這個表示, 99%的中國人的壽命不會超過101歲。
我們看看基數怎麼計算。 假設我們要統計獨立ip, 則我們需要一行行讀入訪問日誌, 找到對端ip, 然後在內存裏建一個map或者set, 測試這個ip是否已經存在, 如果不存在則插入。 最後統計map或者set的元素。 這個方法雖然很準確, 但是要消耗大量的內存。 其實在現實應用中, 這個數據往往允許一定範圍的誤差, 所以我們可以用統計方法來計算這個基數。 思路如下,首先我們把ip地址用一個哈希函數均勻的分散到 一個很大的範圍上, 然後再把哈希後的值映射到一組(比如1k個)bucket中。 每個bucket只需要一個bit表示。 如果有數據映射到這個bucket 則標記爲1 否則標記爲0. 現在假設訪問請求都是特定的幾個ip產生的, 則在我們的bucket中, 大量bit都是0. 如果訪問請求來自衆多的不同的ip, 則大量bit位被置1. 所以通過被置1的bit的多少就能估算出獨立ip的數量。
上面我只介紹一個基本原理, 詳細的算法請自行翻看論文。
在時序數據處理中, 類似上面這種估算算法被大量使用,一般涉及基數(Cardinality), 分位數(Quantile), topN等運算的時候都可以使用類似估算方法在一定誤差範圍內得到可接受的結果。限於個人能力以及篇幅, 這裏不做一一介紹。
在druid中, 這些估算算法也得到了封裝, 用戶只要在的定義task的時候加以說明, 就可以直接使用了。
廣告插播:
大數據處理招聘:
要求算法,數據結構等基礎知識紮實
具有良好的編程功底
瞭解大數據解決方案
有過高併發高壓力系統設計開發經驗
熟練使用Linux系統,瞭解Linux內核
工作地點: 大連
工作內容: line 相關大數據處理
聯繫方式 簡歷發送至 dl_server_developer_recruit%nhn.com
喜歡工作上有壓力有挑戰, 生活上愜意舒適的朋友, 大連歡迎你