用戶畫像的數據存儲的技術選型有多種,不同存儲方式適用于不同場景。主要有Hive、MySQL、HBase、Elasticsearch。
如果將用戶標簽開發成一個大寬表,那么這個寬表每天ETL作業將會耗費大量時間,所以一般數據會這樣執行:1、分區存儲,分別執行作業;2、標簽腳本性能調優;3、基于一些標簽的共同數據來源,開發中間表。
一般地,我們只保留最近一段時間的日全量數據,我們可以規定比如刪除30天以前的數據,這樣來節省存儲的空間。應用到畫像產品中,就是當我們輸入用戶id后通過直接查詢上表,即可解析標簽ID及對應的標簽權重,可在畫像產品前端展示該用戶的相關信息,如下圖:
一、Hive數據倉庫
Hive是基于Hadoop的一個數據倉庫工具,依賴于HDFS存儲數據,可以將結構化的數據文件映射為一張數據庫表,提供SQL語言查詢存儲在HDFS中的數據。一般使用Hive作為數據倉庫用來存儲標簽、用戶特征庫等相關數據。適合大數據量的批量作業,主要用來做離線數據分析,比直接用MapReduce開發效率更高。
1.數據倉庫
在數倉建模過程中,主要是設計事實表和維度表的建模開發。在畫像系統中主要使用Hive作為數據倉庫,開發相應的事實表和維度表來存儲標簽、人群、應用到服務層的相關數據。
a.事實表
事務事實表:用于描述業務過程,按業務過程的單一或多業務過程可進一步分為單事務事實表和多事務事實表。
周期快照事實表:在一個確定的時間段內對業務狀態進行度量。例如:查看一個用戶近1年的付款金額、近1年購物次數、近30天登錄天數等。
累計快照事實表:對不同的事件之間的時間間隔進行度量。例如:用戶從購買到支付的時長、從下單到訂單完結的時長。一般用于統計時間周期明顯的業務過程。
b.維度表
維度表是對事實屬性的各個維度的描述。例如,商標維度包括:價格、折扣、品牌、原廠家、型號等方面的信息。維度表的開發中,經常遇到維度緩慢變化的情況,對于緩慢變化維,一般采用:
① 重寫維度值,對歷史數據進行覆蓋;
② 保留多條數據,通過插入維度列字段區分;
③ 開發日期分區表,每日分區數據積累當日維度的屬性;
④ 開發拉鏈表,按時間變化進行全量存儲等方式處理。
2、ID-MAP
用來做人群映射的。開發用戶標簽的時候,需要把用戶不同來源的身份通過數據手段識別為同一主體,即ID-Mapping。用戶的屬性、行為相關數據分散在不同來源中,通過ID-Mapping能夠把不同場景下的數據聯系到一起,消除數據孤島。即通過ID-Mapping打通userid和cookieid的對應關系。
在設計ID-Mapping表時,由于一個用戶可在多個設備登錄,一個設備也可以被多個用戶登錄,所以考慮用緩慢變化維表來記錄不同時間點的狀態變化,如下,記錄一個事物從開始到當前狀態的全部狀態變化信息。
① 從埋點表和訪問日志表獲取到cookieid和userid同時出現的訪問記錄;
② 將獲取到的userid和cookieid插入cookieid-userid關系表;
③ 創建ID-Map拉鏈表,將每天新增到cookie表的數據與拉鏈表歷史數據做筆記,若有變化或新增,則更新拉鏈表;
④ 創建完成后,每天ETL調度將數據更新到ID-Mapping拉鏈表中。
⑤ 對于拉鏈表,可查看某日的快照數據,以查看某個用戶在某天關聯到的設備id。
對于實際開發中,還需要考慮用戶在不同平臺間(如Web端和App端)的打通情況。
二、MySQL
MySQL是關系型數據庫,在用戶畫像系統中可用于元數據管理、監控預警數據、結果集存儲等應用中。對于量級較小(例如小于百萬)的數據,MySQL具有更快的讀寫速度,web端產品讀寫MySQL數據庫能夠更快的反應。例如元數據、監控預警數據、結果集等可存儲在MySQL中。
1、元數據管理
平臺標簽視圖中的標簽元數據可存儲在MySQL關系數據庫中,便于便簽編輯、查詢、管理。
2、監控預警數據
MySQL還可以用于存儲每日對ETL結果的監控信息。從標簽計算數據的監控,到服務層同步數據的監控。
① 標簽計算數據監控
監控每天標簽ETL的數據量,若有異常則發送警告通知,同時暫停后續任務。
② 服務層同步數據監控
即將標簽相關數據從Hive數倉像服務層同步數據的監控。服務層一般采用HBase、Elasticsearchzuo作為數據庫存儲標簽數據供線上調用。當相關數據在Hive中的數量不等于同步到服務層后的數量,則會觸發警告。
3、結果集存儲
在打通畫像業務與業務系統時,考慮將hive中的用戶標簽同步到各個業務系統中,此時MySQL可以用來存儲結果集。
Sqoop是一個用來將Hadoop和關系型數據庫中的數據相關遷移的工具,它可以將關系型數據庫中的數據導入Hadoop的HDFS中,也可將HDFS中的數據導入關系型數據庫中。
三、HBase
HBase是存儲線上接口實時調用的數據,是高性能、列存儲、可伸縮、實時讀寫的分布式存儲系統,運行在HDFS上。Hive是跑MapReduce任務離線查詢,適合用來對一段時間內的數據進行分析查詢,例如,用來計算趨勢或者網站的日志。HBase 則適合用來進行大數據的實時查詢,例如 Facebook 用 HBase 進行消息和實時的分析。
畫像系統中每天在Hive里跑出的結果集數據可同步到HBase數據庫,用于線上實時應用的場景。
1、應用場景
彈窗廣告:某渠道運營人員為促進未注冊的新安裝用戶注冊、下單,計劃通過App首頁彈窗發放紅包或優惠券的方式進行引導注冊。
① 通過組合用戶標簽(如“”“未注冊用戶”“”“按照據今天數”小于7天)篩選出對應用戶群,然后將對于人群推送到“廣告系統”,這樣每天畫像系統的ETL調度完成后對應的人群數據會推送到HBase數據庫進行存儲。
② 當滿足條件的新用戶來訪App時,由在線接口讀取HBase數據庫,查詢到該用戶時就會為其推送該彈窗。
四、Elasticsearch
Elasticsearch存儲標簽用于人群計算和人群多維透視分析,是一個開源的分布式全文檢索引擎,開源近乎實時地存儲、檢索數據。而且擴展性很好,可以擴展到上百臺服務器,處理PB級別的數據。對于用戶標簽查詢、用戶分群計算、用戶群多維透視分析這類時間響應要求極高的場景適用。
Elasticsearch是面向文檔型數據庫,一條數據在這里就是一個文檔,用json作為文檔格式。
1、應用場景
① 在每天的ETL調度中,將Hive計算的標簽數據導入Elasticsearch中。
② 在標簽調度完成且通過校驗后(標簽監控預警完成),將標簽數據同步到Elasticsearch中。
③ 在與elasticsearch數據同步完成并通過校驗后,向在MySQL維護的狀態表中插入一條狀態記錄,表示當日數據可用,線上計算用戶人群的接口則讀取最近的數據。
④ 如果當天因為調度延遲或其他原因沒有及時將當日數據導入Elasticsearch,接口也能讀取最近一天對于的數據。如當日數據產出正常時,state字段=0,異常=1,。圖1月20日異常時,線上接口掃描該狀態記錄后不讀取1月20日的數據,而是讀取前一天的數據。
③ 為避免從Hive到Elasticsearch中灌入數據時發生數據缺失,在像MySQL狀態表更新狀態位前需要校驗elasticsearch與Hive中的數據是否一致。
④ Hive中的用戶標簽灌入Elasticsearch中后,業務人員在畫像產品端計算人群或分析人群時,通過RESTful API訪問Elasticsearch進行計算。
總結:
· ES存儲標簽用于人群計算和人群多維透視分析,滿足用戶畫像產品的查詢、分析、使用,查詢時間秒級;
· HBase存儲線上接口實時調用的數據,滿足線上服務的實時調用,查詢時間亞秒級;
· MySQL存儲元數據,監控數據及結果集數據,查詢時間秒級;
· Hive存儲數據相關標簽表,人群計算表的表結構設計,跑大數據作業。
參考資料:
《用戶畫像:方法論與工程化解決方案》趙宏田?著