用戶畫像和實時數據分析是互聯網企業的數據核心。基于Apache Doris,知乎數據賦能團隊構建了基于云服務的高響應、低成本、穩定靈活的實時數據架構,支持實時業務分析、實時算法特征和用戶畫像三大核心業務流程,顯著提升了時效性熱點和潛力的感知和響應速度,大幅降低了運營、營銷等業務場景中的人群定向成本,為實時算法和業務核心指標的準確性帶來了顯著收益。
關鍵詞:數據倉庫,Apache Doris,用戶畫像,實時數據
一、前言
在知乎,隨著各業務線的發展,對用戶畫像和實時數據的需求越來越多。至于用戶畫像,期望有更快、更準、更便捷的人群篩選工具和便捷的用戶群體分析能力。對于實時數據,期望有可以實時響應的用戶行為流。同時,算法特性、指標統計、業務可視化等業務場景對實時數據的需求越來越多。
2021年8月,知乎平臺團隊成立數據賦能團隊。針對歷史實時數據需求無接收器、現有用戶畫像系統無法滿足多樣化人群定位的現狀,以及進一步人群分析的業務需求,提出了選擇Apache Doris作為基礎設施層實時數據倉庫、業務工具層實時數據集成、實時數據調度、實時數據質量中心等系統、應用層實時數據應用和用戶畫像應用的技術選擇方案。該方案解決了業務痛點,滿足了業務需求。
當前業務拆分的難點主要在實時數據和用戶畫像兩個部分,包括以下三個方向:
01 實時業務數據
通過提供實時業務指標,解決業務熱點和潛在管控問題,助力生產和消費,增加優質創作和內容消費的量。提供復雜計算的實時顯性指標,提升用戶體驗,解決業務端后臺腳本計算的高維護成本和復雜性,節約成本,提高人力效率。02 實時算法特征
在實時數據的基礎上,提供各種實時算法特性,與算法團隊一起完善DAU、留存、用戶付費等核心指標。03 用戶畫像
用戶篩選,多維度、多類型定向篩選,并接入營銷、廣告、運營平臺等系統,提高業務效率,降低人員成本。用戶分析,實現多角度用戶分析,定向用戶分析報告0成本,幫助業務部門快速把握核心客戶市場。
基于以上三個方向的目標,逐一介紹知乎平臺數據賦能團隊在這四個問題上的技術實踐經驗和心得:
如何通過實時數據驅動業務發展?如何從0-1構建實時數據中心?如何構建一個高效快速的用戶畫像系統來解決歷史系統的各種問題?如何快速高效的開發業務功能,保證業務質量?1.1 名詞解釋
名詞/縮寫
形容
瑞士聯合銀行
用戶行為系統.基于知乎的實時用戶行為系統。包含實時用戶行為流和相關的快速搜索存儲。
鄰苯二甲酸二甲酯
數據管理平臺.知乎的用戶畫像系統。包括人群篩選、人群分析等功能。
1.2 實時數據與用戶畫像與各業務的結合
二、面臨的挑戰和痛點
根據目前的業務目標,主要有以下具體要求。
01 有價值
(1)如何通過實際效果發現商業價值?
設置熱點、潛力等時效性指標和相關排名,直接支持業務發展。
(2)如何將用戶畫像的篩選分析能力發揮到極致?
需要全面覆蓋多維度用戶篩選的各種需求。多角度多途徑覆蓋用戶分析。02 數據實效性
(1)建議瀏覽頁面頂部的6項。第二次刷的時候怎么能立刻感知到最新的用戶行為?
通過構建UBS(如下所述)提高有效性
(2)在推薦算法中,非常實時的特征推薦算法的效果遠遠好于日級特征更新算法。如何保證算法在10分鐘內進行特征改變?
通過實時數據系統和阿帕奇多麗絲
配合共同建設,提升到 10 分鐘內更新(下面介紹)03 接口實時性
(1)熱點運營場景,期望用戶畫像服務能在秒級別快速篩選出大量人群,用戶后續的推送等運營場景,如何解決?
通過用戶畫像系統與 Apache Doris 配合共同建設,提升人群篩選的速度(下面介紹)
04 復雜性
(1)實時數據幾乎沒有 count、sum 需求。幾乎都是復雜去重和多數據聯合計算的情況。
以播放量為例。在啟播、暫停、完播、心跳等多個條件下,會同時有多個點,要進行去重。同時基于視頻回答、視頻的關系和雙作者聯合創作的關系,需要疊加,同時保證在父子內容異常狀態的情況下過濾其中部分播放行為。(2)人群分析業務,期望多角度、各維度進行人群關聯計算,同時基于全部用戶特征針對當前人群和對比人群進行 TGI 計算,篩選出顯著特征,如何解決?
通過用戶畫像系統與 Apache Doris 配合共同建設,解決復雜的人群分析(下面介紹)(3)業務數據中有增 / 刪 / 改邏輯,如何實時同步?
實時數據集成系統與 Apache Doris 配合共同建設,解決增 / 刪 / 改邏輯(下面介紹)(4)明細數據異常發現滯后,異常發現后,需要針對性修正構建方式,及回溯數據修復,如何解決?
通過選擇 Lambda 架構作為數據架構解決(下面介紹)
三、實踐及經驗分享
3.1 整體業務架構
基于當前的業務,從頂層至底層進行了拆分。主要分為應用層、業務模型層、業務工具層、基礎設施層。基于我們當前的業務形態,自上而下
應用層:負責當前我們的業務應用,直接為業務提供工具或提供業務的某些模塊,與業務共擔目標,為業務賦能。業務模型層:支持應用層建設和一定的實時分析能力,同時也作為業務某一個流程的功能模塊接入使用,為外部業務和自身應用層建設,與業務共擔目標,為業務賦能。業務工具層:支持應用層和業務模型層的開發,提供通用的工具,面向降低應用層和業務模型層的建設成本,提升整體建設的工程效能,保證業務穩定和數據質量準確。基礎設施:技術中臺提供的基礎設施和云服務,提供穩定可用的基礎功能,保證上層建筑的穩定性。
3.2 實時數據的數據架構選型
解決當前問題的數據架構,一般有 Lambda 架構和 Kappa 架構。針對當前業務特點,計算復雜、偶發的異常問題需要大數據量回溯等特性。當前實時數據的數據架構采用的是 Lambda 架構。大數據架構系列 -- Lambda架構初體驗。由 Doris 承載分鐘級的批處理,Flink 來承載秒級別簡單邏輯的流處理。具體如下:
3.3 應用層建設經驗分享
3.3.1 實時數據系統
01 業務場景
實時數據系統主要有兩個大方向:實時業務數據和實時算法特征。
(1)實時業務數據。
通過提供實時的業務指標,解決業務對熱點、潛力的把控,助力生產、消費,提 升優質創作量及內容消費能力。提供實時的復雜計算的外顯指標,加強用戶體驗,解決業務側通過后端腳本計算的高維護成本和復雜性,節約成本,提升人效。(2)實時算法特征。
以實時數據為基礎,提供多樣的實時算法特征,與推薦算法團隊共同提升 DAU、留存、用戶付費等核心指標。
02 面臨的困難
(1) 依賴數據源多,計算規則復雜。以我們的播放量計算為例:
行為有多條,需要針對行為進行去重。過濾和加和規則很多,需要依賴多個數據源的不同數據結果進行計算。
(2) 時間敏感性高
以算法特征為例,用戶瀏覽某內容后,針對后續關聯的一系列計算后,需要在一定時間內產出計算結果(10min 未產出后續推薦效果會有波動,26min 該特征的效果會降為 0)(3) 調度過程中協調成本高
需要調度系統中,同時能識別 kafka 流消費的進度和任務完成情況。需要嚴格拉齊多個依賴的消費進度,當達到統一進度后,集中進行后續任務計算。數據倉庫:調度系統
03 解決方案
(1) 搭建實時數據基座,建設相應的數據模型,降低建設成本。
(2)針對依賴數據眾多、計算規則復雜、質量難以保證等問題。通過建設工具降低解決問題的成本。
通過建設實時數據集成和實時數據調度的能力,保障數據接入和數據模型建設的速度,降低接入時間,提升業務接入效率(具體見下方)通過建設實時數據質量中心,保障數據質量,降低發現數據質量問題的時間,提升發現效率,保證業務交付結果(具體見下方)
(3)時間敏感性高,加強監控、與 Doris 集群共同提升吞吐效率和計算效率:
搭建寫入延遲、計算延遲等監控,快速發現問題。Doris 集群進行參數變更,調整批量寫入的數據量、時間和頻率等進行優化。當前我們的 Load 主要有 Broker Load 和 Routine Load。其中時效性要求高的是 Routine Load。我們針對性的進行了參數調整。Doris 增加了 Runtime Filter,通過 BloomFilter 提升 Join 性能。Doris 集群在 0.14 版本中加入了 Runtime Filter 的過濾,針對 Join 大量 key 被過濾的情況有明顯提升;該變更針對我們當前的幾個業務調度性能,有明顯提升。時間從 40+s 提升至 10s 左右;
3.3.2 用戶畫像系統 DMP
01 業務場景
用戶畫像系統主要有兩大功能:用戶檢索和用戶分析。
(1)用戶檢索。
重點在于快速完成人群包圈選同時在圈選條件變更過程中,需要快速計算出預計能圈的用戶有哪些?
(2)用戶分析。
重點在于多人群包的各個維度對比分析,通過分析結論找到最明顯的用戶特征(通過 TGI 值判斷)
02 面臨的困難
(1)數據規模大。
我們當前是 200+ 個標簽,每個標簽均有不同的枚舉值,總計有 300+ 萬的 tag。tag 對用戶的打標量級在 900+ 億條記錄。由于標簽每日更新導入量級十分大。
(2)篩選響應時間要求高。
針對簡單的篩選,要求在秒級別出結果,針對復雜的人群篩選,篩選后人群量大的情況,要求在 20s 內完成人群包生成。
(3)人群包除了 long 類型的用戶 id 外,還需要有多種不同的設備 id 和設備 id md5 作為篩選結果。
(4)用戶分析場景下,針對 300+ 萬 tag 的多人群交叉 TGI 計算,需要在 10min 內完成。
03 解決方案
(1)DMP 業務架構
(2)DMP 業務流程:
(3)性能問題針對性解決;數據規模大,提升導入性能,分而治之。
數據模型變更,拆分文件。Doris 的存儲是按照 Tablet 分散在集群上的。通過調整數據模型,確保分布均勻及每個文件盡可能的小。導入變更,拆分導入。由于每個 Broker Load 導入都是有性能瓶頸的,將 900+ 億行數據,拆分為 1000+ 個 Broker Load 的導入任務,確保每個導入總量都足夠小。
(4)提升人群篩選和人群分析的計算速度,分而治之。
業務邏輯變更,拆分用戶。將用戶每 0 ~ 100 萬拆分為一組。針對全部用戶的交并差,等價于對所有組用戶交并差后的并集。針對全部用戶的交并差的總數,等價于對分組用戶交并差后的總數進行 sum。數據模型變更,拆分文件。設置 bitmap 的分組參數,將分組設置為 colocate group。確保每個分組的交并差計算均在自己所在 BE 完成,無需 shuffle。將 bitmap 表的分桶拆分更多,通過更多文件同時計算加速結果。計算參數變更,提升并發。由于計算過程通過分治的手段,拆分為多個小任務。通過提升并行度 parallel_fragment_exec_instance_num 再進一步優化計算速度。
04 效果
上線后,接入了知乎多個主要場景的業務,支持多業務方的人群定向和分析能力。為業務帶來曝光量、轉化率等直接指標的提升。
同時在工具性能上,有如下表現:
導入速度。當前每日 900+ 億行數據,在 3 小時內完成導入。人群預估。人群預估基本可在 1s 內完成,P95 985ms。人群圈選。人群圈選過程在 5s 內完成,整體圈人在 2min 左右。(待提升中介紹)人群分析。人群分析過程在 5min 內完成。
05 待提升
(1)功能擴展
缺乏定制的人群擴散能力。多業務場景對已有人群進行擴散有復雜且多樣的需求。缺乏用戶人群染色,無法再多個環節完成用戶效果的回收和進行后續的分析。
(2)性能提升
當前 Doris 的行列轉換功能在建設中。在用戶畫像業務中,將用戶 id 更換為設備 id,人群縮減(將具體人群包縮減為一個比較小的人群包用于后續運營動作)過程是通過業務代碼實現的,降低了性能。>> 后續結果由行列轉換后,用戶畫像結果處理流程中會將設備 id 獲取方式通過 join 維度表來實現,人群縮減通過 order by rand limit 來實現,會有比較明顯的性能提升。當前 Doris 的讀取 bitmap 功能在建設中。業務代碼無法讀取到 bitmap,只能先通過 bitmap_to_string 方法讀取到轉換為文本的 bitmap,加大了傳輸量,降低了圈選性能。>> 后續可以直接讀取 bitmap 后,業務邏輯中會替換為直接獲取 bitmap,會極大程度的減少數據傳輸量,同時業務邏輯可以針對性緩存。針對人群預估邏輯,當前是通過例如 bitmap_count(bitmap_and) 兩個函數完成的,后續 Doris 會提供 bitmap_and_count 合并為一個函數,替換后可提升計算效率。
3.4 工具層建設經驗分享
3.4.1 數據集成
01 業務場景
“巧婦難為無米之炊”,沒有數據也就沒有后面的一切,數據采集作為基礎至關重要。Doris 數據倉庫自帶的多種數據導入方式 對于數據入倉非常便利,但是在我們的使用過程中也遇到了一些問題。比如:
(1)在從離線數倉進行 broker load 的時候數據依賴丟失,上游數據錯誤無法評估受影響的范圍。
(2)需要編寫冗長的 etl 處理邏輯代碼,小的操作變更流程很長,需要全流程(至少 30 分鐘)的上線操作;此外每次部署操作還有可能遇到各種初始化 MQ 消費者的問題
(3)缺少運行狀態監控,出現異常問題無法在分鐘甚至小時級別的時間發現;
(4)在線導入僅支持 kafka json,上游的 pulsar、protobuf 數據仍需要代碼開發進行轉發,導致每次接入數據都需要轉換函數的開發以及同樣全流程的上線操作;
(5)業務邏輯中,期望業務是什么樣,Doris 中的數據就是什么樣,讓業務無感知。這種全增量同步期望被包住,而不是做很多配置或開發很多代碼來實現。
02 解決方案
在建設實時數據模型的過程中。需要依賴眾多業務的數據,同時需要針對數據逐層建設數據模型。摸索并搭建了實時數據集成系統和實時調度系統,并下沉到工具層。
(1)實時數據集成。建設快速且自定義的配置,針對不同的數據源建設導入能力。
(2)與 Doris 的 Broker Load 和 Routine Load 進行配合,在此基礎上搭建針對業務的全增量同步。
(3)封裝集成能力對內部暴露的接口,業務層無需理解中間過程,只選擇同步的數據庫和數據表即可進行實時同步。
03 效果
(1)同步配置
(2)同步任務
(3)上線前
早期使用 Doris 開發實時數據業務過程中,由于需要某個數據全/增量同步,同時進行數據轉換。需要建 Doris 數據模型,完成全量數據導入,建設增量數據 ETL 和 Routine Load 等開發,需要 1 名工程師 1 天才能將一張表接入到 Doris 中并進行全增量實時同步。中間鏈路多,缺乏報警,針對重要的鏈路,建設打點和報警成本高,需要 0.5 天左右。全量:原始數據庫 TiDB -> 中間部分(DataX)-> Doris增量:原始數據庫 TiDB -> TiCDC -> Canal Binlog Kafka -> ETL(填充數據)-> Kafka -> Routine Load -> Doris
(4)上線后
僅需要 10min 的配置,數據集成包含模型,數據導入及中間 ETL 的轉化和額外數據補充以及 Routine Load 全部建好。業務層無需感知數據中間鏈路,僅需要描述我期望那個表被同步。上線后無需業務關心,完成第一步配置后,后續的監控和報警以及一致性,集成全面解決。
3.4.2 數據調度
01 業務場景
我們在初期通過 Doris 建設實時數據的過程中,是通過 Routine Load 后的數據,再定時任務執行后續計算邏輯,后再將計算結果導出到承載存儲,如 Redis、Zetta(知乎自研 HBase 協議) 中完成外部壓力承載。在這個過程中遇到了如下問題:
(1)依賴未就緒后續任務就執行。如最近 24 小時的曝光,在 15:05 運行昨日 15:00至今日 15:00 的查詢。此時如果 Routine Load 僅導入到 14:50 的數據,這次執行結果異常;
(2)Doris 資源有限,但很多任務都是某些整點整分鐘的,一次性大量的計算任務造成集群崩潰;
(3) 任務是否執行成功,任務是否延遲,是否影響到業務,無報警無反饋;
(4) 導出存儲過程通用,重復代碼開發,每次都需要 0.5 - 1 人天的時間開發寫入和業務接口。
02 解決方案
(1)架構圖
(2)流程圖
03 效果
(1)同步任務
(2)收益
建立任務依賴機制,通過 kafka 的 offset 和前置表是否完成計算,判斷當前計算任務能否執行。后續再也沒有出現過數據還未導入就先開始進行數據計算的情況。通過退讓策略,監控當前 Doris 指標,在高負載情況下避免提交 SQL。避峰趨谷,完成資源最大利用。后續通過這種方案,一定程度的避免了瞬時跑高整體集群的問題。全鏈路監控任務執行情況,和延遲情況,一旦延遲報警,及時溝通解決和恢復業務。一旦任務延遲,監控可非常快速的發現相關問題,多數情況能在業務可接受范圍內完成恢復。上線后,原先需要 1 天的工程能力開發時間降低至 0。只需要在 Doris 中有一個可查詢的 SQL,經過簡單配置即可完成一定時間交付給業務相關數據、排行榜的需求。
3.4.3 數據質量
01 業務場景
數據,已經成為互聯網企業非常依賴的重要資產。數據質量的好壞直接關系到信息的精準度,也影響到企業的生存和競爭力。Michael Hammer(《Reengineering the Corporation》一書的作者)曾說過,看起來不起眼的數據質量問題,實際上是拆散業務流程的重要標志。數據質量管理是測度、提高和驗證質量,以及整合組織數據的方法等一套處理準則,而體量大、速度快和多樣性的特點,決定了大數據質量所需的處理,有別于傳統信息治理計劃的質量管理方式。
具體到針對知乎的各個業務:
AI平臺、增長團隊、內容平臺等已經將部分或全部業務漸漸遷移到實時計算平臺,在接入數據更實時,更迅速的接入帶來的所享受的收益外,數據質量更加變得重要。
(1)完整性:
數據完整性問題包括:模型設計不完整,例如:唯一性約束不完整、參照不完整;數據條目不完整,例如:數據記錄丟失或不可用;數據屬性不完整,例如:數據屬性空值。不完整的數據所能借鑒的價值就會大大降低,也是數據質量問題最為基礎和常見的一類問題;
(2)一致性:
多源數據的數據模型不一致,例如:命名不一致、數據結構不一致、約束規則不一致。數據實體不一致,例如:數據編碼不一致、命名及含義不一致、分類層次不一致、生命周期不一致……相同的數據有多個副本的情況下的數據不一致、數據內容沖突的問題;
(3)準確性:
準確性也叫可靠性,是用于分析和識別哪些是不準確的或無效的數據,不可靠的數據可能會導致嚴重的問題,會造成有缺陷的方法和糟糕的決策;
(4)唯一性:
用于識別和度量重復數據、冗余數據。重復數據是導致業務無法協同、流程無法追溯的重要因素,也是數據治理需要解決的最基本的數據問題;
(5)關聯性:
數據關聯性問題是指存在數據關聯的數據關系缺失或錯誤,例如:函數關系、相關系數、主外鍵關系、索引關系等。存在數據關聯性問題,會直接影響數據分析的結果,進而影響管理決策;
(6)真實性:
數據必須真實準確的反映客觀的實體存在或真實的業務,真實可靠的原始統計數據是企業統計工作的靈魂,是一切管理工作的基礎,是經營者進行正確經營決策必不可少的第一手資料;
(7)及時性:
數據的及時性是指能否在需要的時候獲到數據,數據的及時性與企業的數據處理速度及效率有直接的關系,是影響業務處理和管理效率的關鍵指標。
02 解決方案
(1)全流程的數據鏈路和各級質量保證方法
(2)業務架構
(3)業務流程
03 效果
(1)某業務健康情況監控
以通過 DQC 監控的某一個業務的健康情況,該業務由多個導出任務和中間計算任務及部分數據源組成,當前情況是一切正常。期間如果出現某節點任意異常后,都可及時發現。
(2)某任務中間邏輯監控
該任務中間計算中其中部分規則未達標,導致該任務未通過。
04 收益
(1)上線前
早期無類似 DQC 系統保證的前提下,我們很多問題都是天級別甚至上線后,才發現存在數據異常,出現過 3 次問題,造成的返工和交付不靠譜的情況,對業務影響巨大。早期開發中,在開發過程需要不斷針對各種細節規則進行比對,總會花費一定時間逐層校驗,成本巨大。
(2)上線后
在上線 1 個月內,通過 DQC 系統規則,當前已發現了 14 個錯異常,在 1 - 2h 左右發現,立即修復。對業務的影響降低到最小。在系統上線后,在開發過程中,開發完相關數據,如有異常,就產生了異常報警,大幅節省了人工發現的成本,因為修復時間早,在后續開發啟動前,就已經修復,極大程度降低開發過程中的返工成本。
四、總結與展望
4.1 收益總結
4.1.1 業務發展方面
01 針對實時業務數據
提供了基于時效性的熱點、潛力的把控。加速業務在生產、消費方面的使用,進而提升優質創作量及用戶對內容消費能力。同時提供了提供實時的復雜計算的外顯指標,加強用戶體驗,下線了業務后端通過腳本計算指標的方法,降低了業務的復雜性,節約了成本,提升人效。
02 針對實時算法特征
提供了基于創作者、內容、消費者的實時算法特征,與算法團隊共同在多個項目中,針對 DAU、留存、用戶付費等核心指標有了明顯的提升。
03 針對用戶畫像
完善和升級用戶篩選,做到多維、多類型的定向篩選,并接入了運營平臺、營銷平臺等系統,提高了業務效率,降低了業務人員進行人群定向的成本。搭建和完善用戶分析,做到多角度用戶分析,定向用戶分析報告 0 成本,助力業務部門快速把握核心客戶市場。
4.1.2 工具建設方面
完成了實時數據領域和用戶領域的布局,建設了相關的開發和維護工具,解決了先前在此方面無基礎設施,無業務工具,開發成本高的問題。搭建了集成、調度、質量系統。通過工具的方式降低了業務發展和迭代的成本,讓業務快速發展,同時也保證了交付質量提高了業務基線。
4.1.3 人員組織方面
自上而下的拆分了實時數據和用戶畫像的能力,分為應用層、業務模型層、業務工具層和基礎設施層。通過組織劃分,明確了不同層次的邊界和加速了業務目標的達成。搭建并完善了多層次團隊人員梯隊。根據針對不同方向的同學,給予不同的 OKR 目標,做到跨層次方向隔離,同層次方向一致,同模塊目標一致。共同為整體實時數據與用戶畫像服務建設而努力。
4.2 未來展望
從 2021 年 8 月成立至今,我們一直思考如何提供更好的實時數據服務?實時數據能建設什么方面的應用,為業務創造價值?如何將用戶畫像服務做好?用戶畫像服務的篩選、分析能力如何為業務創造更大價值?摸著石頭過河的同時,我們也在不斷摸索和建設相關的業務能力和基礎建設。在明年的發展中,我們還會針對以下方面進一步發展:
01 基于實時數據
強化基礎能力工具層的建設,持續降低基于實時數據方面的建設、交付成本。提升數據質量工具覆蓋能力,為業務模型提供質量保障,并提供基于實時數據的畫像質量保障能力。基于當前業務訴求,部分場景針對 5 分鐘級實時無法滿足,進一步探索秒級別復雜情況實時能力,并提供能力支持。
02 基于用戶畫像
加強并針對用戶畫像、用戶理解、用戶洞察 & 模型等進一步建設。通過與具體業務結合,建設貼合業務場景的用戶理解成果和相應的分析能力,找到業務的留存點。進一步加強新的工具能力的建設,通過建設用戶理解工具、用戶分析工具,降低產生理解及對業務分析的成本,提升業務效率,快速發現業務價值。