如何在30分鐘內完成數十億條數據的分析?

1. 受衆分析需求及難點

TalkingData推出的數字化營銷平臺(Smart Marketing Cloud,以下簡稱SMC),提供了一套從人羣構建、客羣洞察,再到同步投放、客觀監測的一體化解決方案,幫助企業構建完整的數字化營銷閉環。SMC服務多個行業的廣告主和廣告代理,幫助他們對目標受衆人羣進行分析、洞察和觸達。但是由於SMC彙集了包括一方企業數據、二方媒體數據和TalkingData自有數據在內的多源數據,數據量非常大;此外,爲了對受衆人羣進行全面、深入的畫像,TalkingData基於人口屬性、移動端行爲偏好等建立了擁有六大類別、800多個標籤的標籤體系,維度非常多。這對數據的處理分析提出了巨大的挑戰。

在具體使用中,產品性能是企業非常重視的方面。爲了提升SMC的性能,讓用戶能夠快速、準確的實現目標受衆洞察,我們從技術上對SMC的受衆分析能力進行了三大方面的優化。

2. 使用技術原理及方案:

Bitmap計算

在SMC中,由於數據量巨大,我們對所有廣告主構建的受衆人羣均會使用RoaringBitmap進行存儲。由於RoaringBitmap只能存儲整型數據,而我們需要處理的數據量在大多數情況下高達數十億條,故我們將RoaringBitmap進行擴展,使之支持長整型數據。

原生RoaringBitmap只支持int類型,最大數據存儲量爲2147483647,由於TalkingData設備數據量約80億,已遠遠超過RoaringBitmap的存儲範圍,所以需要使用長整型來擴展RoaringBitmap。

image

以 set(long)方法爲例,尋址方法大概如下代碼所示:

**public** **void** **set**(**long** offset) {
**int** index = (**int**) (offset / max());
**int** value = (**int**) (offset % max());
bitmaps.get(index).set(value);
}

擴展之後的RoaringBitmap,已經獲得了比較好的存儲和讀取速度。但這還只是開始,隨後還需要對這些人羣數據進行多維度的分析和計算。

RocksDB加速計算

SMC的受衆分析維度包含:人口屬性維度、設備屬性維度、商旅屬性、App行爲分析等。基於以上維度對某個廣告受衆人羣包進行分析時,需要進行約10萬次Bitmap的交併運算,此時系統CPU和I/O就成了瓶頸。於是我們採用RocksDB進行Bitmap的緩存,以減少I/O耗時。

RocksDB依靠大量靈活的配置,使之能針對不同的生產環境進行調優,包括直接使用內存、使用Flash、使用硬盤或者HDFS。支持使用不同的壓縮算法,並且有一套完整的工具供生產和調試使用。
RocksDB優勢如下:

  • 爲需要存儲TB級別數據到本地FLASH或者RAM的應用服務器設計
  • 針對存儲在高速設備的中小鍵值進行優化——支持存儲在flash或者直接存儲在內存
  • 性能隨CPU數量線性提升,對多核系統友好

RocksDB支持snappy、zlib、bzip2 lz4和lz4_hc壓縮算法。對不同層的數據可以配置不同的壓縮算法。一般來說,90%的數據保存在Lmax層。一個典型的安裝可能是L0-L2層不配置壓縮算法,中間層用snappy壓縮算法,而Lmax層採用zlib壓縮。使用RocksDB後,I/O性能顯著提升,原來需要3個小時以上才能計算完成的任務,現在縮短到1.5小時即可計算完畢。

但這個時間仍然太長,讓人無法忍受,於是我們想到對系統數據進行抽樣,以加快運算速度。

隨機抽樣算法

隨機抽樣是最爲常用的算法之一,它最大的特點是能夠通過抽取、計算較小的數據樣本量,來儘可能客觀的推斷數據總體特徵。

我們需要進行隨機抽樣且保持有序,當總設備量爲n,需要隨機挑選出m個設備,其中m < n。輸出是[0 , n-1] 範圍內m個隨機整數的有序列表,不允許重複。從概率的角度說,我們希望得到沒有重複的有序選擇,其中每個選擇出現的概率相等。簡單來說就是從n個數中, 隨機抽取m個數據,並保持有序。

輪流判斷n個數組成的列表中每個數的概率(m/n),每次判斷後n=n-1,若當前被判斷的數被選擇,則m=m-1,否則 m 不變。
\frac{m}{n} * \frac{m-1}{n-1} + \frac{n-m}{n} * \frac{m}{n-1}= \frac{m^2-m+mn-m^2}{n(n-1)}=\frac{m}{n}nm​∗n−1m−1​+nnm​∗n−1m​=n(n−1)m2−m+mnm2​=nm

實現方式:

**public** **static** Set<Long> **random**(**long** n,**int** m){

Set<Long> set = **new** TreeSet<Long>();
**long** remaining = n-1;
**for** (**long** i = 0; i<n ;i++){
    **if** (Math.random() * remaining < m){
        set.add(i);
        m -= 1;
    }
    remaining -= 1;
}
**return** set;

}

我們使用次方法從總設備量中隨機抽取受衆人羣分析樣本數據並加工成Bitmap。我們假設另此Bitmap爲A,男性全量數據M,則計算X人羣中的男性佔比P的公式爲:

P = \frac{A∩M∩X}{X}* 100%P=XAMX​∗100%

採用隨機抽樣方式獲得的佔比結果還是會有一定偏差。經對比50組隨機構建的受衆人羣包,對性別佔比進行分析,相對誤差率均未超過8%,在可接受範圍之內。

image

經過隨機抽樣計算之後,Bitmap數據佔用RocksDB存儲顯著減小,Bitmap計算效率顯著提高,數十億數據量的受衆分析任務可在30分鐘內計算完成。

基於以上這些優化,智能營銷雲可以快速完成對廣告受衆的分析,讓廣告主在整個廣告投放過程中及時瞭解自己的目標受衆特點以及分佈情況,從而指導廣告主及時對廣告投放受衆羣體進行調整。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章