查詢速度最高提升50倍!火山引擎ByteHouse在廣告投放領域實踐分享

(原標題:查詢速度最高提升50倍!火山引擎ByteHouse在廣告投放領域實踐分享)

據QuestMobile報告顯示,移動互聯網已經進入了下半場,在使用人數和使用時長方面已經沒有明顯增長,互聯網已經流量趨於飽和。

作爲廣告投放主要陣地,由於互聯網平臺流量紅利逐漸消退,越來越多的廣告企業和從業者開始探索精細化營銷的新路徑,取代以往的全流量、粗放式的廣告轟炸。精細化營銷意味着要在數以億計的人羣中優選出那些最具潛力的目標受衆,這無疑對提供基礎引擎支持的數據倉庫能力,提出了極大的技術挑戰。

在人羣圈選分析中, 分析師一般利用各種標籤組合,挑選出最合適的人羣,進而完成廣告推送,達到精準投放的效果。但由於人羣查詢在不同標籤組合下的結果集大小不同,在一次廣告投放中,分析師需要經過多次的邏輯調整,以獲得"最好"的人羣包。抖音集團擁有廣泛的廣告投放場景,在日常實踐中,我們發現以下痛點問題:

●首先,數據預估。廣告主需要對選定的人羣組合進行預估,以便判斷投放情況並確定投放預算。但廣告平臺用戶越來越多,有的平臺DAU達到上億,使得人羣包數據量過大,技術上只能採用1/10抽樣存儲,將導致10%誤差。

●其次,性能問題。爲了保證人羣圈選精準度,廣告主往往會設定多樣、複雜的人羣圈選條件,導致底層計算邏輯複雜,比如單次計算可能包含幾百,甚至上千個人羣包。Hive和Elasticsearch等方案在處理大數據量時,查詢速度慢。如果研發人員查詢某個廣告主的所有用戶,該方案需要掃描整個用戶庫,整個過程需要幾分鐘甚至幾個小時,無法滿足廣告主實時性要求。

●最後,存儲問題。Hive和Elasticsearch等方案需要額外的索引結構,使得存儲空間變大,導致成本增加。

在以往,研發團隊通常使用兩種方案來解決以上問題:

方案一:將每個人羣包存儲爲一個Array類型的數據結構,每次查詢需要從Array中找到某一個特定ID。

方案二:使用一個表來存儲用戶ID,在查詢的時使用In/Join計算多個人羣的交集。

經過內部長期使用經驗,無論是方案一或方案二,都存在當數據量逐漸增大,查詢速度無法滿足實時分析需求的問題。基於高性能、分佈式特點,ClickHouse可以滿足大規模數據的分析和查詢需求,因此研發團隊以開源ClickHouse爲基礎,研發出火山引擎雲原生數據倉庫ByteHouse,並在其中定製一套處理模型——BitEngine,用於解決集合的交併補計算在實時分析場景中的性能提升問題。

據介紹,BitEngine是一個高效集合數據處理模型,底層基於MergeTree Family存儲引擎,並在此基礎上引入了BitMap64類型,開發了系列相關運算函數。BitEngine提供的BitMap64類型適合表達具有特定關係的大量實體ID的集合,將集合的交併補運算轉化爲bitmap之間的交併補運算,從而達到遠超普通查詢的性能指標。

那麼,BitEngine如何應用在人羣圈選場景中?舉個例子,廣告主需求爲圈選出“人羣包A”和“人羣包B”的交集人羣,完成廣告精準投放。

人羣包情況:

●人羣包A = [10001, 20001,30001,40001,50001],人羣包B = [10001, 20001,20002,20003,20004]

期望結果:

●通過BitEngine計算A&B = [10001, 20001]

首先,人羣包按照一定規則劃分爲多個區間,任意兩個區間之間的人羣包沒有交集,由BitEngine保障數據的讀取和計算是嚴格按照區間進行;其次,BitEngine在數據讀取時會爲每一個文件構建一個讀任務,由一個線程調度模塊完成整個任務調度和讀取;最後,BitEngine完成所有中間結果計算後,按照結果的輸出要求做一次數據合併,由此完成交集計算。已上線業務的測試表明,相比普通和Array或者用戶表方式,BitEngine在查詢速度上有10-50倍提升。

BitEngine上線前後查詢耗時監控

BitEngine不僅僅在抖音集團海量廣告投放場景中使用,目前更是集成在火山引擎雲原生數據倉庫ByteHouse中對外輸出。火山引擎ByteHouse主要爲用戶提供極速分析體驗,能夠支撐實時數據分析和海量數據離線分析,具備便捷的彈性擴縮容能力,極致分析性能和豐富的企業級特性,目前已經與中國地震臺網中心、海王集團、莉莉絲遊戲、極客邦科技等諸多行業企業達成合作,深度助力各個行業數字化轉型。