Flink 實踐 | Flink 在愛奇藝廣告業(yè)務(wù)的實踐
摘要:本文整理自愛奇藝技術(shù)經(jīng)理韓紅根在 5 月 22 日北京站 Flink Meetup 分享的議題《Flink 在愛奇藝廣告業(yè)務(wù)的實踐》,內(nèi)容包括:
業(yè)務(wù)場景 業(yè)務(wù)實踐 Flink 使用過程中的問題及解決 未來規(guī)劃
GitHub 地址 
一、業(yè)務(wù)場景

數(shù)據(jù)大屏:包括曝光、點擊、收入等核心指標(biāo)的展示,以及故障率等監(jiān)控指標(biāo); 異常監(jiān)測:因為廣告投放的鏈路比較?,所以如果鏈路上發(fā)生任何波動的話,都會對整體的投放效果產(chǎn)生影響。除此之外,各個團隊在上線過程中是否會對整體投放產(chǎn)生影響,都是通過異常監(jiān)測系統(tǒng)能夠觀測到的。我們還能夠觀測業(yè)務(wù)指標(biāo)走勢是否合理,比如在庫存正常的情況下,曝光是否有不同的波動情況,這可以用來實 時發(fā)現(xiàn)問題; 數(shù)據(jù)分析:主要用于數(shù)據(jù)賦能業(yè)務(wù)發(fā)展。我們可以實時分析廣告投放過程中的一些異常問題,或者基于當(dāng)前的投放效果去研究怎樣優(yōu)化,從而達(dá)到更好的效果; 特征工程:廣告算法團隊主要是做一些模型訓(xùn)練,用于支持線上投放。技術(shù)特征最初大部分是離線,隨著實時的發(fā)展,開始把一些工程轉(zhuǎn)到實時。
二、業(yè)務(wù)實踐
1. 實時數(shù)倉
■ 1.1 實時數(shù)倉 - 目標(biāo)

數(shù)據(jù)完整性:在廣告業(yè)務(wù)里,實時數(shù)據(jù)主要是用于指導(dǎo)決策,比如廣告主需要根據(jù)當(dāng)前投放的實時數(shù)據(jù),指導(dǎo)后面的出價或調(diào)整預(yù)算。另外,故障率的監(jiān)控需要數(shù)據(jù)本身是穩(wěn)定的。如果數(shù)據(jù)是波動的,指導(dǎo)意義就非常差,甚至沒有什么指導(dǎo)意義。因此完整性本身是對時效性和完整性之間做了一個權(quán)衡; 服務(wù)穩(wěn)定性:生產(chǎn)鏈包括數(shù)據(jù)接入、計算(多層)、數(shù)據(jù)寫入、進度服務(wù)和查詢服務(wù)。除此之外還有數(shù)據(jù)質(zhì)量,包括數(shù)據(jù)的準(zhǔn)確性以及數(shù)據(jù)趨勢是否符合預(yù)期; 查詢能力:在廣告業(yè)務(wù)有多種使用場景,在不同場景里可能使用了不同的 OLAP 引擎,所以查詢方式和性能的要求不一致。另外,在做數(shù)據(jù)分析的時候,除了最新最穩(wěn)定的實時數(shù)據(jù)之外,同時也會實時 + 離線做分析查詢,此外還包括數(shù)據(jù)跨源和查詢性能等要求。
■ 1.2 實時數(shù)倉 - 挑戰(zhàn)

數(shù)據(jù)進度服務(wù):需要在時效性和完整性之間做一個權(quán)衡; 數(shù)據(jù)穩(wěn)定性:由于生產(chǎn)鏈路比較長,中間可能會用到多種功能組件,所以端到端的服務(wù)穩(wěn)定性對整體數(shù)據(jù)準(zhǔn)確性的影響是比較關(guān)鍵的; 查詢性能:主要包括 OLAP 分析能力。在實際場景中,數(shù)據(jù)表包含了離線和實時,單表規(guī)模達(dá)上百列,行數(shù)也是非常大的。
■ 1.3 廣告數(shù)據(jù)平臺架構(gòu)

底部是數(shù)據(jù)采集層,這里與大部分公司基本一致。業(yè)務(wù)數(shù)據(jù)庫主要包含了廣告主的下單數(shù)據(jù)以及投放的策略;埋點日志和計費日志是廣告投放鏈路過程中產(chǎn)生的日志; 中間是數(shù)據(jù)生產(chǎn)的部分,數(shù)據(jù)生產(chǎn)的底層是大數(shù)據(jù)的基礎(chǔ)設(shè)施,這部分由公司的一個云平臺團隊提供,其中包含 Spark / Flink 計算引擎,Babel 統(tǒng)一的管理平臺。Talos 是實時數(shù)倉服務(wù),RAP 和 OLAP 對應(yīng)不同的實時分析以及 OLAP 存儲和查詢服務(wù)。 數(shù)據(jù)生產(chǎn)的中間層是廣告團隊包含的一些服務(wù),例如在生產(chǎn)里比較典型的離線計算和實時計算。 離線是比較常見的一個分層模型,調(diào)度系統(tǒng)是對生產(chǎn)出的離線任務(wù)做有效的管理和調(diào)度。 實時計算這邊使用的引擎也比較多,我們的實時化是從 2016 年開始,當(dāng)時選的是 Spark Streaming,后面隨著大數(shù)據(jù)技術(shù)發(fā)展以及公司業(yè)務(wù)需求產(chǎn)生了不同場景,又引入了計算引擎 Flink。 實時計算底層調(diào)度依賴于云計算的 Babel 系統(tǒng),除了計算之外還會伴隨數(shù)據(jù)治理,包括進度管理,就是指實時計算里一個數(shù)據(jù)報表當(dāng)前已經(jīng)穩(wěn)定的進度到哪個時間點。離線里其實就對應(yīng)一個表,有哪些分區(qū)。 血緣管理包括兩方面,離線包括表級別的血緣以及字段血緣。實時主要還是在任務(wù)層面的血緣。 至于生命周期管理,在離線的一個數(shù)倉里,它的計算是持續(xù)迭代的。但是數(shù)據(jù)保留時間非常長的話,數(shù)據(jù)量對于底層的存儲壓力就會比較大。 數(shù)據(jù)生命周期管理主要是根據(jù)業(yè)務(wù)需求和存儲成本之間做一個權(quán)衡。 質(zhì)量管理主要包括兩方面,一部分在數(shù)據(jù)接入層,判斷數(shù)據(jù)本身是否合理;另外一部分在數(shù)據(jù)出口,就是結(jié)果指標(biāo)這一層。因為我們的數(shù)據(jù)會供給其他很多團隊使用,因此在數(shù)據(jù)出口這一層要保證數(shù)據(jù)計算沒有問題。 再上層是統(tǒng)一查詢服務(wù),我們會封裝很多接口進行查詢。
因為數(shù)據(jù)化包括離線和實時,另外還有跨集群,所以在智能路由這里會進行一些選集群、選表以及復(fù)雜查詢、拆分等核心功能。 查詢服務(wù)會對歷史查詢進行熱度的統(tǒng)一管理。這樣一方面可以更應(yīng)進一步服務(wù)生命周期管理,另一方面可以去看哪些數(shù)據(jù)對于業(yè)務(wù)的意義非常大。 除了生命周期管理之外,它還可以指導(dǎo)我們的調(diào)度系統(tǒng),比如哪些報表比較關(guān)鍵,在資源緊張的時候就可以優(yōu)先調(diào)度這些任務(wù)。 再往上是數(shù)據(jù)應(yīng)用,包括報表系統(tǒng)、Add - hoc 查詢、數(shù)據(jù)可視化、異常監(jiān)控和下游團隊。
■ 1.4 實時數(shù)倉 - 生產(chǎn)鏈路

■ 1.5 實時數(shù)倉 - 進度服務(wù)

■ 1.6 實時數(shù)倉 - 查詢服務(wù)

■ 1.7 數(shù)據(jù)生產(chǎn) - 規(guī)劃

一方面是他們的邏輯可能會發(fā)生差異,最終導(dǎo)致結(jié)果表不一致;
另一方面是人力成本,同時需要兩個團隊進行開發(fā)。
■ 1.8 數(shù)據(jù)生產(chǎn) - SQL 化

有一些業(yè)務(wù)團隊本身對于計算引擎算子非常熟,那么他們便可以做一些代碼開發(fā); 但是很多業(yè)務(wù)團隊可能對引擎并不是那么了解,或者沒有強烈的意愿去了解,他們就可以通過這種可視化的方式,拼接出一個作業(yè)。
2. 特征工程

第一個需求是實時化,因為數(shù)據(jù)價值隨著時間的遞增會越來越低。比如某用戶表現(xiàn)出來的觀影行為是喜歡看兒童內(nèi)容,平臺就會推薦兒童相關(guān)的廣告。另外,用戶在看廣告過程中,會有一些正/負(fù)反饋的行為,如果把這些數(shù)據(jù)實時迭代到特征里,就可以有效提升后續(xù)的轉(zhuǎn)化效果。
特征工程的第二個需求是服務(wù)穩(wěn)定性。
首先是作業(yè)容錯,比如作業(yè)在異常的時候能否正?;謴?fù); 另外是數(shù)據(jù)質(zhì)量,在實時數(shù)據(jù)里追求端到端精確一次。
■ 2.1 點擊率預(yù)估

一方面是 Tracking 流里曝光、點擊事件的關(guān)聯(lián); 另一方面是特征流跟用戶行為的關(guān)聯(lián)。
第一個挑戰(zhàn)是數(shù)據(jù)量; 第二個挑戰(zhàn)是實時數(shù)據(jù)亂序和延遲; 第三個挑戰(zhàn)是精確性要求高。

第一個部分是用戶行為流里曝光跟點擊事件的關(guān)聯(lián),這里通過 CEP 實現(xiàn)。
第二個部分是兩個流的關(guān)聯(lián),前面介紹特征需要保留 7 天,它的狀態(tài)較大,已經(jīng)是上百 TB。這個量級在內(nèi)存里做管理,對數(shù)據(jù)穩(wěn)定性有比較大的影響,所以我們把特征數(shù)據(jù)放在一個外部存儲 (Hbase) 里,然后和 HBase 特征做一個實時數(shù)據(jù)查詢,就可以達(dá)到這樣一個效果。
■ 2.2 點擊率預(yù)估 - 流內(nèi)事件關(guān)聯(lián)

如果事件序列本身都在同一個窗口之內(nèi),數(shù)據(jù)沒有問題; 但是當(dāng)事件序列跨窗口的時候,是達(dá)不到正常關(guān)聯(lián)效果的。
■ 2.3 點擊率預(yù)估-雙流關(guān)聯(lián)
首先支持比較高的讀寫并發(fā)能力; 另外它的時效性需要非常低; 同時因為數(shù)據(jù)要保留 7 天,所以它最好具備生命周期管理能力。

第一點是特征數(shù)據(jù)保留了 7 天,如果對應(yīng)特征是在 7 天之前,那么它本身是關(guān)聯(lián)不到的。
另外在廣告業(yè)務(wù)里,存在一些外部的刷量行為,比如刷曝光或刷點擊,但它本身并沒有真實存在的廣告請求,所以這種場景也拿不到對應(yīng)特征。
■ 2.4 有效點擊

點擊流比較好理解,包括用戶的曝光和點擊等行為,從里面篩選點擊事件即可。
播放行為流是在用戶觀看的過程,會定時地把心跳信息回傳,比如三秒鐘回傳一個心跳,表明用戶在持續(xù)觀看。在定義時長超過 6 分鐘的時候,需要把這個狀態(tài)本身做一些處理,才能滿足 6 分鐘的條件。

在左邊的狀態(tài)里面,一個點擊事件進來之后,會對這個點擊做一個狀態(tài)記錄,同時會注冊一個定時器做定期清理,定時器是三個小時。因為大部分影片的時長在三小時以內(nèi),如果這個時候?qū)?yīng)的播放事件還沒有一個目標(biāo)狀態(tài),點擊事件基本就可以過期了。
在右邊的播放心跳流里,這個狀態(tài)是對時長做累計,它本身是一個心跳流,比如每三秒傳一個心跳過來。我們需要在這里做一個計算,看它累計播放時長是不是達(dá)到 6 分鐘了,另外也看當(dāng)前記錄是不是到了 6 分鐘。對應(yīng) Flink 里的一個實現(xiàn)就是把兩個流通過 Connect 算子關(guān)系在一起,然后可以制定一個 CoProcessFunction,在這里面有兩個核心算子。 第一個算子是拿到狀態(tài) 1 的流事件之后,需要做一些什么樣的處理; 第二個算子是拿到第 2 個流事件之后,可以自定義哪些功能。
■ 2.5 特征工程 - 小結(jié)

三、Flink 使用過程中的問題及解決
1. 容錯

2. 數(shù)據(jù)質(zhì)量

3. Sink Kafka

第一個辦法是用戶自定義一個 FlinkKafkaPartitioner;
另一個辦法是默認(rèn)不配置,默認(rèn)輪詢寫入各個 Partition。
4. 監(jiān)控加強

5. 監(jiān)控報警

6. 實時數(shù)據(jù)生產(chǎn)

我們的實時是從 2016 年開始起步,當(dāng)時主要功能點是做一些指標(biāo)實時化,使用的是 SparkStreaming; 2018 年上線了點擊率實時特征; 2019 年上線了 Flink 的端到端精確到一次和監(jiān)控強化。 2020 年上線了有效點擊實時特征; 同年10月,逐步推進實時數(shù)倉的改進,把 API 生產(chǎn)方式逐漸 SQL 化;
2021 年 4 月,進行流批一體的探索,目前先把流批一體放在 ETL 實現(xiàn)。
四、未來規(guī)劃

首先是流批一體,這里包括兩個方面: 第一個是 ETL 一體,目前已經(jīng)是基本達(dá)到可線上的狀態(tài)。 第二個是實時報表 SQL 化和數(shù)據(jù)湖的結(jié)合。 另外,現(xiàn)在的反作弊主要是通過離線的方式實現(xiàn),后面可能會把一些線上的反 作弊模型轉(zhuǎn)成實時化,把風(fēng)險降到最低。
【 活動推薦 】
8 月 7 日 Apache Flink Meetup 深圳站,
4 位技術(shù)大咖將分享 Flink 在騰訊和第四范式的實踐應(yīng)用,
并且也將帶來 Flink 1.14 版本的新特性預(yù)覽。
(掃碼報名)
戳我,立即參加活動 ~評論
圖片
表情
