php 實時更新內容_億級視頻內容如何實時更新?優酷視頻背后的技術揭秘

簡介: 優酷視頻內容數據天然呈現巨大的網絡結構,各類數據實體連接形成了數十億頂點和百億條邊的數據量,面對巨大的數據量,傳統關系型數據庫往往難以處理和管理,圖數據結構更加貼合優酷的業務場景,圖組織使用包括頂點和邊及豐富屬性圖來展現,隨著年輕化互動數據和內容數據結合,在更新場景形成單類型頂點達到日更新上億的消息量。本文將分享阿里文娛開發專家遨翔、玄甫在視頻內容實時更新上的實踐,從圖譜化的全新視角,重新組織內容數據的更新,詮釋圖譜化在業務更新場景的應用。

cdfa884f383a06a21a67f3aa26eaa347.png

一 背景

搜索推薦系統作為在線服務,為滿足在線查詢性能要求,需要將預查詢的數據構建為索引數據,推送到異構儲存介質中提供在線查詢。這個階段主要通過 Offline/Nearline 把實時實體、離線預處理、算法加工數據進行處理更新。這里包含了算法對這些數據離線和在線的處理,不同業務域之間最終數據合并(召回、排序、相關性等)。在平臺能力方面采用傳統的數倉模式即圍繞有共性資源、有共性能力方面建設,形成分層策略,將面向業務上層的數據獨立出來,而這種模式在實現業務敏捷迭代、知識化、服務化特征方面已不能很好滿足需求。

bdf69f23c6cbe81066603f2794ec0871.png

知識圖譜作為對數據進行結構化組織與體系化管理的核心技術,實際面向業務側應用過程中能很好的滿足知識化、業務化、服務化方面的訴求,基于內容圖譜體系的特征平臺建設,以內容(視頻、節目、用戶、人物、元素等)為中心,構建一個實時知識融合數據更新平臺。

二 設計概要

基于搜索推薦系統數據處理鏈路一般包括以下幾個步驟:從內容生產端(媒資、互動、內容智能、包羅、糧倉、琳瑯等)接收 dump 出來的全量數據和業務側增量數據,然后業務側拿到這些數據按業務域進行一層一層加工,最終通過 build 構建索引進入到引擎端。

不同于其它業務場景,在優酷場景中我們接收的內容生產端并不是源頭生產端,中間摻雜了很多半加工的異源異構數據,數據的一致性(邏輯一致性、功能一致性)是擺在用戶側實際性面臨問題,特別實時和全量產出的數據需要保持結構一致,同時搜索引擎的字段結構保持一致。我們從數據結構化組織與業務體系化管理方面進行索引平臺更新設計。

1 數據結構化組織

設計文娛大腦面向應用側的中間層,將知識圖譜引入中間層,實現了面向業務領域的數據組織方式。將知識圖譜融入在中間層數據模型這一層,用包含實體、關系、事件、標簽、指標的知識圖譜統一視圖來定義面向領域的數據模型。將視頻領域知識圖譜作為中間層數據組織的基礎,實現面向業務領域數據組織方式的轉變。

2 業務體系化管理

將算法的邏輯以組件化的模式進行封裝,實現了業務方只需要維護一套邏輯,實時和全量一套代碼,采用統一 UDF 來實現。利用 Blink 的流批一體化的架構,實現全增量架構模式,如在數據清洗訂正邏輯時進行全量(實時引擎中做到了消息不丟的機制保證,不需要每天實現全量),讓全量數據走一遍邏輯。

1eae76c40663cba644e0585f0e3c4170.png

三 關鍵模塊

1 特征庫

特征庫包含兩層:第一層是全增量一級特征計算,對接不同的數據源(包括實時和離線),在特征域計算中不存在離線全量,對于冷數據或修正數據采用存量的全集重新走一次流處理。數據組織儲存在頂點和邊關系表中。實時更新過程中為了減少對上游反查導致的性能壓力,不同實體屬性變更直接走內部圖查詢,統一封裝 DataAPI 對這些數據進行操作,不同類型頂點采用獨立 blinkjob 進行計算。

離線數據組織方面,由于搜索引擎在線服務的機器并不持久化數據。當新的在線機器加入集群時需要從某個地方拉取全量索引文件進行數據裝載,我們組裝一個和索引模型一樣全量文件。全量文件只是某一個時間戳的快照,全量文件時間戳越早需要追的實時消息就越多,故障的恢復速度就越慢,需要有一個機制盡量及時產出最新全量文件,減少實時增量消息帶來的性能壓力。

二級特征計算,面向算法的接入,包含了搜索的相關性、排序、召回這層直接面向業務域,它直接消費一級特征庫中的數據,業務主要邏輯集中到這層進行計算,此時實時離線邏輯主要通過組件庫來完成。

2 組件庫

不同業務線算法按各自業務從同一份數據中獲取自身需要的數據進行處理加工,無形中就導致代碼的重復。組件庫建立主要開放適配接口,讓相同功能代碼得以復用,減少重復開發。

組件庫將業務邏輯抽象成簡單的基于 UDF 的算術表達式來組織,簡單、簡潔,并且更易維護,特征使用方,只需關注特征粒度,不需要關注整體。

3 Trace&Debug 模塊

每一個消息有唯一簽名(uuid),源頭數據會在各個計算流程中流轉,處理過程中為了便于業務更好追蹤處理流程問題,將不同系統數據按 uuid 和實體 id 進行聚合,通過 Trace&Debug 服務能較好理解業務處理過程信息和系統處理信息。

b85addc94dd20735e2c8c500424b8f01.png
ba6ff453274e2343c5586c6be9b2c841.png

四 技術細節

整體計算框架采用新一代的實時計算引擎 Blink,主要優勢在于流批一體化,業務模塊通過 job 切分,不同的計算模塊可以隨意組合;消費位點自動保存,消息不丟失,進程 failover 自動恢復機制;分布式的計算可消除單點消費源和寫入性能瓶頸問題。儲存引擎采用 Lindorm 進行實體數據儲存,主要利用 Lindorm 二級索引來儲存 KV 和 KKV 數據結構,用于構建知識圖譜的底層數據。

1 知識圖譜儲存和組織

采用標簽屬性圖(Labeled Property Graph,LPG)建模,Lindorm 作為主儲存,實體表(視頻、節目、人物等)作為頂點表,實體間關系利用 lindorm 的二級索引能力作為邊表。

數據訪問方面,實現數據驅動層,提供給外部使用接口 API,開發人員通過本地 API 來操縱 Lindorm。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理,屏蔽了 java 代碼屬性和 Lindorm 列值的轉換以及結果查詢的取值映射,使用注解用于配置和原始映射,解決 java 對象直接序列化到 Lindorm 的行列儲存問題。

d73060d0369dead30bc31cdd4c86670a.png

2 計算和更新策略

采用 Blink 計算平臺實現特征計算和索引更新,由于采用了全增量架構,在全量更新過程減少上游服務反查的壓力,采用列更新策略。在不同實體屬性或邊表屬性(邊表屬性為了減少圖查詢過程中頂點查詢的壓力開銷)更新采用級聯更新策略,即屬性更新后生成新的消息推送到總線鏈路端,不同實體或關系訂閱消息后按需進行自身屬性更新。

更新一個業務核心訴求就是一致性,其本質就是不丟消息和保序,我們采用 MetaQ 作為主消息管道,本身具備不丟消息,更多是在外部服務、儲存、處理鏈路層面上失敗情況。

對于一個實體數據或關系數據(通常一個 job),采用原子操作,內部有一定的重試機制,如訪問外部服務,自身會有重試機制,這種重試為了不影響整體的鏈路性能我們稱作 Fast try,一般應對網絡抖動如超時等情況,如果失敗會保留一定現場,將數據寫入重試隊列中,拋出異常由最外層捕獲異常,丟棄本次更新接受下一個消息,失敗的消息會在 5 分鐘、10 分鐘,20 分鐘去重試 3 次如果依然失敗則發出通知人為干預。

3 統一 UDF

采用核心解決 UDF 的業務邏輯,在各個系統之間的可移植,通過技術手段保證只維護一套業務邏輯,各個計算平臺(離線/實時)可復用,解決 UDF 業務邏輯的一致性和可移植性問題。

371cd68b65d9442dee536c7164b8907c.png

五 總結 & 展望

基于內容圖譜結構化特征與索引更新平臺,在結構化方面打破傳統的數倉建模方式,以知識化、業務化、服務化為視角進行數據平臺化建設,來沉淀內容、行為、關系圖譜,目前在優酷搜索、票票、大麥等場景開始進行應用。

隨著圖神經網絡、表征學習方面不斷的發展,進一步在圖存儲和圖計算在面向 OLTP 和 OLAP 進行著重深度優化,通過深度算法策略來補充實時融合和實時推理方面的建設。

在索引更新平臺建設方面,隨著多方業務的接入、搜推融合帶來的挑戰,索引更新朝向全增量化的進行推進,在業務自助方面,進一步探索抽象 DSL,提升業務整體接入效率。

來源:阿里云開發者社區

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394097.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ios集成firebase_如何使用Firebase將Google Login集成到Ionic應用程序中

ios集成firebaseby Ryan Gordon通過瑞安戈登(Ryan Gordon) 如何使用Firebase將Google Login集成到Ionic應用程序中 (How to integrate Google Login into an Ionic app with Firebase) A lot of apps these days need to maintain some form of user authentication. This hel…

面向對象三大核心特點,封裝、繼承和多態

封裝 封裝其實是一種思想,將事物狀態和功能裝進一個容器,那么這個容器在python中就是類,由這個類產生的對象都擁有類的屬性和功能 在面向對象的思想中,推崇將具有某些共同特征的事物歸為一類,那么這些事物就可以看做是…

java編寫某計算器控制臺程序_用java程序編寫一個計算器

點擊查看用java程序編寫一個計算器具體信息答:給你一個參考,希望不要被百度吞了當晚餐 import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.text.Decimal…

物聯網商機迸發 LPWAN芯片現身 本文轉自d1net(轉載)

聯發科技發表首款NB-IoT系統單芯片MT2625。來源:MediaTeK 物聯網(IoT)帶動的龐大商機吸引各方業者積極投入,尤其是各種聯網技術不斷現身,爭奪各式各樣極富發展潛力的應用領域。 根據IDC的調查報告,物聯網市場在2017年聲勢看漲&…

jquery之stop()的用法

工作中遇到過的實際案例: 1、我在項目里做的一個下拉菜單,當鼠標移上去的時候就菜單顯示,當鼠標離開的時候菜單隱藏 如果我快速不斷地將鼠標移入移出菜單(即,當菜單下拉動畫未完成時,鼠標又移出了菜單&…

leetcode1123. 最深葉節點的最近公共祖先(dfs)

給你一個有根節點的二叉樹,找到它最深的葉節點的最近公共祖先。 回想一下: 葉節點 是二叉樹中沒有子節點的節點 樹的根節點的 深度 為 0,如果某一節點的深度為 d,那它的子節點的深度就是 d1 如果我們假定 A 是一組節點 S 的 最近…

sed空格替換成回車_【一題試水平】 利用sed命令將test.txt中所有的回車替換成空格?...

題目背景,這個題也很有年頭了,看似簡單,實則坑很大,good luck! 先不要看答案 看看自己能寫出多少方法.方法1 把每一行內容追加到Hold Space中,最后1行弄回到Pattern space中.然后進行替換基礎版[rootoldboyedu-show01 …

github 和git_學習編碼時如何學習Git和GitHub

github 和gitby Iago Rodrigues通過Iago Rodrigues 學習編碼時如何學習Git和GitHub (How you can learn Git and GitHub while you’re learning to code) In this article, I’ll give you some hints about how to become a Git/GitHub ninja. Also, as a bonus, I’ll show…

015_ICMP專項研究監控

一、數據demo cat /proc/net/snmp Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates …

leetcode129. 求根到葉子節點數字之和(dfs)

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。例如,從根到葉子節點路徑 1->2->3 代表數字 123。計算從根到葉子節點生成的所有數字之和。說明: 葉子節點是指沒有子節點的節點。示例 1:輸…

java for i i 區別,i ++amp;和i ++之間的區別是什么? ++我在for循環(Java)?

hello, Ive just started learning Java and now Im into for loop statement. I dont understand how i i works in a for loop statement.I mean how they work in mathematics operations like addition and subtraction. I hope some one will explain this to me.解決方案…

php 設置中文 cookie, js獲取

參考鏈接:http://www.nowamagic.net/librarys/veda/detail/1271 http://www.ruanyifeng.com/blog/2008/06/base64.html cookie.js 文件 var Cookies {}; /** * 設置Cookies */ Cookies.set function(name, value){ var argv arguments; var argc arguments.length; var exp…

學會這二十個正則表達式,能讓你少些1000行代碼!

正則表達式,是一個強大且高效的文本處理工具。通常情況下,通過一段表達準確的表達式,能夠非常簡短、快速的實現復雜業務邏輯。因此,正則表達式通常是一個成熟開發人員的標配,可以輔助實現開發效率的極強提升。在需要實…

mergesort_Mergesort算法的功能方法

mergesortby Joe Chasinga通過喬查辛加(Joe Chasinga) Mergesort算法的功能方法 (A functional approach to mergesort algorithm) Algorithms are often difficult for people to understand. I believe that this is because they are most often programmed or explained i…

循環內部異步函數處理相關問題解析

需求分析:根據一級標題ID篩選出所有對應的二級標題,返回一級標題ID,標題名和二級標題ID,標題名組成的數組 問題:通過forEach遍歷所有一級標題取對應的ID,根據ID條件查找所有的二級標題,遍歷符合…

nacos怎么修改服務分組_Nacos(六):多環境下如何“管理”及“隔離”配置和服務...

前言前景回顧:現如今,在微服務體系中,一個系統往往被拆分為多個服務,每個服務都有自己的配置文件,然后每個系統往往還會準備開發環境、測試環境、正式環境我們來說算一算,假設某系統有10個微服務&#xff0…

Hive_Hive的數據模型_內部表

Hive的數據模型_內部表 - 與數據庫中的Table在概念上是類似。- 每一個Table在Hive中都有一個相應的目錄存儲數據。- 所有的Table數據(不包括External Table)都保存在這個目錄中。 create table t1 (tid int, tname string, age int);create table t2 (tid int, tname string, a…

為啥JAVA虛擬機不開發系統_理解Java虛擬機體系結構

1 概述眾所周知,Java支持平臺無關性、安全性和網絡移動性。而Java平臺由Java虛擬機和Java核心類所構成,它為純Java程序提供了統一的編程接口,而不管下層操作系統是什么。正是得益于Java虛擬機,它號稱的“一次編譯,到處…

Android WindowManager和WindowManager.LayoutParams的使用以及實現懸浮窗口的方法

1.理清概念 我們使用過Dialog和PopupWindow,還有Toast,它們都顯示在Activity之上。那么我們首先需要理解的是android中是如何去繪制這些UI的呢?這里我只講我所理解的,首先看一層次圖(盜用網絡)首先我們看到左邊的Activity層&#…

leetcode面試題 04.03. 特定深度節點鏈表(bfs)

給定一棵二叉樹,設計一個算法,創建含有某一深度上所有節點的鏈表(比如,若一棵樹的深度為 D,則會創建出 D 個鏈表)。返回一個包含所有深度的鏈表的數組。示例:輸入:[1,2,3,4,5,null,7…