大家下午好,我是芒果TM的數(shù)據(jù)負(fù)責(zé)人,我主要是負(fù)責(zé)數(shù)據(jù)平臺(tái),今天主要是和大家分享一下是怎么樣解決數(shù)據(jù)采購(gòu)的。首先我介紹一下我們這個(gè)團(tuán)隊(duì),我們這個(gè)團(tuán)隊(duì)是從去年開(kāi)始籌建的,經(jīng)過(guò)了8個(gè)月的發(fā)展,目前是10個(gè)人,現(xiàn)在差不多是有150多個(gè)結(jié)點(diǎn),提供了一個(gè)150多臺(tái)結(jié)點(diǎn),通過(guò)1.5PB左右的數(shù)據(jù),有三個(gè)業(yè)務(wù)系統(tǒng),一個(gè)是一個(gè)是數(shù)據(jù)魔方,主要是一些指標(biāo)的統(tǒng)計(jì)。第二個(gè)是推薦系統(tǒng),今天上午愛(ài)奇藝的也說(shuō)過(guò)了,我們?nèi)绾伟岩恍┝髁哭D(zhuǎn)化出來(lái),可能需要一些引導(dǎo)性的東西,推薦系統(tǒng)是不錯(cuò)的選擇,最后是視頻內(nèi)部的分析系統(tǒng),很多互聯(lián)網(wǎng)的數(shù)據(jù)可以轉(zhuǎn)化成傳統(tǒng)的媒體需要的數(shù)據(jù),我們會(huì)把一些用戶的記錄,可以提供給導(dǎo)演選擇一些精采的片子和劇情的發(fā)展。
我們現(xiàn)在數(shù)據(jù)的部門,支撐了70%-80%左右的數(shù)據(jù)業(yè)務(wù)。然后今天主要是說(shuō)的分了三塊,一塊是基礎(chǔ)篇,一塊是整合篇,最后是數(shù)據(jù)管理篇?;A(chǔ)建設(shè)主要是分了采集,為什么要單獨(dú)的說(shuō)一下采集,在做大數(shù)據(jù)的過(guò)程中,數(shù)據(jù)的準(zhǔn)確性是非常的重要的,采集是數(shù)據(jù)的生產(chǎn)方,決定了數(shù)據(jù)是否可用,這一塊會(huì)單獨(dú)的說(shuō)一下,第二塊是搜集,我們會(huì)關(guān)注的一個(gè)帶寬的成本,我們做視頻的公司的會(huì)非常的敏感,視頻公司主要是版權(quán)和帶寬的成本。
如果搜集這一塊的帶寬很高的話,會(huì)帶來(lái)很大的支出,然后我們的整體架構(gòu)是這樣子的,前面的話,我們自己開(kāi)發(fā)了一個(gè)SDK,把數(shù)據(jù)采集到了以后,會(huì)發(fā)送到我們自己定義的系統(tǒng)上,會(huì)進(jìn)行一個(gè)匯聚,然后進(jìn)行分類,一塊發(fā)到FDS,一個(gè)是發(fā)到我們的隊(duì)列系統(tǒng),最終會(huì)轉(zhuǎn)化成數(shù)據(jù),形成數(shù)據(jù)倉(cāng)庫(kù)。
實(shí)時(shí)計(jì)算這一塊的話,主要是會(huì)計(jì)算一些播放過(guò)程中質(zhì)量的監(jiān)控,還有一塊,我們會(huì)到ES里面去,主要是做一些即時(shí)的查詢。首先看一下采集這一塊,可能大家看到了這個(gè)會(huì)比較熟悉,比如是上面列一個(gè)元素,然后吊一個(gè)方法,把所有的參數(shù)傳送給服務(wù)商,但是會(huì)有一個(gè)弊端,隨著采集點(diǎn)的增多,代碼需要維護(hù),第二個(gè)是沒(méi)有一個(gè)系統(tǒng)性。實(shí)際上我們對(duì)這一塊做了一些工作,主要是做了一個(gè)抽象,采集的過(guò)程中,我們會(huì)分為三大塊,一大塊是模板,我們采集的數(shù)據(jù)是可以進(jìn)行一個(gè)分類的。比如說(shuō)我們的頁(yè)面數(shù)據(jù)和播放數(shù)據(jù),以及錯(cuò)誤數(shù)據(jù)。
還有就是事件,事件是因?yàn)槭裁从|發(fā)。最后一塊是配置,我們多了一個(gè)類似阿里的一個(gè)東西,這一塊的話,主要是通過(guò)后端的配置,把一個(gè)元素的名稱和一個(gè)事件整合起來(lái),在頁(yè)面加載的時(shí)候,會(huì)把這一塊的配置加載到后端,后端會(huì)根據(jù)這些加載的配置來(lái)決定什么數(shù)據(jù)是需要上報(bào)的,什么是不需要上報(bào)的。
如果是我們需要一個(gè)很長(zhǎng)的開(kāi)發(fā)周期,使用這個(gè)模式的話,我們只要在后臺(tái)進(jìn)行一個(gè)配置,數(shù)據(jù)馬上就會(huì)上來(lái)了。搜集這一塊,一般我們采用的是放一個(gè)像素的圖片,把一些參數(shù)帶到這個(gè)圖片的后面,這個(gè)過(guò)程會(huì)造成帶款的成本非常的大。光是搜集帶寬會(huì)占到600兆左右。我們可以把服務(wù)器的資源降到極值,可以改為PT進(jìn)行篡數(shù),我們做了一個(gè)對(duì)比,可以看到不同的數(shù)量級(jí)下面,保持了一個(gè)比較平均的一個(gè)比例,我們使用PB的話,可以減少原有的三分之一的數(shù)量,為我們節(jié)省了差不多三分之二的帶寬的成本。
傳輸這一塊,剛才超哥已經(jīng)介紹過(guò)了。這一塊的話,使用插片式的方式開(kāi)發(fā),可以很好的實(shí)現(xiàn)自己的利益。在使用的過(guò)程中,我們會(huì)踩到一些坑,最重要的是占用的資源是非常大的。實(shí)際上我們對(duì)每一塊進(jìn)行一個(gè)具體的分析,也不難解決這一塊的問(wèn)題,在數(shù)據(jù)量大的時(shí)候,會(huì)存在一些數(shù)據(jù)的情況。一個(gè)主要的特點(diǎn)每隔一段時(shí)間會(huì)建一個(gè)文件夾,實(shí)際上我們?cè)谇懊孀鑫募臅r(shí)候,遠(yuǎn)遠(yuǎn)的會(huì)超于這個(gè)時(shí)間,所以我們會(huì)把這一塊進(jìn)行一個(gè)調(diào)整。另外的話,使用了一個(gè)單線層的方式。最后一塊是做了一個(gè)很不錯(cuò)的優(yōu)化,到了1.5,1.6以后,會(huì)直接導(dǎo)致系統(tǒng)的內(nèi)存這一塊的資源膨脹的比較厲害,所以我們對(duì)這一塊有二種的解決方式,一種是會(huì)加一條配置的參數(shù),第二條可以直接把位置去進(jìn)行改掉。
一般是在類型和文件之間選擇,主要是一個(gè)效率高的問(wèn)題,這個(gè)之前,網(wǎng)上也有人提出了比較有效的解決方案,把這二者綜合,在數(shù)據(jù)量高的情況下,使用文件。最后一塊比如是在寫(xiě)FTX的時(shí)候,會(huì)導(dǎo)致文件關(guān)閉的狀態(tài),會(huì)導(dǎo)致我們的錯(cuò)誤會(huì)失敗,我們需要對(duì)這一塊進(jìn)行一些監(jiān)控。另外一塊的話,可能會(huì)產(chǎn)生很多的小的文件,會(huì)造成比較大的壓力,所以根據(jù)自己的業(yè)務(wù)來(lái)調(diào)整,選擇合適的文件的大小,這樣子可以減少很多小的文件。最后一塊的話,因?yàn)榇髷?shù)據(jù),數(shù)據(jù)量肯定是很大的,在網(wǎng)絡(luò)的傳輸過(guò)程中,我們也需要進(jìn)行壓縮,實(shí)際上我們使用的壓縮的方式,這一塊差不多可以壓縮80%的數(shù)據(jù)量。
隊(duì)列傳輸這一塊,我們主要是用的Kafka。我們總結(jié)的經(jīng)驗(yàn)是這樣子的,并不是所有的分區(qū)越多越好。其實(shí)我們的分區(qū)越多的話,客戶端和服務(wù)端所使用的限制內(nèi)存也就越多,一個(gè)分區(qū)會(huì)產(chǎn)生二個(gè)文件,這二個(gè)文件會(huì)導(dǎo)致具體的數(shù)會(huì)增加,最后一塊是因?yàn)镵afka的機(jī)制所導(dǎo)致的,如果是分區(qū)數(shù)過(guò)多的話,Kafka里面有一個(gè)頁(yè)的分區(qū),會(huì)產(chǎn)生投票的過(guò)程,分區(qū)數(shù)越多的話,使用的時(shí)間越漫長(zhǎng),也會(huì)影響使用。
我們會(huì)選擇一臺(tái)機(jī)器,只創(chuàng)建一個(gè)分區(qū),然后測(cè)生產(chǎn)和消費(fèi)這二邊分別是怎么樣的,我們最關(guān)心的是吞吐量,所以TP和TC的最大值可以做我們的分區(qū)數(shù)。
然后是存儲(chǔ)這一塊往往我們說(shuō)的存儲(chǔ)會(huì)比較籠統(tǒng),我們采用的方案是多級(jí)存儲(chǔ)的方式。那就會(huì)有一個(gè)問(wèn)題,當(dāng)數(shù)據(jù)量增加的時(shí)候,會(huì)有很多的冷數(shù)據(jù)在那里,工作的壓力會(huì)比較大,我去計(jì)算的時(shí)候,這樣子會(huì)造成一些不必要的浪費(fèi),所以我們會(huì)分成三級(jí),主要的特點(diǎn)是CPU和內(nèi)存會(huì)比較豐富一點(diǎn),第二個(gè)是少?gòu)?fù)本,這樣子的話,我們可能只需要二個(gè)復(fù)本,最后一塊是冷數(shù)據(jù),這樣子的話,實(shí)際成本會(huì)比我們之前的集群多很多。最終會(huì)把一些冷數(shù)據(jù)丟到云存儲(chǔ)上面去。
那存儲(chǔ)這一塊,另外關(guān)心的問(wèn)題就是壓縮的問(wèn)題,存儲(chǔ)這一塊空間是一個(gè)很重要的問(wèn)題,我們?cè)谧龅倪^(guò)程中,我們也發(fā)現(xiàn)了這個(gè)問(wèn)題,往往我們前期沒(méi)有規(guī)劃好的時(shí)候,我們會(huì)發(fā)現(xiàn)存儲(chǔ)的空間已經(jīng)不夠用了,我們可能需要對(duì)存儲(chǔ)進(jìn)行一些壓縮,這一塊的話,我們需要根據(jù)自己的業(yè)務(wù)去選擇。使用日志歸檔對(duì)小文件進(jìn)整理。
計(jì)算這一塊的話,因?yàn)槎际潜容^成熟的。象離線計(jì)算這一塊的話,有二個(gè)比較需要關(guān)注的點(diǎn),一個(gè)是資源分配這一塊,最多的一塊是隊(duì)列這一塊,需要特別的做一些信心的工作,這一塊的話,有二塊,一個(gè)是二分之一CPU,摸索的是按照1核來(lái)使用的,很多的業(yè)務(wù)我們并不需要CPU這么的值,我們可以選擇二分之一的CPU,可以滿足使用內(nèi)存量比較大的業(yè)務(wù)。
另外是實(shí)時(shí)計(jì)算這一塊,我們是采用的Starm的方式,我們要做一個(gè)數(shù)據(jù)平臺(tái)的話,主要是控制和資源管理,Starm是不顯示這一塊的工作的,通過(guò)這一塊可以進(jìn)行一些管理的操作,包括一些日志的圖表的顯示,根據(jù)圖表來(lái)分析我們Starm上的運(yùn)行的情況。
即時(shí)查詢這一塊,主要是和我們的技術(shù)人員比較相關(guān)一點(diǎn),因?yàn)槲覀兘?jīng)常在開(kāi)發(fā)的過(guò)程中,經(jīng)常會(huì)報(bào)錯(cuò),實(shí)際上我們是需要一個(gè)比較好的產(chǎn)品平臺(tái)的。這塊的話,我們使用的是我們自己開(kāi)發(fā)的Dek,可以做一個(gè)索引的程序。在索引的過(guò)程中,我們盡量的把復(fù)復(fù)本和falsh關(guān)掉。接下來(lái)從它的的索引的協(xié)議上做一些工作,大部分的選擇索引的過(guò)程中,如果是在我們網(wǎng)絡(luò)允許,或者是在比較好的情況下,可以嘗試一下TCP。
如果我們單從文本上做歸類的話,會(huì)導(dǎo)致內(nèi)存缺失的情況,所以我們會(huì)形成一些數(shù)字型的工作,最后是要做一個(gè)比較相對(duì)開(kāi)放的平臺(tái),這一塊是必須要做的。否則的話,別人就會(huì)干掉另外一塊的索引。我們現(xiàn)在每天的索引是30TB的數(shù)據(jù)。
組建的整合,這個(gè)和我們公司的業(yè)務(wù)會(huì)比較相關(guān),在業(yè)務(wù)的過(guò)程中,這個(gè)數(shù)字會(huì)非常的難看,而且會(huì)產(chǎn)生商務(wù)上的一些糾紛。我們需要把這些配置進(jìn)行一個(gè)統(tǒng)一的管理。接下來(lái)就是一些權(quán)限的管理。
其實(shí)配置這一塊的話,我們主要是把配置整合起來(lái),進(jìn)行推送的工作,主要是機(jī)遇RPC的控制模型,對(duì)所有的組建進(jìn)行全員的控制。我們的數(shù)據(jù)服務(wù)平臺(tái)需要支持公司很多的業(yè)務(wù)線,他們只需要一個(gè)帳號(hào)就可以進(jìn)行我們的采集服務(wù)機(jī)數(shù)據(jù)傳輸服務(wù),實(shí)時(shí)計(jì)算服務(wù),我們也可以提供資源流量監(jiān)控的服務(wù),包括提供資源使用的菜單。
接下來(lái)的話,主要是說(shuō)一下如何管理平臺(tái)上的一些數(shù)據(jù)。主要是幾塊,一個(gè)是日志種類抽象,這個(gè)其實(shí)是和公司的業(yè)務(wù)會(huì)息息相關(guān),我們這一塊的話,分了播放類的日志,廣告類的日志,為什么需要指標(biāo)定義單獨(dú)的拿出來(lái)說(shuō)一下,有一個(gè)特別有意思的地方,在芒果TV,更關(guān)心的是VV,TV,PV這些核心的指標(biāo),但是如果是我們計(jì)算的指標(biāo)的方式和愛(ài)奇藝的不一樣,這個(gè)數(shù)據(jù)在行業(yè)內(nèi)是沒(méi)有一個(gè)可對(duì)比性的,所以會(huì)從幾個(gè)方面去定義,一個(gè)是它的概念,運(yùn)用的常理是怎么樣的,是怎么樣上報(bào)的,會(huì)導(dǎo)致數(shù)據(jù)統(tǒng)計(jì)出來(lái)的結(jié)果,可能會(huì)千差萬(wàn)別。
最后是上報(bào)內(nèi)容和計(jì)算公式。數(shù)據(jù)到了平臺(tái)以后,最重要的是對(duì)數(shù)據(jù)進(jìn)行管理,為什么會(huì)要做一些管理,其實(shí)為了把這些數(shù)據(jù)進(jìn)行一些分門別類,我們所產(chǎn)生的就是主題式的管理,某一個(gè)點(diǎn)為核心,你必須關(guān)注哪一些方面,我們會(huì)分為幾類,這個(gè)和我們的日志抽象會(huì)非常的相同。數(shù)據(jù)倉(cāng)庫(kù)只是一個(gè)數(shù)據(jù)結(jié)合的地方,但是數(shù)據(jù)倉(cāng)庫(kù)的價(jià)值需要上層利用做一些工作。
這一塊的話,主要是數(shù)據(jù)的管理,數(shù)據(jù)倉(cāng)庫(kù)建立以后,別人要使用你倉(cāng)庫(kù)的數(shù)據(jù),需要一個(gè)明細(xì),我們需要做一個(gè)數(shù)據(jù)的數(shù)據(jù),這個(gè)原數(shù)據(jù)分了二類,一類是技術(shù)性的原數(shù)據(jù),主要是給我們的技術(shù)開(kāi)發(fā)人員使用的,包括了一些倉(cāng)庫(kù)的結(jié)構(gòu),就是我們是怎么從原始性抽取的一些規(guī)則,這個(gè)是需要從公司出來(lái)的,不然的話,數(shù)據(jù)沒(méi)有質(zhì)量可言。
最后為什么要做數(shù)據(jù)集市,在這個(gè)過(guò)程中,每一個(gè)公司會(huì)有多個(gè)業(yè)務(wù)部門,每一個(gè)業(yè)務(wù)部門的話,所面臨的是不一樣的,比如是從統(tǒng)計(jì)的角度,會(huì)更關(guān)注數(shù)據(jù),分析的話,有分析的角度,但是這樣子的話,數(shù)據(jù)倉(cāng)庫(kù)沒(méi)有辦法穩(wěn)定,需要數(shù)據(jù)集市進(jìn)行隔離,在這個(gè)過(guò)程中,我們可以把一些數(shù)據(jù)抽出來(lái)進(jìn)行一些隊(duì)列,放到我們的關(guān)系成本里面,這些集市之間的結(jié)果是可以進(jìn)行分享和交換的,有利于數(shù)據(jù)的共享,更重要的是在于事實(shí)表和維表的管理和維護(hù),這樣子有利于數(shù)字隊(duì)列的操作,謝謝我就說(shuō)這些。