前言
這個(gè)月做的事情還是蠻多的。上線了一個(gè)百臺(tái)規(guī)模的ES集群,還設(shè)計(jì)開發(fā)了一套實(shí)時(shí)推薦系統(tǒng)。 標(biāo)題有點(diǎn)長(zhǎng),其實(shí)是為了突出該推薦系統(tǒng)的三個(gè)亮點(diǎn),一個(gè)是實(shí)時(shí),一個(gè)是基于用戶畫像去做的,一個(gè)是異步化。
實(shí)時(shí)主要體現(xiàn)在三個(gè)層面:
用戶畫像中的的短期興趣模型實(shí)時(shí)構(gòu)建。
也就是你看完一個(gè)視頻,這個(gè)視頻幾秒內(nèi)就影響了你的短期興趣模型,并且反應(yīng)到你下次的推薦中。
候選集實(shí)時(shí)變更。
在我設(shè)計(jì)的推薦系統(tǒng)中,候選集的概念是不同類型的待推薦給用戶的視頻庫(kù),一個(gè)用戶并不能看到某個(gè)候選集的全部,而是能夠看到經(jīng)過(guò)匹配算法處理完后的候選集的一部分。 候選集的更新周期直接影響用戶能夠看到的視頻的實(shí)時(shí)性。候選集可以有很多,通過(guò)不同的候選集解決不同的推薦場(chǎng)景問題。比如結(jié)合最新候選集和最近N小時(shí)最熱候選集,我們可以做到類似今日頭條的推薦效果。新內(nèi)容候選集的產(chǎn)生基本就是實(shí)時(shí)的,而最近N小時(shí)熱門視頻候選集則可能是分鐘級(jí)別就可以得到更新。還有比如協(xié)同就可以做視頻的相關(guān)推薦,而熱門候選集則可以從大家都關(guān)心的內(nèi)容里進(jìn)一步篩出用戶喜歡的內(nèi)容。
推薦效果指標(biāo)的實(shí)時(shí)呈現(xiàn)。
上線后你看到的一些比較關(guān)鍵的指標(biāo)例如點(diǎn)擊轉(zhuǎn)化率,都可以在分鐘級(jí)別得到更新。推薦系統(tǒng)有個(gè)比較特殊的地方,就是好不好不是某個(gè)人說(shuō)了算,而是通過(guò)一些指標(biāo)來(lái)衡量的。比如點(diǎn)擊轉(zhuǎn)化率。
用戶畫像和視頻畫像
用戶畫像則體現(xiàn)在興趣模型上。通過(guò)構(gòu)建用戶的長(zhǎng)期興趣模型和短期興趣模型可以很好的滿足用戶興趣愛好以及在用戶會(huì)話期間的需求。做推薦的方式可以很多,比如協(xié)同,比如各種小trick,而基于用戶畫像和視頻畫像,起步難度會(huì)較大,但是從長(zhǎng)遠(yuǎn)角度可以促進(jìn)團(tuán)隊(duì)對(duì)用戶和視頻的了解,并且能夠支撐推薦以外的業(yè)務(wù)。
異步化
推薦的計(jì)算由用戶刷新行為觸發(fā),然后將用戶信息異步發(fā)送到Kafka,接著Spark Streaming程序會(huì)消費(fèi)并且將候選集和用戶進(jìn)行匹配計(jì)算,計(jì)算結(jié)果會(huì)發(fā)送到Redis 的用戶私有隊(duì)列。接口服務(wù)只負(fù)責(zé)取推薦數(shù)據(jù)和發(fā)送用戶刷新動(dòng)作。新用戶或者很久沒有過(guò)來(lái)的用戶,它的私有隊(duì)列可能已經(jīng)過(guò)期,這個(gè)時(shí)候異步會(huì)產(chǎn)生問題。前端接口一旦發(fā)現(xiàn)這個(gè)問題,有兩種解決方案:
- 會(huì)發(fā)送一個(gè)特殊的消息(后端接的是Storm集群), 接著hold住,等待異步計(jì)算結(jié)果
- 自己獲取用戶興趣標(biāo)簽,會(huì)按一定的規(guī)則分別找協(xié)同,然后到ES檢索,填充私有隊(duì)列,并迅速給出結(jié)果。(我們采用的方案)
除了新用戶,這種情況總體是少數(shù)。大部分計(jì)算都會(huì)被異步計(jì)算cover住。
流式技術(shù)對(duì)推薦系統(tǒng)的影響
我之前寫了很多文章鼓吹流式技術(shù),最露骨的比如 數(shù)據(jù)天生就是流式的。 當(dāng)然主要和我這一兩年部門的工作主體是構(gòu)建
流式流水線(Pipline),解決實(shí)時(shí)日志計(jì)費(fèi)等相關(guān)問題。流式計(jì)算對(duì)推薦系統(tǒng)的影響很大,可以完全實(shí)現(xiàn)
在推薦系統(tǒng)中,除了接口服務(wù)外,其他所有計(jì)算相關(guān)的,包括但不限于:
- 新內(nèi)容預(yù)處理,如標(biāo)簽化,存儲(chǔ)到多個(gè)存儲(chǔ)器
- 用戶畫像構(gòu)建 如短期興趣模型
- 新熱數(shù)據(jù)候選集
- 短期協(xié)同
- 推薦效果評(píng)估指標(biāo)如點(diǎn)擊轉(zhuǎn)化率
這些流程都是采用Spark Streaming來(lái)完成。對(duì)于長(zhǎng)期協(xié)同(一天以上的數(shù)據(jù)),用戶長(zhǎng)期興趣模型等,則是采用Spark 批處理。因?yàn)椴捎昧薙treamingPro這個(gè)項(xiàng)目,可以做到所有計(jì)算流程配置化,你看到的就是一堆的描述文件,這些描述文件構(gòu)成了整個(gè)推薦系統(tǒng)的核心計(jì)算流程。
這里還值得提的三點(diǎn)是:
推薦效果評(píng)估,我們采用Spark Streaming + ElasticSearch的方案。也就是Spark Streaming 對(duì)上報(bào)的曝光點(diǎn)擊數(shù)據(jù)進(jìn)行預(yù)處理后存儲(chǔ)到ES,然后ES提供查詢接口供BI報(bào)表使用。這樣避免預(yù)先計(jì)算指標(biāo)導(dǎo)致很多指標(biāo)實(shí)現(xiàn)沒有考慮到而不斷變更流式計(jì)算程序。
復(fù)用現(xiàn)有的大數(shù)據(jù)基礎(chǔ)設(shè)施。整個(gè)推薦系統(tǒng)只有對(duì)外提供API的服務(wù)是需要單獨(dú)部署的,其他所有計(jì)算都使用Spark跑在Hadoop集群上。
所有計(jì)算周期和計(jì)算資源都是可以方便調(diào)整的,甚至可以動(dòng)態(tài)調(diào)整(Spark Dynamic Resource Allocatioin)。這點(diǎn)非常重要,我完全可以放棄一定的實(shí)時(shí)性來(lái)節(jié)省資源或者在閑暇時(shí)讓出更多資源給離線任務(wù)。當(dāng)然這些都益于Spark 的支持。