精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Flink 的 RocksDB 狀態(tài)后端在 vivo 的實(shí)踐

大數(shù)據(jù)
本文簡要介紹了特征拼接在實(shí)時(shí)推薦中的重要作用,并講述了vivo實(shí)時(shí)推薦系統(tǒng)中特征拼接模塊的架構(gòu)演進(jìn)過程以及采用現(xiàn)有的“基于RocksDB的大狀態(tài)解決方案”的原因,重點(diǎn)敘述了該方案所遇到的一系列問題。

本文簡要介紹了特征拼接在實(shí)時(shí)推薦中的重要作用,并講述了vivo實(shí)時(shí)推薦系統(tǒng)中特征拼接模塊的架構(gòu)演進(jìn)過程以及采用現(xiàn)有的“基于RocksDB的大狀態(tài)解決方案”的原因,重點(diǎn)敘述了該方案所遇到的一系列問題,包括TM Lost、RocksDB性能調(diào)優(yōu)門檻高、TM初始化慢、狀態(tài)遠(yuǎn)程存儲(chǔ)HDFS RPC飆高等,并給出了這些問題的現(xiàn)象以及解決方案。

1分鐘看圖掌握核心觀點(diǎn)??

01、背景

在推薦系統(tǒng)中,樣本拼接是銜接在線服務(wù)與算法模型的重要一個(gè)環(huán)節(jié),主要職責(zé)是樣本拼接和業(yè)務(wù)相關(guān)的ETL處理等,模塊位置如下圖紅框所示。

推薦系統(tǒng)通過學(xué)習(xí)埋點(diǎn)數(shù)據(jù)來達(dá)到個(gè)性化精準(zhǔn)推薦的目的,因此需要知道服務(wù)端推薦下發(fā)的內(nèi)容,是否有一系列的行為(曝光,點(diǎn)擊,播放,點(diǎn)贊,收藏,加購等等),把被推薦內(nèi)容的埋點(diǎn)數(shù)據(jù)與當(dāng)下的特征拼接起來的過程,一般稱為樣本拼接,一個(gè)簡化的流程如下:

推薦的過程可以檢驗(yàn)概括為以下幾點(diǎn):

  • 后臺(tái)服務(wù)rank 推薦內(nèi)容給app客戶端,同時(shí)把內(nèi)容對(duì)應(yīng)的特征快照保存起來;
  • app接收到內(nèi)容后,埋點(diǎn)日志被上報(bào)到消息中間件;
  • 樣本拼接負(fù)責(zé)將特征與埋點(diǎn)日志拼接起來,定義正負(fù)樣本,格式轉(zhuǎn)換;
  • 模型接收樣本訓(xùn)練,將使用最新的模型做推薦。

為了保證較高的拼接率和穩(wěn)定性,我們的拼接架構(gòu)也經(jīng)過了長時(shí)間的迭代,這篇文章我將給大家介紹vivo特征拼接架構(gòu)的發(fā)展歷程、當(dāng)前方案、當(dāng)前方案遇到的問題和解決方案,以及未來的規(guī)劃和展望,希望能幫助到業(yè)內(nèi)的同學(xué)。

02、拼接方案選型

2.1小時(shí)粒度拼接

小時(shí)拼接是將埋點(diǎn)日志和特征快照都保存到Hive并以小時(shí)分區(qū),每小時(shí)調(diào)度一個(gè)Spark任務(wù)來處理兩個(gè)表相應(yīng)分區(qū)的數(shù)據(jù)做拼接,由于是小時(shí)拼接,實(shí)時(shí)性較低,Spark作業(yè)本身也依賴于上游Hive表小時(shí)分區(qū)生成,每個(gè)小時(shí)末尾的請(qǐng)求埋點(diǎn)有可能是落在當(dāng)前小時(shí),也有可能落在下個(gè)小時(shí)。舉個(gè)例子:19點(diǎn)50分下發(fā)了一個(gè)視頻,客戶端在19:59分點(diǎn)擊了,但是視頻播放卻是在20點(diǎn)03分完成的,這個(gè)時(shí)候就會(huì)存在拼接不上的問題。

2.2基于 Redis 的流式拼接

為了提升拼接率,且達(dá)到實(shí)時(shí)拼接,節(jié)點(diǎn)故障容災(zāi),完備監(jiān)控等特性,F(xiàn)link是一個(gè)很好的替代方案,也是最近幾年比較主流的實(shí)現(xiàn)。最初在實(shí)時(shí)推薦場景中,Kafka中的特征快照通過Flink任務(wù)寫入到Redis,另一個(gè)Flink任務(wù)消費(fèi)曝光埋點(diǎn)數(shù)據(jù)和點(diǎn)擊埋點(diǎn)數(shù)據(jù)并讀取存在Redis中的特征快照數(shù)據(jù)做拼接,拼接后的數(shù)據(jù)作為拼接特征被寫入到下游的Kafka中,提供給后續(xù)的算法做模型的訓(xùn)練,架構(gòu)圖如下:

經(jīng)過一段時(shí)間實(shí)踐,以上的方案出現(xiàn)了兩個(gè)痛點(diǎn):

  • Redis中存儲(chǔ)了幾十T的數(shù)據(jù),Redis的成本高;
  • 業(yè)務(wù)數(shù)據(jù)流量會(huì)波動(dòng),經(jīng)常需要DBA對(duì)Redis集群進(jìn)行擴(kuò)容,涉及大量數(shù)據(jù)的遷移,運(yùn)維成本高。

2.3基于 RocksDB 大狀態(tài)流式拼接

為了解決基于Redis的作為中間數(shù)據(jù)的存儲(chǔ)存在的問題,我們采用Flink狀態(tài)來存儲(chǔ)特征快照,整個(gè)架構(gòu)中不再需要外部的Redis,由于我們需要存儲(chǔ)的數(shù)據(jù)量達(dá)幾十T,這里我們選用適合大數(shù)據(jù)量存儲(chǔ)的RocksDB類型的狀態(tài)后端,調(diào)整后架構(gòu)更加簡潔,如下圖所示:

流程如下:

  • 首先將曝光流點(diǎn)點(diǎn)擊流以及特征在Flink 任務(wù)中做union并做keyby;
  • 在processElement方法中如果接收到曝光流就將數(shù)據(jù)保存到state中,如果接收到曝光流就將數(shù)據(jù)保存到state中,如果接收到特征就去state中查詢相應(yīng)的曝光和點(diǎn)擊數(shù)據(jù);
  • 如果能找到就發(fā)送到下游并將狀態(tài)數(shù)據(jù)清理掉,沒找到就將特征保存到state中,并注冊(cè)一個(gè)定時(shí)器;
  • 定時(shí)器觸發(fā)時(shí)去state中查詢相應(yīng)的曝光和點(diǎn)擊數(shù)據(jù),如果找到就發(fā)到下游,并將狀態(tài)數(shù)據(jù)清理掉。

由于RocksDB可以同時(shí)利用內(nèi)存和磁盤來存儲(chǔ)數(shù)據(jù),所以對(duì)于內(nèi)存的使用量大幅下降,由于RocksDB是嵌入式的數(shù)據(jù)庫,每個(gè)TM上的RocksDB數(shù)據(jù)庫只存儲(chǔ)shuffe到該TM上的數(shù)據(jù),無需再關(guān)注擴(kuò)縮容的問題。當(dāng)然隨著數(shù)據(jù)上漲,F(xiàn)link流式拼接在實(shí)際的生產(chǎn)過程中也遇到了一系列的問題,為了保證業(yè)務(wù)的可用性,我們花了較長的時(shí)間對(duì)這些問題進(jìn)行攻克,目前任務(wù)穩(wěn)定性達(dá)到99.99% ,拼接率長期穩(wěn)定在99%以上,對(duì)拼接效果提升較大。下面我將列舉我們遇到的問題和解決方案,希望能夠幫助到業(yè)內(nèi)的其他團(tuán)隊(duì)。

03、問題及解決方案

3.1TM Lost問題

3.1.1 現(xiàn)象

在方案實(shí)施之初,我們發(fā)現(xiàn)這些特征拼接的任務(wù)頻繁出現(xiàn)TM was Lost異常導(dǎo)致任務(wù)重啟,我們看了日志,發(fā)現(xiàn)都是TM內(nèi)存超出了YARN的內(nèi)存限制被kill。

3.1.2 問題分析

那么我們的疑問就來了,為啥這部分任務(wù)的內(nèi)存很容易超出,超出的那部分內(nèi)存又是誰在用呢?下面這張圖是來自Flink的官網(wǎng),因?yàn)槲覀冊(cè)谄脚_(tái)使用Flink的時(shí),我們只設(shè)置了總的內(nèi)存,并沒有關(guān)注其他各個(gè)局部的內(nèi)存,那么這些部位的內(nèi)存是如何分配的?為了搞清楚這個(gè)問題,有必要梳理一下每個(gè)模塊內(nèi)存計(jì)算的邏輯。

圖片引用自Flink

Flink內(nèi)存分配邏輯

一般在YARN上提交的任務(wù)是含有taskmanager.memory.process.size 參數(shù)的配置的,所以Flink在分配內(nèi)存時(shí),會(huì)以調(diào)用deriveProcessSpecWithTotalProcessMemory 方法分配。

通過配置參數(shù)獲得meatspace 的大小,通過jobmanager.memory.jvm-overhead.fraction 的比例計(jì)算overhead的內(nèi)存,totalFlinkMemory通過總的進(jìn)程的內(nèi)存減去meatspace + overhead的內(nèi)存得到。

通過配置中的參數(shù)獲取 frameworkHeapMemory-Size、frameworkOffHeapMemorySize 、task-OffHeapMemorySize 的大小。

通過managedmemory的配置獲取托管內(nèi)存的值, 通過networkbuffer的配置獲取networkbuffer的值 。totalFlinkMemory 減去所有需要排除的內(nèi)存,剩下的內(nèi)存分配給堆。內(nèi)存分配邏輯,以及每塊內(nèi)存的設(shè)置方法如下圖:

到此TM的各個(gè)內(nèi)存模塊的內(nèi)存已經(jīng)劃分完成。有上面的分析我們可以得出以下的結(jié)論:

totalProcessMemorySize = totalFlinkMemorySize + JvmMetaspaceSize + JvmOverheadSize
totalFlinkMemorySize  = frameworkOffHeapMemorySize + taskOffHeapMemorySize + managedMemorySize + networkMemorySize + frameworkHeapMemorySize + taskHeapMemorySize

這里重點(diǎn)將一下JVMOverhead,JVMOverhead并沒有具體的作用,是一個(gè)預(yù)留值,它是一個(gè)緩沖區(qū),可以避免在Flink運(yùn)行在容器中是因?yàn)槎虝r(shí)時(shí)間的內(nèi)存超出了容器的限制而被kill。

frameworkOffHeapMemorySize和taskOff-HeapMemorySize 也是預(yù)留值,offheap在概念上的主要是指native內(nèi)存。frameworkHeap-MemorySize 也是預(yù)留值。由此可以看出雖然Flink官方將TM的內(nèi)存劃分的較細(xì)致,但是像JvmOverheadSize frameworkOffHeap-MemorySize,taskOffHeapMemorySize,frameworkHeapMemorySize 都只是邏輯上的預(yù)留,并沒有從操作系統(tǒng)層面實(shí)現(xiàn)隔離。

RocksDB內(nèi)存分配邏輯

因?yàn)槎褍?nèi)存不足時(shí)一般會(huì)報(bào)out of memory的異常,所以到這一步我們推測(cè)應(yīng)該是堆外內(nèi)存溢出了,而堆外內(nèi)存最大的一塊就是RocksDB使用的,而從Flink的官網(wǎng)的介紹可以知道托管內(nèi)存就是給RocksDB使用的,下面我們?cè)倏匆幌峦泄軆?nèi)存是如何分配給RocksDB的。

cacheMemory = (1-(1/3)*(writeBufferRatio))* managedMemory
bufferMemory = (2/3)*(writeBufferRatio)* managedMemory
讀寫緩存總內(nèi)存 =  bufferMemory + cacheMemory = (1 +(1/3)*(writeBufferRatio))* managedMemory

由上面的代碼可以看出,managed memory 是通過一定的比例給RocksDB的各個(gè)部分來分配內(nèi)存的,writeBufferRatio會(huì)影響讀緩存和寫緩存的大小,理論上讀寫緩存總內(nèi)存有可能會(huì)超過managedMemory的大小。通過上面的公式可以看出讀寫緩存總內(nèi)存最多超出managedMemory的1/3,這里很容易想到,那么我們?cè)谂挪閛verhead的時(shí)候配置大于managedMemory的1/3不就能你面內(nèi)存溢出了,但是在實(shí)踐中,我們這樣配置并并沒有完全的解決物理內(nèi)存溢出的問題,下面關(guān)于RocksDB內(nèi)存的資料,終于找到了是還有哪部分內(nèi)存容易溢出了,是因?yàn)椴糠謪^(qū)域的內(nèi)存難以限制導(dǎo)致的。

RocksDB 的內(nèi)存占用有 4 個(gè)部分:

  • Block Cache: OS PageCache 之上的一層緩存,緩存未壓縮的數(shù)據(jù) Block;
  • Indexes and filter blocks: 索引及布隆過濾器,用于優(yōu)化讀性能;
  • MemTable: 類似寫緩存;
  • Blocks pinned by Iterator: 觸發(fā) RocksDB 遍歷操作(比如遍歷 RocksDBMapState 的所有 key)時(shí),Iterator 在其生命周期內(nèi)會(huì)阻止其引用到的 Block 和 MemTable 被釋放,導(dǎo)致額外的內(nèi)存占用。

前三個(gè)區(qū)域的內(nèi)存都是可配置的,但 Iterator 鎖定的資源則要取決于應(yīng)用業(yè)務(wù)使用模式,且沒有提供一個(gè)硬限制,因此 Flink 在計(jì)算 RocksDB StateBackend 內(nèi)存時(shí)沒有將這部分納入考慮,其次是 RocksDB Block Cache 的一個(gè) bug,它會(huì)導(dǎo)致 Cache 大小無法嚴(yán)格控制,有可能短時(shí)間內(nèi)超出設(shè)置的內(nèi)存容量,相當(dāng)于軟限制,原來是迭代器的內(nèi)存限制的不好,導(dǎo)致的內(nèi)存溢出。

3.1.3 解決方案

我們?cè)谑褂肍link 的RocksDB狀態(tài)后端時(shí),是通過managed memory來控制RocksDB各個(gè)部分的內(nèi)存的,所以managed memory內(nèi)存越小分配給各個(gè)部分的內(nèi)存也就越小,迭代器內(nèi)存越不容易溢出。到此我們對(duì)Flink的RocksDB狀態(tài)后端的內(nèi)存有了一定的認(rèn)知:當(dāng)性能可以滿足的情況下,F(xiàn)link的Manaed memory應(yīng)該越小越好。但是上滿形成的經(jīng)驗(yàn)很難高效的在業(yè)務(wù)上落地,原因是“Flink的Manaed memory應(yīng)該越小越好”很難去確定。

于是我們聯(lián)想到了之前的JVMoverhead,在我們的實(shí)際實(shí)踐中過程中,我們是通過調(diào)大JVMoverhead,和jemalloc內(nèi)存分配器來解決內(nèi)存溢出問題的。在Flink1.12之后Flink on k8s的內(nèi)存分配器已經(jīng)默認(rèn)改成了jemalloc,可以避免內(nèi)存的分配過程中出現(xiàn)64M問題。

但是要注意:由于我們的Java版本是JAVA8小版本是192,在最新版本的jemalloc5.3上出現(xiàn)了死鎖的問題,后來我們采用jemalloc4.5 就沒有問題了。據(jù)了解業(yè)界有些公司使用的JAVA8小版本是256采用jemalloc5.3沒有遇到死鎖問題。

3.2RocksDB 的性能監(jiān)控問題

3.2.1 現(xiàn)象

Flink RocksDB大狀態(tài)的任務(wù)經(jīng)常出現(xiàn)延遲,但是我們很難知道性能的瓶頸在哪塊,從而優(yōu)化響應(yīng)的環(huán)節(jié)。

3.2.2 解決方案

其實(shí)Flink提供了一系列對(duì)于RocksDB的性能的監(jiān)控指標(biāo),我們只需要加上參數(shù)開啟即可,這里我只結(jié)局我覺得最有參考意義的指標(biāo)開啟的參數(shù):

下面是相關(guān)指標(biāo)的監(jiān)控頁面:

3.3任務(wù)出現(xiàn)延遲

3.3.1 現(xiàn)象

Flink RocksDB大狀態(tài)的任務(wù)經(jīng)常出現(xiàn)延遲,調(diào)優(yōu)參數(shù)高達(dá)近百個(gè),如何系統(tǒng)性的調(diào)優(yōu),難度較大。

3.3.2 解決方案

要想對(duì)RocksDB的性能做優(yōu)化,我們有必要先了解一下RocksDB的讀寫流程。

RocksDB的讀流程

  • 獲取當(dāng)前時(shí)刻的SuperVersion,SuperVersion是RocksDB內(nèi)針對(duì)于所有SST文件列表以及內(nèi)存中的MemTable和Immutable MemTable的一個(gè)版本;
  • 獲取當(dāng)前的序號(hào)來決定當(dāng)前讀操作依賴的數(shù)據(jù)快照;
  • 嘗試從第一步SuperVersion中引用的MemTable以及Immutable MemTable中獲取對(duì)應(yīng)的值。首先會(huì)經(jīng)過布隆過濾器,假如不存在則一定不存在,反之假如返回存在則不一定存在;
  • 嘗試從Block Cache中讀??;
  • 嘗試從SST文件中獲取。

RocksDB的寫流程

  • 將寫入操作順序?qū)懭隬AL日志中,接下來把數(shù)據(jù)寫到 MemTable中(采用SkipList結(jié)構(gòu)實(shí)現(xiàn))
    MemTable達(dá)到一定大小后,將這個(gè) MemTable 切換為不可更改的 immutable MemTable,并新開一個(gè) MemTable 接收新的寫入請(qǐng)求;
  • 這個(gè) immutable MemTable進(jìn)行持久化到磁盤,成為L0 層的 SSTable 文件;
  • 每一層的所有文件總大小是有限制的,每下一層大十倍。一旦某一層的總大小超過閾值了,就選擇一個(gè)文件和下一層的文件合并。
    注意: 所有下一層被影響到的文件都會(huì)參與 Compaction。合并之后,保證 L1 到 L6 層的每一層的數(shù)據(jù)都是在 key 上全局有序的,而 L0 層是可以有重疊的,寫流程的約束;
  • 日志文件用于崩潰恢復(fù);
  • 每個(gè)MemTable及SST文件中的Key都是有序的(字符順序的升序);
  • 日志文件中的Key是無序的;
  • 刪除操作是標(biāo)記刪除,是插入操作的一種,真正的刪除要在Compaction的時(shí)候?qū)崿F(xiàn);
  • 無更新實(shí)現(xiàn),記錄更新通過插入一條新記錄實(shí)現(xiàn);

當(dāng)任務(wù)出現(xiàn)延遲時(shí),由于我們已經(jīng)有了RocksDB性能指標(biāo)的監(jiān)控也了解RocksDB的原理,我們?cè)谧鲂阅軆?yōu)化時(shí)就可以對(duì)癥下藥了。

讀性能優(yōu)化

當(dāng)任務(wù)出現(xiàn)延遲且塊緩存命中率下降時(shí),說明是讀的性能下降導(dǎo)致延遲,我們可以通過提升緩存命中率的方式來提升讀性能,RocksDB任務(wù)緩存命中率的優(yōu)化思路如下:

  • 托管內(nèi)存小于TM內(nèi)存20%,可以調(diào)大托管內(nèi)存:state.backend.rocksdb.memory.managed 到 20%;
  • Flink內(nèi)部對(duì)RocksDB的優(yōu)化已經(jīng)沉淀了多組參數(shù),建議使用配置:
    state.backend.rocksdb.predefined-options = SPINNING_DISK_OPTIMIZED_HIGH_MEM;
  • Flink中使用state.backend.rocksdb.memory.write-buffer-ratio參數(shù)來管理寫緩存,調(diào)小該參數(shù),能夠提升讀緩存,該參數(shù)默認(rèn)0.5;
  • RocksDB 會(huì)有一寫索引和過濾器放在內(nèi)存中,用這個(gè)參數(shù)開啟:state.backend.rocksdb.memory.partitioned-index-filters 默認(rèn) false,并且可以調(diào)節(jié)索引和過濾器占用的內(nèi)存比例,參數(shù)是:state.backend.rocksdb.memory.high-prio-pool-ratio默認(rèn)為0.1。

寫性能優(yōu)化

當(dāng)任務(wù)延遲,如果出現(xiàn)等待flush的內(nèi)存表的大小增加,或者等待合并的個(gè)數(shù)增加,因?yàn)榈葞lush個(gè)數(shù)達(dá)到一定的個(gè)數(shù)時(shí)寫將會(huì)被阻塞,可以先關(guān)注一下磁盤io是否打滿,如果已經(jīng)處于高位,建議提升任務(wù)的并發(fā)。如果此磁盤io處于低位,我們可以調(diào)整flush和compation的線程數(shù)來使寫的數(shù)據(jù)不再積壓。提升寫寫性能。Flink會(huì)將flush和compation的線程數(shù)通過一個(gè)參數(shù)統(tǒng)一管理,參數(shù)是:state.backend.rocksdb.thread.num,默認(rèn)值是1。

3.4任務(wù)啟動(dòng)慢的問題

3.4.1 現(xiàn)象

由于Flink任務(wù)在從狀態(tài)啟動(dòng)時(shí)需要將存儲(chǔ)在遠(yuǎn)程HDFS的狀態(tài)文件讀到本地,當(dāng)TM較集中時(shí)單臺(tái)機(jī)器的磁盤io很容易被打滿,導(dǎo)致某些sub task 長時(shí)間處于INITIALIZING的狀態(tài)。

3.4.2 解決方案

YARN參數(shù)的優(yōu)化

YARN默認(rèn)的yarn.scheduler.fair.assignmultiple參數(shù)為flase,即一次只分配一個(gè)container,但是CDH將這個(gè)參數(shù)設(shè)置成了true,yarn.scheduler.fair.max.assigr默認(rèn)為-1,表示不限制,所以導(dǎo)致一次調(diào)度到單個(gè)節(jié)點(diǎn)上的container較多。我們的解決方案是將YARN配置中的yarn.scheduler.fair.assignmultiple參數(shù)設(shè)為false,一次只調(diào)度一個(gè)container,解決了TM分配較集中的問題。

Flink調(diào)度策略的優(yōu)化

由于只是限制了每次分配TM的個(gè)數(shù),還不能完全避免分配集中的問題,于是我們對(duì)Flink引擎內(nèi)部做了優(yōu)化,可以硬限制在某臺(tái)機(jī)器上調(diào)度TM的個(gè)數(shù),具體做法是,是當(dāng)YARN返回給Flink ResourceManager container信息時(shí),判斷container是否符合要求,如果不符合可以部分拒收,再次申請(qǐng)資源,該功能由參數(shù)開啟。

3.5磁盤打滿的問題

3.5.1 現(xiàn)象

由于我們實(shí)時(shí)集群的磁盤較小,大狀態(tài)任務(wù)的狀態(tài)達(dá)幾十上百T,頻繁出現(xiàn)磁盤使用率達(dá)到90%的告警。

3.5.2 解決方案

我們將大狀態(tài)的任務(wù)的Checkpoint數(shù)據(jù)存儲(chǔ)到磁盤資源較寬裕的離線的集群,非大狀態(tài)的任務(wù)的Checkpoint數(shù)據(jù)存儲(chǔ)在實(shí)時(shí)集群。

3.6HDFS RPC 飆高問題

3.6.1 現(xiàn)象

在業(yè)務(wù)新上一批任務(wù)后,我們發(fā)現(xiàn)離線集群HDFS的RPC有明顯的增加。

3.6.2 解決方案

由于我們默認(rèn)只會(huì)保存最近的3個(gè)Checkpoint,所以對(duì)于增量Checkpoint而言,肯定會(huì)有文件的修改和刪除,據(jù)了解修改和刪除是對(duì)HDFS性能影響較大的操作。我們對(duì)比這一批任務(wù)任務(wù)在HDFS上的Checkpoint文件和之前的任務(wù)對(duì)比發(fā)現(xiàn),文件數(shù)量大很多,但是每個(gè)文件小很多,于是我們調(diào)整了參數(shù):state.backend.rocksdb.compaction.level.target-file-size-base參數(shù)為256MB,這個(gè)參數(shù)默認(rèn)是64MB,參數(shù)的作用控制壓縮后的文件的大小。配置改參數(shù)后RPC回歸正常。

效果如圖:

04、總結(jié)

4.1遺留問題

4.1.1.RocksDB的調(diào)優(yōu)的門檻較高

雖然我們?cè)谌蝿?wù)上使用了積累通用經(jīng)驗(yàn)進(jìn)行優(yōu)化,但是有些數(shù)據(jù)量較大的任務(wù)在流量高峰期依然容易出現(xiàn)延遲,RocksDB的參數(shù)有幾十個(gè),要想把性能調(diào)優(yōu)做到比較極致需要深入了解其原理,還有對(duì)業(yè)務(wù)特點(diǎn)有深入的了解,對(duì)于應(yīng)用開發(fā)而言,門檻較高。

4.1.2.任務(wù)恢復(fù)慢

由于有些任務(wù)的狀態(tài)高達(dá)幾十T,在重啟任務(wù)或者異常重啟時(shí)要從Checkpoint恢復(fù),需要從遠(yuǎn)程的HDFS下載狀態(tài)到本地磁盤,單機(jī)的io很容易被打滿,雖然我們做了TM打散,但是有些單個(gè)TM恢復(fù)狀態(tài)就需要幾十分鐘,這對(duì)于特征拼接任務(wù)來講是不可接受的。

4.1.3.SSD壽命消耗加速

我們的實(shí)時(shí)集群磁盤使用的是單塊的SSD,SSD壽命是有限的,然而RcoksDB的寫放大的特點(diǎn)加速了SSD的壽命的消耗。

4.2規(guī)劃

經(jīng)過較長時(shí)間的實(shí)踐我們理解了樣本拼接的本質(zhì)是將不同來源、不同更新頻率、不同規(guī)模的特征(如基礎(chǔ)特征、實(shí)時(shí)埋點(diǎn)特征、歷史特征)組合成完整樣本,而單一組件往往在 “延遲、存儲(chǔ)規(guī)模、更新頻率” 等維度存在短板,必須通過混合架構(gòu)實(shí)現(xiàn) “優(yōu)勢(shì)互補(bǔ)”。

業(yè)界混合架構(gòu)的案例

組件分工


拼接流程

① 實(shí)時(shí)日志采集:用戶點(diǎn)擊商品的日志通過Kafka接入Flink實(shí)時(shí)作業(yè);

② 實(shí)時(shí)數(shù)據(jù)存儲(chǔ):將曝光流的數(shù)據(jù)存到RocksDB和HBase中,RocksDB的TTL設(shè)置成1小時(shí);

③ 算子內(nèi)實(shí)時(shí)拼接:Flink算子從RocksDB讀取用戶最近1小時(shí)埋點(diǎn)特征,從HBase讀取基礎(chǔ)特征,初步拼接成“實(shí)時(shí)+基礎(chǔ)”特征;

④ 歷史特征融合:Flink作業(yè)將初步拼接結(jié)果寫入Paimon,與Paimon中存儲(chǔ)的“7天歷史特征”融合,生成完整樣本;

⑤ 樣本分發(fā):

  • 實(shí)時(shí)推薦:完整樣本通過Flink寫入到HDFS提供給在線訓(xùn)練服務(wù)使用;
  • 離線訓(xùn)練:Spark作業(yè)從Paimon讀取全量完整樣本,用于推薦模型的離線迭代。

下面是一個(gè)調(diào)用時(shí)序圖:

核心價(jià)值

  • 低延遲:RocksDB 支撐算子內(nèi)毫秒級(jí)拼接,滿足實(shí)時(shí)推薦的 “秒級(jí)響應(yīng)” 需求;
  • 大規(guī)模:HBase+Paimon 可支撐億級(jí)用戶的PB級(jí)特征存儲(chǔ);
  • 流批協(xié)同:同一套樣本既供實(shí)時(shí)推薦,又供離線訓(xùn)練,實(shí)現(xiàn)流批架構(gòu)統(tǒng)一;
  • 易于擴(kuò)展:Paimon動(dòng)態(tài)列支持特征迭代。

4.3展望

近幾年大數(shù)據(jù)架構(gòu)已經(jīng)從計(jì)算-存儲(chǔ)緊密耦合的Map-Reduce時(shí)代,進(jìn)入到了以Kubernetes容器化部署為標(biāo)準(zhǔn)的云原生世界。未來Flink將引入基于遠(yuǎn)程存儲(chǔ)的存算分離狀態(tài)管理架構(gòu),新架構(gòu)主要為了解決以下問題:

  • 容器化環(huán)境下計(jì)算節(jié)點(diǎn)受本地磁盤大小限制的問題;
  • 由于RocksDB中LSM結(jié)構(gòu)的周期性 Compaction 導(dǎo)致計(jì)算資源尖峰的問題;
  • 大規(guī)模狀態(tài)快速擴(kuò)縮容的挑戰(zhàn)。

我們也將持續(xù)關(guān)注Flink社區(qū)的發(fā)展,嘗試采用遠(yuǎn)程存儲(chǔ)狀態(tài)后端來做為特征拼接的解決方案。

責(zé)任編輯:龐桂玉 來源: vivo互聯(lián)網(wǎng)技術(shù)
相關(guān)推薦

2023-12-06 21:44:28

RocksDBvivo

2022-06-01 09:04:58

Kafka運(yùn)維副本遷移

2021-12-11 08:05:12

FlinkRocksDB數(shù)據(jù)

2022-04-28 09:36:47

Redis內(nèi)存結(jié)構(gòu)內(nèi)存管理

2021-05-06 11:54:40

大數(shù)據(jù)Flink

2018-11-14 13:49:16

Apache Flin唯品會(huì)架構(gòu)

2022-05-10 08:27:15

小紅書FlinkK8s

2023-12-14 13:01:00

Hudivivo

2022-04-21 08:09:18

Spark字段血緣Spark SQL

2024-02-29 09:17:43

數(shù)據(jù)中心

2024-05-30 14:18:04

2022-08-10 21:43:29

HttpClientHttp工具網(wǎng)絡(luò)

2022-06-10 15:21:15

MySQL CDCSqlServer數(shù)據(jù)庫

2023-01-05 07:54:49

vivo故障定位

2022-07-12 16:54:54

字節(jié)跳動(dòng)Flink狀態(tài)查詢

2021-09-14 23:50:17

Sentry后端監(jiān)控

2022-07-14 10:06:20

工作流引擎營銷自動(dòng)化vivo

2023-04-27 10:40:10

vivo容災(zāi)服務(wù)器

2022-12-22 08:51:40

vivo代碼

2021-05-20 09:55:23

Apache Flin阿里云大數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美xxxx做受欧美.88| 国产精品久久久久久久久动漫| 欧美国产视频一区二区| 成人性生活免费看| 91成人抖音| 亚洲综合区在线| 欧美一区二区三区在线免费观看| 中国a一片一级一片| 午夜精彩国产免费不卡不顿大片| 精品视频—区二区三区免费| 一女二男3p波多野结衣| 国产白浆在线免费观看| 国产精品美女久久久久久| 国产 高清 精品 在线 a| 精品国偷自产在线| 欧美精品色婷婷五月综合| 免费网站免费进入在线| 99精品国产99久久久久久白柏| 国产精品日韩在线一区| 欧美h在线观看| 国产综合自拍| 久久久精品影院| 在线观看日本黄色| 亚洲区小说区| 亚洲第一视频网站| 久久发布国产伦子伦精品| 久久精品女人天堂av免费观看| 亚洲国产精品久久人人爱| 中文字幕第一页亚洲| 国产在线观看免费网站| 97精品国产露脸对白| 99久久精品无码一区二区毛片| 中文字幕在线网站| 美女尤物久久精品| 欧美在线观看日本一区| 日韩成人免费观看| 亚洲小说区图片区| 欧美猛交免费看| 欧美黄色免费观看| 亚洲一区在线| 久久这里只有精品视频首页| 激情高潮到大叫狂喷水| 97视频精品| www国产精品视频| 蜜桃av.com| 欧美freesextv| 日韩在线精品视频| 久久人妻无码aⅴ毛片a片app | 中文在线最新版地址| 香蕉成人伊视频在线观看| 国产成人艳妇aa视频在线 | 中文字幕avav| 久久国产精品美女| 日韩欧美国产综合| 亚洲精品一二三四| 天堂av免费在线观看| 亚洲欧美小说色综合小说一区| 性感美女久久精品| 91视频最新入口| 亚洲伦理影院| 欧美日韩亚州综合| 久久无码人妻一区二区三区| 亚洲精品视频一二三区| 亚洲第一av在线| 内射中出日韩无国产剧情| 香蕉久久夜色精品国产更新时间| 精品在线观看国产| 免费黄在线观看| 国产精品久久久久久影院8一贰佰| 日韩亚洲成人av在线| 一区视频免费观看| 日韩黄色在线播放| 国产成人免费视频网站视频社区| 欧美情侣在线播放| 天美星空大象mv在线观看视频| 1区2区3区在线| 秋霞电影网一区二区| 国产精品第3页| 中文字幕 自拍偷拍| 精品国产一区二区三区无码| 免费在线观看污视频| 91亚洲男人天堂| 欧美日韩亚洲一区二区三区四区| 91网页在线观看| 亚洲三级理论片| 丰满的少妇愉情hd高清果冻传媒| 中文字幕在线官网| 欧美日韩高清一区二区不卡| 午夜诱惑痒痒网| 精品中国亚洲| 一本一道久久a久久精品逆3p| 欧美h片在线观看| 你懂的视频一区二区| 欧美在线播放视频| a级片在线免费看| 久久综合色婷婷| 天堂av在线中文| 韩日毛片在线观看| dy888亚洲精品一区二区三区| 国产精品区一区二区三区| 97超碰在线视| 播放一区二区| 亚洲国产精品va在线| 国产馆在线观看| 一区二区三区福利| 91亚洲精品久久久久久久久久久久| 天天摸天天碰天天爽天天弄| 国产精品国产三级国产专播品爱网| 日韩 欧美 视频| 免费成人毛片| 亚洲精品一区av在线播放| 久久久久久久久久久久国产| 美女精品一区二区| 国产精品麻豆免费版| 91美女视频在线| 欧美日韩亚洲精品内裤| jjzz黄色片| 亚洲va在线| 国产精品视频免费观看www| 日批免费在线观看| 一区二区免费看| 久久久久久久久久毛片| 国内精品久久久久久久久电影网| 午夜精品一区二区三区在线 | 色一区在线观看| 人妻体内射精一区二区三区| 欧美在线黄色| 成人免费直播live| 91在线高清| 欧美影院一区二区三区| 扒开jk护士狂揉免费| 亚洲欧美视频| 蜜桃91精品入口| 欧美gv在线| 日韩大陆毛片av| 国产一级做a爱免费视频| 国产精品538一区二区在线| 亚洲欧美日韩不卡| 国产日韩欧美中文在线| 久久精品国产欧美激情| 一级片视频网站| 国产精品青草久久| 天堂网在线免费观看| 日韩在线观看电影完整版高清免费悬疑悬疑| 欧洲亚洲免费视频| 国产精品久久二区| 国产在线观看黄| 色狠狠桃花综合| 日本欧美中文字幕| 久久久久成人精品无码| 国产美女娇喘av呻吟久久| 黄色www在线观看| 亚洲aⅴ网站| 久久综合网hezyo| 99精品久久久久久中文字幕| 一区二区三区视频在线观看 | 成人动漫视频在线| 日韩精品xxxx| 国产不卡av一区二区| 国产精品扒开腿做爽爽爽视频 | 国产精品的网站| 亚洲免费成人在线视频| 亚洲欧美亚洲| 久久国产一区二区| 欧美与亚洲与日本直播| 日韩视频免费在线| 亚洲第一成人av| 精品日本高清在线播放| 免费成人深夜天涯网站| 国产一区二区三区黄视频| 久久人人爽人人爽人人av| 久久国产精品免费精品3p| 国产精品久久久av久久久| 麻豆影视国产在线观看| 精品久久久久久久人人人人传媒 | 久久精品国产一区二区三区日韩 | 精品在线视频免费| 久久综合给合久久狠狠狠97色69| 乌克兰美女av| 狠狠入ady亚洲精品| 欧美在线3区| 国产精品亚洲欧美日韩一区在线| 97精品国产97久久久久久春色| 国产对白在线播放| 国产福利在线免费观看| 亚洲人成在线电影| aaa级黄色片| 色综合欧美在线| 极品颜值美女露脸啪啪| 久久综合九色综合欧美就去吻 | 成人在线视频一区二区三区| 日韩三级毛片| 91免费版网站入口| 欧美sm一区| 欧美xxxx综合视频| 国产一级在线观看| 亚洲精品一线二线三线无人区| 无码人妻精品一区二区蜜桃色欲| 亚洲欧美激情小说另类| 国产精品久久久久无码av色戒| 国内成人自拍视频| 日韩 欧美 高清| 亚洲手机在线| 国产精品jizz在线观看老狼| 欧美电影在线观看完整版| 91久久夜色精品国产网站| xxxxxx欧美| 午夜伦理精品一区| 伊人电影在线观看| 日韩中文字幕在线观看| 黄色电影免费在线看| 亚洲国产精品中文| 午夜精品一区二区三| 欧美网站大全在线观看| 免费黄色网址在线| 亚洲福利国产精品| 久久久久久久久毛片| 国产精品毛片大码女人| 国产ts在线播放| 99re这里只有精品视频首页| 不卡的一区二区| 久99久精品视频免费观看| 日本www.色| 久久午夜激情| 91视频 -- 69xx| 亚洲激情社区| 九九热只有这里有精品| 亚洲欧美亚洲| 国产精品日韩三级| 亚洲欧美一区在线| 香港三级日本三级a视频| 亚洲一区二区三区无吗| 偷拍盗摄高潮叫床对白清晰| 精品国产99| 日韩久久在线| 欧美肉体xxxx裸体137大胆| 日本不卡一区二区三区视频| 奇米狠狠一区二区三区| 欧美xxxx黑人又粗又长精品| 亚洲精品无吗| 欧美精品v日韩精品v国产精品| 香蕉久久夜色精品国产使用方法| 久久精品第九区免费观看| 日本精品影院| 欧美极品色图| 波多野结衣在线观看一区二区三区 | 色综合中文网| 欧美亚洲爱爱另类综合| 精品在线播放| 亚洲精品一区二区毛豆| 久久在线播放| 正在播放一区二区三区| **女人18毛片一区二区| 日本a在线天堂| 亚洲二区精品| 成人免费毛片播放| 久久精品国产**网站演员| www.cao超碰| 国产福利一区二区| 中文字幕在线永久| 久久精品在线观看| 岛国片在线免费观看| 亚洲欧美国产三级| 亚洲激情视频一区| 日本黄色一区二区| 97超碰国产在线| 亚洲精品在线网站| 免费理论片在线观看播放老| 中文字幕日韩在线视频| av网站网址在线观看| 性欧美长视频免费观看不卡| 日韩伦理三区| 92看片淫黄大片看国产片| jizz国产精品| 日韩高清国产精品| 中文字幕一区二区av| 久在线观看视频| 日本在线不卡视频| 国产精品熟女一区二区不卡| 91香蕉视频污| frxxee中国xxx麻豆hd| 亚洲成人激情自拍| 最近中文字幕在线免费观看| 日韩精品在线网站| 国产高清av在线| 久久久久久久久久久网站| 超薄肉色丝袜脚交一区二区| 97久草视频| 精品美女久久久| 在线观看免费91| 亚洲一区国产| 天天干天天曰天天操| 久久久久久一二三区| 成年人一级黄色片| 色天天综合久久久久综合片| www.黄色av| 神马国产精品影院av| 亚洲色图狠狠干| 日本道在线观看一区二区| 国产麻豆一精品一男同| 精品中文字幕久久久久久| 成人在线观看亚洲| 久久女人天堂| 国产成人av网| av成人资源网| 亚洲精品电影在线一区| 国产精品久久久久久久久久妞妞 | 一二三四视频在线中文| 成人黄色片在线| 亚洲欧洲美洲国产香蕉| 国产午夜精品视频一区二区三区| 日韩电影免费在线观看网站| 天天躁日日躁狠狠躁av麻豆男男| 中文字幕亚洲精品在线观看| 日韩三级一区二区| 亚洲精品按摩视频| 日韩另类在线| 91精品视频免费观看| 日韩aaaa| 国产又大又黄又粗的视频| 91影院在线免费观看| 久久成人在线观看| 欧美一二区视频| 黄色动漫在线| 国产日产欧美精品| av一区二区高清| 毛片一区二区三区四区| 97se亚洲国产综合自在线| 精品午夜福利视频| 欧美成人一区二区三区片免费 | 99久久综合网| 亚洲欧美在线视频| 亚洲专区第一页| 色777狠狠综合秋免鲁丝| 欧美大片1688网站| 日韩中文一区二区三区| 日韩激情一二三区| 少妇人妻好深好紧精品无码| 色八戒一区二区三区| 九色视频在线播放| 国产精品久久久久久影视| 精品国产一区二区三区久久久蜜臀 | 在线视频中文字幕第一页| 91aaaa| 亚洲欧美伊人| 色欲欲www成人网站| 亚洲一卡二卡三卡四卡五卡| 日本免费不卡视频| 91精品国产99| 欧美日韩精品一区二区视频| 一区二区三区免费播放| 国产精品欧美一区二区三区| 91成品人影院| 欧美日韩福利视频| 久久夜色电影| 99久久激情视频| 国产精品网站在线观看| 97人妻精品一区二区三区软件| 久久中文字幕一区| aaa国产精品视频| 亚洲国产精品久久久久爰色欲| 国产亚洲1区2区3区| 亚洲一区二区色| 久久99精品久久久久久琪琪 | 精品一区二区电影| 日本欧美韩国| 男人的天堂视频在线| bt欧美亚洲午夜电影天堂| www.亚洲激情| 久久91超碰青草是什么| 日韩三级毛片| 91tv亚洲精品香蕉国产一区7ujn| 天堂在线一二区| 国产精品老牛影院在线观看| 亚洲精品久久| 日韩精品视频一区二区| 欧美在线免费视屏| 中文在线免费| 欧美一区二区三区四区五区六区| 九九精品视频在线看| 久久精品视频久久| 伊人青青综合网站| 亚洲精品在线a| 久久久国产欧美| 亚洲在线视频网站| yourporn在线观看中文站| 成人激情av| 日韩成人午夜电影| 精品一区二区三区四| 在线观看国产欧美| xxxx日韩| 中文字幕视频三区| 狠狠躁夜夜躁久久躁别揉| 97影院秋霞午夜在线观看| 欧美日韩日本网| 成人av电影在线观看| 一级黄色短视频| 欧美性在线观看| 国产一区二区三区四区老人| 国产熟女一区二区|