|
你是否常常被亂花漸欲迷人眼的推薦算法繞得如墜云中,覺得好像算法就是推薦系統(tǒng)的全部,哪怕就算不是全部,也肯定至少是個嫡生的長子。 然而,實際上工程實現(xiàn)才是推薦系統(tǒng)的骨架,如果沒有很好的軟件實現(xiàn),算法不能落地產(chǎn)生效果,產(chǎn)品不能順暢地服務用戶,不能順利地收集到用戶的反饋,更不能讓推薦系統(tǒng)往更好的方向進化。 一個好的推薦系統(tǒng)不僅僅是在線下模型評測指標多么好,也不僅僅是在某個時刻像是靈光乍現(xiàn)一樣擊中了用戶某個口味,而是隨著用戶的不斷使用,產(chǎn)品和用戶一起變好,產(chǎn)品背后的人得到進步,用戶也越來越喜歡產(chǎn)品。 雖然影響是否用戶產(chǎn)品的因素有很多很多,但是能否流暢地給用戶提供服務是一個最基本的標準。 更多推薦系統(tǒng)內(nèi)容,可訂閱極客時間熱門專欄 --- 資深算法專家刑無刀的《推薦系統(tǒng) 36 式》專欄,限時優(yōu)惠價¥58。他已經(jīng)系統(tǒng)深入地為你整理了推薦系統(tǒng)的相關知識和常識,部分文章還針對架構方面為你提供案例分析與解決方案,幫你解決系統(tǒng)起步階段 80% 的問題。 一個好的推薦系統(tǒng)架構應該具有這些特質:
本文中我要介紹一種符合經(jīng)典推薦系統(tǒng)的架構,它就是著名的流媒體 Netflix 的推薦系統(tǒng)架構。 通過這篇文章,我會為你介紹,實現(xiàn)一個簡化版的推薦系統(tǒng)架構應該至少包含哪些元素,同時,我會帶你一起總結出,一個經(jīng)典推薦系統(tǒng)架構應該有的樣子。 好了,廢話少說,我先上圖。下面這張圖就是 Netflix 的推薦系統(tǒng)架構圖。 我先整體看一下這個架構,一共分成三層:在線、近線、離線。 你是不是也發(fā)現(xiàn)似乎有一個不太熟識的詞出現(xiàn):近線。對,這個近線是通常不太提的一個概念,或者通常就把它歸入了在線的范疇。 實際上,可以這樣定義這三個層級:
我和大家一一詳細介紹每個部分。 1. 在線層 在線層的觸發(fā)時機是當用戶發(fā)出請求,也就是用戶進入一個推薦場景,推薦位等著展示推薦結果時,這個時候需要承擔責任就是在線層。在線層就是實時響應用戶請求。簡單說,在線層的特點就是“使用實時數(shù)據(jù),要保證實時服務”。 在線層的優(yōu)勢有:
在線層也有嚴格的制約:
2. 離線層 講完在線層,再來看看離線層。離線層就是躲在推薦系統(tǒng)的大后方,批量、周期性地執(zhí)行一些計算任務。其特點是“不用實時數(shù)據(jù),不提供實時服務”。 離線層的示意圖如下: 離線階段主要面對的數(shù)據(jù)源就是 Hadoop,實質上是 HDFS。收集到的所有日志都存在這里面,是一個全量的數(shù)據(jù)中心。 通過 Pig 或者 Hive 等工具,從全量日志中按照算法要求抽取出不同的數(shù)據(jù),再加上其他數(shù)據(jù)變成了不同算法所需的數(shù)據(jù)源。 在 Netflix 內(nèi)部,承擔這個管理任務的工具叫做 Hermes,類似 Kafka,但是又有不同的內(nèi)部工具。 離線階段有以下這么幾個好處:
當然壞處也是明顯的:
大多數(shù)推薦算法,實際上都是在離線階段產(chǎn)生推薦結果的。離線階段的推薦計算和模型訓練,如果要用分布式框架,通??梢赃x擇 Spark 等。 3. 近線層 最后,我來講講近線層。近線層的特點是“使用實時數(shù)據(jù),不保證實時服務”,這實在是一個很不講道理的計算層,因為把它的特點翻譯得直白點就是:喂給我最新鮮的牧草,但是我不保證能馬上給你擠奶。 雖然這看上去蠻不講理,但實際上這是一個非常重要的一層,它結合了離線層和在線層的好處,摒棄了兩者的不足。 近線層,也叫做準實時層,所謂“準實時”,就是接近實時,但不是真的實時。 從前面的架構圖中也可以看出,這一層的數(shù)據(jù)來源是實時的行為事件隊列,但是計算的結果并不是沿著輸入數(shù)據(jù)的方向原路返回,而是進入了在線數(shù)據(jù)庫中,得到用戶真正發(fā)起請求時,再提供服務。 Netflix 是為全球多個國家同時提供在線服務的,因此推薦系統(tǒng)的架構略微復雜。倘若你現(xiàn)在剛剛接手一個新產(chǎn)品,要從 0 開始搭建一個推薦系統(tǒng),那么可以以 Netflix 的架構作為藍本,做一定的簡化。 關鍵簡化有兩點:
其中第二點,在一個新產(chǎn)品的場景下, 當數(shù)據(jù)量還沒有那么大時,使用分布式存儲或者計算框架,非常不劃算。 如果性能不足,請升級單機配置。根據(jù)經(jīng)驗,一個幾千萬用戶,幾十萬到百萬的物品的協(xié)同過濾或者矩陣分解,如果充分發(fā)揮單機的性能,綜合效率會遠遠優(yōu)于在 Spark 上運行。 另外在一個推薦系統(tǒng)剛從 0 開始的階段,離線階段的算法也沒有那么多,很多情況甚至都只有協(xié)同過濾結果,這時候線上融合模型也不必那么復雜,一個簡單的加權融合就可以了,因此在線層也不必復雜。 本文我以 Netflix 架構為原型,向你介紹了一個經(jīng)典的推薦系統(tǒng)架構長什么樣子。關于這個架構你只需要記住一點:它有三層,三層分別是離線,近線,在線。 我用如下的表格將這三層綜合對比,并且簡單舉例,我們看看每一層分別放哪些任務。 以上就是對這個架構的宏觀總結對比。如前所說,其實架構都是進化出來的,你千萬不必在一開始就追求完美的架構,滿足最低要求就好。 |
|
|