邱盛昌:OPPO商業化數據體系建設實戰

来源:https://www.cnblogs.com/datafuntalk/archive/2022/06/12/16368049.html
-Advertisement-
Play Games

**導讀:**本文是OPPO商業數據研發負責人&技術專家邱盛昌老師帶來的“OPPO商業化數據體系建設實踐”的分享。整體內容圍繞著下圖中垂直劃分的六個部分展開,分別為:數據平臺、數據接入、數據開發、數據治理、數據應用和數據分析,這個圖也概括了典型的數據體系的所有內容。 -- 01 數據平臺 數據平臺由 ...


file


導讀:本文是OPPO商業數據研發負責人&技術專家邱盛昌老師帶來的“OPPO商業化數據體系建設實踐”的分享。整體內容圍繞著下圖中垂直劃分的六個部分展開,分別為:數據平臺、數據接入、數據開發、數據治理、數據應用和數據分析,這個圖也概括了典型的數據體系的所有內容。

file

--

01 數據平臺

數據平臺由公司提供,商業數據研發作為平臺使用方,首要職責是基於公司級的數據平臺下構建商業化數據體系。平臺與業務兩個團隊的分界遵循如下原則:“有則用,不等待,願遷移,可貢獻”。

在實踐中,這個原則在最大程度保證了團隊工程效率的同時,也讓商業數據和數據平臺之間做到了良性互動。

我們會優先利用平臺的已有能力;如果沒有,且無法及時提供,我們堅決自己做;要是後期平臺有了相應的能力,我們也會把業務遷移到平臺;或者把我們的能力提交貢獻給平臺。

1. 開發效率類工具包

file

開發效率是數據工程團隊優先要保證的目標,為此我們把開發同學日常工作中高頻操作動作抽象成工具來提升開發效率。比如連接登陸計算引擎(Hive、Spark等)、獲取hive表的最大分區、批量操作分區等等。

把這些動作工具化後有以下好處:

  • 減少開發過程中機械操作部分,提升開發體驗和效率;
  • 減少人工出錯的情況,保證數據安全和質量;
  • 工具中統一了操作行為的元數據,方便數據審計和許可權治理等工作。
  • 上圖演示了登陸輔助工具:有統一的入口訪問引擎,同時工具提供了自動載入工號和密碼填充,工具在統一記錄審計信息的同時保證了每張表都有歸屬人信息,這在以後的元數據管理中起到巨大的作用。

2. 數據校驗類工具包

file

數據需求不管是在開發中還是任務上線後,為了保證數據的完整性、一致性、正確性,都需要對數據進行比對驗證和波動監控等數據校驗工作。上圖例子展示了“兩表核對數據”工具在數據波動等問題後自動告警的信息。此類工具設計的重點是將異常定位標識展示完整,將責任人和影響的業務模塊展示清晰,方便相關負責同學評估異常影響和及時排查問題,否則問題就會隱藏在數據中,引起用戶投訴。

3. 可視化輔助工具包

file

郵件和公司的即時通訊工具TT,是數據觸達用戶的兩個重要通道,用戶隨時隨地可以通過這兩種方式瞭解關註的業務數據。我們開發了可視化輔助工具包來加強數據觸達用戶的效率和可視化能力。TT也擁有類似微信的公眾號、訂閱號、機器人的功能。

首先我們申請了一批公眾號,有針對質量管理的、收入監控的、商業智能和決策支持的,不同角色的用戶關註不同的公眾號就可以收到數據的消息推送。用戶選擇關註不同的訂閱號,可以隨時隨地掌握自己感興趣的主題,比如老闆上班前或假期中就可以看到最新核心指標推送消息。

另外我們將一批機器人賬號放在各類型的TT群中自動發佈公告或者專門告知某個負責人處理相關數據問題,比如負責營銷平臺數據的機器人在每天掃完數據後就會群里發送結果,讓負責的同學去處理。

輔助工具在上述過程中將部分工作流程自動化,比如簡單通過幾個參數配置就可以完成一個郵件數據的可視化圖表配置等。

4. UDF開發原則

file

公司的數據平臺提供了一些通用的UDF工具包,但是個性化需求的工具包我們會自己研發。我們部門在開發UDF過程中總結出了幾條原則如上圖。對於第一條,使用臨時函數的好處是發佈簡單、影響範圍小,所以能夠快速上線。另外,開發數據的UDF要避開“後端思維”,比如碰到數據異常,要返回NULL而不是把異常拋出去阻斷了程式運行,保障數據質量放在數據校驗步驟來做,而不是UDF來做,如果因為幾條臟數據阻斷了程式運行,會極大影響到任務的SLA,非常不值得。

--

02 數據接入

數據接入的最終形態是全面配置化、中間件化,最好做到流批一體。數據接入可以根據需求在流式和批處理之間自由配置。

1. 出入庫強制校驗數據量

數據鏈路要在源頭入庫時做基本的數據校驗。例如數據量強制校驗,如果導入後不做校驗直接跑數,常會導致後續處理問題頻發。如果一個表導入後為空,會導致後邊的任務在執行時候全部被掛起,或者數據量不正確,後邊任務產出的數據全部是錯的,影響範圍巨大,恢復起來也慢。

2. 欄位儘量全部接入

如果只接入單個需求所需欄位,那麼後續需求要用到此表其他欄位的時候就需要重新再做一次來加欄位,這樣效率會低很多,且容易出錯。

3. 歷史要保留

每天抽取導入的數據可能不一樣,所以歷史分區在緩衝層要保留一段時間,而更長時間的歷史保留應當放在ODS層。抽數一定要做分區表,最好每天一個分區。

4. 數據接入情況介紹

file

上圖是按照導入導出的SRC和DST分為四類的數據出入倉方式。

--

03 數據開發

數據開發涉及到的內容比較多,本節會圍繞數倉架構展開來講:

  • 構建基於維度建模理論的離線數據倉庫系統
  • 構建服務於收入監控/實驗/策略/廣告引擎的實時系統

1. 數倉架構

file

數據源層接入兩大塊數據:廣告行為埋點數據、三品牌OS行為和APP行為埋點數據。三品牌的OS行為,這是廠商特有的數據,比如用戶在手機上安裝了哪些應用,啟動卸載應用等信息;還有一些app行為信息,比如瀏覽器、軟體商店等都會接入。

圖中倉庫層的左邊數據建模的過程,可以分為不同主題。不同業務對主題的劃分也不一樣,但是總體都會分成圖中的4層:接入層、基礎層、模型層和應用層。

倉庫層還會做一些數據治理的動作,包括數據質量、元數據管理、資產管理,都屬於數倉的範疇。針對這些我們做了大量的工作用於資源管控、成本優化和質量規範監控。

還有一些偏底層的數據服務也屬於數倉的範疇,包括定向標簽、排序召回、廣告策略需要的特征數據,數倉負責算好提供給應用方。結算系統因為數據量太大,也只能在數倉進行結算。

模型層和應用層還會以介面的形式提供數據服務,對於廣告特別重要的OCPX也在這裡。

2. 指標體系

file

主題域的劃分、指標體系建設因不同的業務而採用不同的方法。例如,廣告會按照效果廣告和品牌廣告去劃分,同時結合廣告行業的特點做應用分發、搜索、信息流等的主題建設。圖中展示了廣告的轉化指標建設,整個流程有很多業務過程,會產生大量的數據。數據倉庫模型層一開始只會開發基礎指標,而對於業務KPI相關的業務我們會按照OSM模型來建設指標體系,比如找到業務的北極星指標。

3. 維度建模

維度建模的實踐,我們將它歸納為三個核心觀點,如下圖所示:

file

比如 “品牌合約模型”的廣告主維度,如果換一個模型也有廣告主維度的話,兩個模型需要使用相同的維度來保證一致性,而且需要取廣告的信息只能從這個表出,而不是再去關聯其他更多的表,這就是一致性維度的簡單理解。一致性事實會保證不同模型之間事實數據可以交叉探查,而且需要保證指標的口徑統一。從圖中的模型也可以看出我們主要採用的是維度建模中的星形模型,這也是最常用的模型。

4. ETL鏈路優化

ETL鏈路開發優化中散佈著很多痛點。針對鏈路優化,為了讓數據高效高質量地跑出來,我們總結了一些經驗,如下圖:

file

圖中右邊是數據鏈路建設的三種方案。

第一種可以看到不同的報表有各自獨立的基礎模型表。優點是效率高,缺點是實現非常複雜,且不易維護。
第二種是將報表的模型層統一,優點是結構簡單,缺點是不同的模型數據會互相影響,造成跑數時不必要的相互等待。
第三種方案結合前兩種的優點,把模型層中有外部依賴和沒有外部依賴的做解耦單獨建模,另外將比較大的慢表也和其他模型分開做解耦,這樣方案最大程度上保證了較低的複雜度和較好的出數效率。

5. 商業化數據倉庫的評估

file

按上圖所示,我們通過穩定性、高效性、準確性、維護性和創新性這幾個維度來評估數倉建設的成熟度。

--

04 數據治理

1. 元數據分類

file

業務元數據主要是業務數據知識,我們把這些業務元數據組織成圖中的四類,來滿足各種角色對於這些知識的使用需求。

技術元數據非常有用,這是做數據治理的前提,比如用於構建應用、影響分析、問題排查等。

2. 各類元數據的用途

下麵三張圖介紹了三類元數據在OPPO的主要用途和部分應用的實例:

file

Hive和DB的元數據可以用於規範檢查,從表的誕生開始就應該進入了元數據質量監控的範圍, 這是實現治理常態化的重要手段。

file

調度管理在數倉中是非常重要的一環,調度的質量管控需要通過調度元數據來實現。調度中通常會有複雜的依賴和異常處理,是問題的多發區。提前發現調度問題是保障數據產出的實效性和質量的重要手段。

file

例子中的研發年報如果要人工統計,對於大的數倉幾乎是不可能完成的任務,因為表的數量龐大。我們利用元數據提升了代碼交付質量、支持技術運營統計。

3. 數據質量管理實施方案

數倉必須自己保證數據質量,不能只靠平臺提供的能力,因為平臺往往不會考慮和業務強相關的內容,可以適當利用平臺的工具來輔助完成數據質量的管理。下圖是我們的質量監控體系。

file

其中波動監控是一個難點,我們總結了一套方法論,後文會展開來講。下邊的例子展示了質量管理方案實施原則和應用案例,包含了未發佈監控、依賴缺失監控等。

file

4. SLA準點率提升監控

準點率是數倉交付質量非常核心的一個要求,也是數據開發經常要處理的問題。在實踐中我們形成了一套方法論,這套方法論主要是對報表分級然後採取不同的保證策略。

file

例子中的核心報表會在凌晨1點就啟動監控,每個整點會發送任務執行進度情況,對於沒有及時完成的任務,24小時值班運維會打電話叫醒負責人,負責人收到報警後及時處理以保證準點率;如果沒有核心報表運行,並且完成時間在合理時間內,負責人則不會被叫醒。

file

對於需要保證的報表,如何精確地報警很重要。這要求我們需要較為準確地評估預計完成時間。上圖展示如何精確預估完成時間。如果我們預估的完成時間趕不上業務要求的交付時間,24小時值班運維就會通知負責人介入來保證按時交付,哪怕在凌晨。

file

上圖是非保證的報表的例子。雖然不需要保證在精確的時間點前交付,我們也需要知道執行情況,並且把執行情況通知到負責人,這樣負責人可以隨時隨地掌握這些重要的信息,負責人看到後根據實際情況靈活處理即可。

--

05 數據應用

數據波動監控和廣告歸因是業務中的兩個難點和業務價值高地。

1. 解決波動監控的三大痛點

最大痛點:告警太多,泛濫後容易麻木,相當於沒有告警
第二痛點:準確率不高,誤報、漏報很常見
第三痛點:閾值設置困難,一個閾值不能適用於所有場景,全部個性化閾值又太多
我們結合商業化數據的特點,形成了一套波動監控體系和方法論。

file

廣告位的波動監控能夠發現一些廣告播放系統的bug,這塊我們做的也比較多。

按應用監控方面,因為每個廣告主的投放計劃不一樣,所以波動經常是合理的,比如客戶不想投了、賬戶沒錢了等,會造成數據波動,這種波動監控意義不大,發現也無法採取措施。

但是提前發現有動作的節點是有價值,為此我們抽象出三個可以監控的東西:撞線、啟投、改價,這些報警可以指導業務動作,比如餘額快沒了,銷售就會提前聯繫廣告主充值。競價被打敗沒有拿到流量,及時報警出來通知廣告主改價。

file

上面提到我們對廣告位波動做了很多事情,形成了一套有效的識別波動的方法。通過環比上個周期、同比昨天、同比上周,這三個條件組合判斷後,會非常準確地識別有效波動。另外,閾值設定要按照金額分級,例如圖中的例子,小廣告主波動閾值會大;100W以上的大廣告主的閾值會小一些。通過這套方法論和金額分級經驗,很好地解決了波動監控的三大痛點。

下圖是關於撞線、啟投、改價的例子:

file

這類告警確定性很強,很容易就可以判斷,往往不需要反覆調閾值。

2. 廣告歸因服務

file

廣告歸因是廣告業務特有的內容,對OPPO非常重要。上圖是歸因服務的整體架構。

圖中右邊是轉化數據,左邊是廣告數據,中間是歸因中台。轉化加廣告數據作為我們歸因中台的輸入數據,歸因中台的作用就是怎麼把轉化歸因到廣告的數據中,比如這一次付費是哪一次廣告點擊帶來的,有可能歸因出來是上個月1號的那次點擊下載APP帶來的。歸因中台從下到上分為三層:數據層、策略層、服務層。

數據層是準確歸因的底層基礎,ID-Mapping負責把互聯網中的用戶映射成一個實體用戶,口徑標準化提升統一口徑提升數據質量,反作弊模塊會從流量中刨除作弊流量。

策略層是歸因的邏輯層。歸因策略圍繞著廣告點位、歸因周期和歸因規則來組織,以求做到歸因結果儘量準確。策略主要來自行業經驗,比如不同的點位和流量的歸因周期應該是多少等等都會在這一層管理。

服務層對外提供標準化口徑的實時和離線歸因服務,支撐了對各方的歸因和運營服務。

file

--

06 數據分析

1. 數據提取

通過培訓來賦能業務,讓更多的人有能力自助完成數據提取和簡單的分析工作。這樣也能節省數倉開發團隊的工作負載,讓開發團隊能聚焦在建設高質量的數據模型上。

file

2. 微型分析報告

file

例子中的日報,內容不多但是非常豐富,收入情況和效率指標都算好了,同時分析了波動情況,業務負責人隨時隨地可以看到這個報告,並且馬上可以判斷業務健康情況採取決策行動。

file

--

07 精彩問答

Q:cdm建模規範中派生指標和泛化指標構建數據集的時候有沒有約束性的規範?

A:有命名的約束,另外我們通過id唯一確定一個指標。命名也要唯一,防止它有多個人來構建同一個指標。唯一性之外我們還會約束如何命名:我們有系統告訴你應該怎麼命名,有一些經驗在這裡面,它會提供一些詞根,或者是歷史的統計信息,也就是大多數人如何命名某個指標。

Q:我們的流批一體用的是一套還是兩套引擎?

A:我們當前只在接入層實現了流批一體,是公司的數據平臺提供的這個能力,也就是mysql到hive,這裡可以做到流批一體,只有一套程式,再往後的流批一體我們還在探索,沒有實現。

Q:我們平臺有沒有代碼掃描類似的功能?

A:其實這個取決於你自己的規則。我們的代碼可以存在hive中的一個欄位值中,所以我們可以根據規則去做正則,比如掃一下這裡邊的中文是不是太少了,說明註釋可能太少會導致業務含義缺失等,也可以檢查有沒有做空值處理,根據自己的規則來做處理就好。


今天的分享就到這裡,謝謝大家。
本文首發於微信公眾號“DataFunTalk”。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個工作了3年的粉絲私信我,在面試的時候遇到了這樣一個問題。 ”請說一下ReentrantLock的實現原理“,他當時根據自己的理解零零散散的說了一些。 但是似乎沒有說到關鍵點上,讓我出一期說一下回答思路。 好吧,關於這個問題,我們來看看普通人和高手的回答。 普通人: ReentrantLock的一 ...
  • 一、OpenFeign介紹 OpenFeign是⼀種聲明式,模版化的HTTP客戶端。使⽤OpenFeign進⾏遠程調⽤時,開發者完全感知不到這是在進⾏遠程調⽤,⽽是像在調⽤本地⽅法⼀樣。使⽤⽅式是註解+接⼝形式,把需要調⽤的遠程接⼝封裝到接⼝當中,映射地址為遠程接⼝的地址。在啟動SpringClou ...
  • 一、創建新的database clickhouse創建資料庫的語法幾乎和其他的關係型資料庫是一樣的,區別就是clickhouse存在集群cluster和庫引擎engine的概念,可以根據需要進行指定。如果沒有特殊需求,預設即可。 CREATE DATABASE [IF NOT EXISTS] db_ ...
  • 異常和正常代碼性能旗鼓相當,但是全局過濾器對性能影響比較大,大概降低了60%左右,全局過濾器走了管道,但是這跟微軟官方的性能優化又有衝突,想必微軟官方也是出於對全局過濾器異常處理的考慮吧。同時對於添加了業務的情況下,這個降低會被稀釋,沒去做壓測對比哈,正常用戶體量還不至於被這個給影響到穩定性。所以怎... ...
  • 以下說明當匯流排上存在多個 DS18B20 晶元時, 識別各個 DS18B20 的編號併進行通信的演算法. 其實這是 1-Wire 匯流排的搜索演算法, 當 1-Wire 匯流排上掛接了多個設備時, 匯流排控制端需要通過 ROM Search 命令來判斷匯流排上存在的設備以及獲取他們的8位元組唯一ROM. 1-WI... ...
  • DS18B20 是一個常見的數字溫度計晶元, 因為測溫準確, 廉價且接線簡單, 實際應用廣泛, 在各種教學實驗套裝中出鏡率也很高. 在寫STC8H GPIO示例的時候寫了一下 DS18B20, 這個型號雖然簡單古老, 但是內容比較有意思, 一個篇幅寫不下, 所以把內容抽出來單獨介紹. ...
  • 通過在互聯網上收集及微軟官方網站等途徑獲取相關資料進行整理彙總出Microsoft SQL Server各個版本(SQL Server 2008 R2、SQL Server 2012、SQL Server 2014、SQL Server 2016、SQL Server 2017、SQL Server ...
  • Redis常見使用場景,緩存、數據共用分散式、分散式鎖、全局 ID、計數器、限流、位統計、購物車、時間線 Timeline、消息隊列、抽獎、點贊、簽到、打卡、商品標簽、商品篩選、用戶關註、推薦模型、排行榜. ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...