整套解決方案:騰訊看點(diǎn)基于 Flink 的實(shí)時(shí)數倉及多維實(shí)時(shí)數據分析實(shí)踐
優(yōu)采云 發(fā)布時(shí)間: 2022-10-28 07:20整套解決方案:騰訊看點(diǎn)基于 Flink 的實(shí)時(shí)數倉及多維實(shí)時(shí)數據分析實(shí)踐
當業(yè)務(wù)發(fā)展到一定規模時(shí),實(shí)時(shí)數倉是必不可少的基礎服務(wù)。從數據驅動(dòng)的角度來(lái)看,多維實(shí)時(shí)數據分析系統的重要性不言而喻。但在數據量巨大的情況下,以騰訊為例,一天上報的數據量達到萬(wàn)億級規模,實(shí)現極低延遲的實(shí)時(shí)計算和亞秒級多維實(shí)時(shí)查詢(xún)。
本文將介紹騰訊看點(diǎn)實(shí)時(shí)數倉及多維實(shí)時(shí)數據分析系統在信息流場(chǎng)景下的技術(shù)架構。
1.可解決的痛點(diǎn)
我們先來(lái)看看多維實(shí)時(shí)數據分析系統能解決的痛點(diǎn)。例如:
2.研究
在進(jìn)行開(kāi)發(fā)之前,我們進(jìn)行了這些調查。
1、線(xiàn)下數據分析平臺能否滿(mǎn)足這些需求,結論是不能滿(mǎn)足。離線(xiàn)數據分析平臺不起作用的原因如下。
2.實(shí)時(shí)數據分析平臺,業(yè)務(wù)群提供準實(shí)時(shí)數據查詢(xún)功能。底層技術(shù)采用Kudu+Impala,雖然Impala是MPP架構的大數據計算引擎,接入Kudu,數據以列格式存儲。但是對于實(shí)時(shí)數據分析場(chǎng)景,查詢(xún)響應速度和數據延遲還是比較高的。查詢(xún)一個(gè)實(shí)時(shí) DAU 并返回結果至少需要幾分鐘,無(wú)法提供良好的交互用戶(hù)體驗。因此,通用大數據處理框架(Kudu+Impala)的速度優(yōu)勢要大于離線(xiàn)分析框架(Spark+Hdfs)。對于我們對實(shí)時(shí)性要求較高的場(chǎng)景,是無(wú)法滿(mǎn)足的。的。
三、項目背景
剛剛介紹完之后,我們再來(lái)看看我們項目的背景。作者發(fā)布的內容由內容中心介紹,內容審核鏈接后啟用或下架。啟用的內容交給推薦系統和操作系統,然后推薦系統和操作系統將內容分發(fā)到C端。內容分發(fā)給C端用戶(hù)后,用戶(hù)會(huì )有曝光、點(diǎn)擊、舉報等各種行為,并通過(guò)埋點(diǎn)舉報實(shí)時(shí)接入消息隊列。接下來(lái)我們做了兩個(gè)部分的工作,也就是圖中有顏色的兩個(gè)部分。
為什么要建實(shí)時(shí)數倉,因為原創(chuàng )上報的數據量非常大,一天的高峰就有上萬(wàn)億的上報。報告格式令人困惑。缺乏內容維度信息和用戶(hù)畫(huà)像信息,下游無(wú)法直接使用。我們提供的實(shí)時(shí)數倉基于騰訊手表信息流的業(yè)務(wù)場(chǎng)景,進(jìn)行內容維度的關(guān)聯(lián)、用戶(hù)畫(huà)像的關(guān)聯(lián)、各種粒度的聚合。下游可以很方便地使用實(shí)時(shí)數據。
4、方案選擇
再來(lái)看看我們的多維實(shí)時(shí)數據分析系統的方案選擇。我們對比了業(yè)界領(lǐng)先的解決方案,選擇了最適合我們業(yè)務(wù)場(chǎng)景的解決方案。
五、設計目標和設計難點(diǎn)
我們的多維實(shí)時(shí)數據分析系統分為三個(gè)模塊
實(shí)時(shí)計算引擎 實(shí)時(shí)存儲引擎 應用層
主要難點(diǎn)在于前兩個(gè)模塊:實(shí)時(shí)計算引擎和實(shí)時(shí)存儲引擎。
如何實(shí)時(shí)訪(fǎng)問(wèn)數千萬(wàn)/秒的海量數據并進(jìn)行極低延遲的維表關(guān)聯(lián)。實(shí)時(shí)存儲引擎很難支持高并發(fā)寫(xiě)入、高可用、分布式和高性能索引查詢(xún)。
對于這些模塊的具體實(shí)現,看一下我們系統的架構設計。
6.架構設計
前端使用開(kāi)源組件Ant Design,使用Nginx服務(wù)器將靜態(tài)頁(yè)面和反向代理瀏覽器請求部署到后端服務(wù)器。
后臺服務(wù)基于騰訊自研的RPC后臺服務(wù)框架編寫(xiě),會(huì )進(jìn)行一些二級緩存。
實(shí)時(shí)數倉部分分為接入層、實(shí)時(shí)計算層和實(shí)時(shí)數倉存儲層。
實(shí)時(shí)存儲部分分為實(shí)時(shí)寫(xiě)入層、OLAP存儲層和后臺接口層。
7.實(shí)時(shí)計算
該系統最復雜的兩個(gè)部分是實(shí)時(shí)計算和實(shí)時(shí)存儲。
先介紹一下實(shí)時(shí)計算部分:分為實(shí)時(shí)關(guān)聯(lián)和實(shí)時(shí)數倉。
7.1 實(shí)時(shí)高性能維表關(guān)聯(lián)
實(shí)時(shí)維表關(guān)聯(lián)的難點(diǎn)在于。百萬(wàn)級/秒的實(shí)時(shí)數據流,如果直接關(guān)聯(lián)HBase,1分鐘的數據關(guān)聯(lián)HBase需要幾個(gè)小時(shí),會(huì )造成嚴重的數據延遲。
我們提出了幾種解決方案:
可以看到,優(yōu)化前后,數據量從百億減少到數十億,耗時(shí)從幾小時(shí)減少到幾十秒,減少了99%。
7.2 下游服務(wù)提供
實(shí)時(shí)數倉的難點(diǎn)在于它是一個(gè)比較新的領(lǐng)域,各個(gè)公司的業(yè)務(wù)都有很大的差距。
我們先來(lái)看看實(shí)時(shí)數據倉庫是做什么的。實(shí)時(shí)數據倉庫只是幾個(gè)消息隊列。不同的消息隊列存儲不同聚合粒度的實(shí)時(shí)數據,包括內容ID、用戶(hù)ID、C端行為數據、B端內容。維度數據和用戶(hù)畫(huà)像數據等
我們構建實(shí)時(shí)數倉的方式是,上述實(shí)時(shí)計算引擎的輸出存儲在消息隊列中,可以提供給下游的多用戶(hù)復用。
我們可以看看在構建實(shí)時(shí)數據倉庫之前和之后開(kāi)發(fā)實(shí)時(shí)應用程序的區別。在沒(méi)有數據倉庫的情況下,我們需要先消費千萬(wàn)/s的原創(chuàng )隊列,進(jìn)行復雜的數據清洗,再進(jìn)行用戶(hù)畫(huà)像關(guān)聯(lián)和內容維度關(guān)聯(lián),獲取符合要求格式的實(shí)時(shí)數據,開(kāi)發(fā)和擴張的成本。會(huì )比較高。如果你想開(kāi)發(fā)一個(gè)新的應用程序,你必須再次經(jīng)歷這個(gè)過(guò)程。有了數據倉庫之后,如果要開(kāi)發(fā)內容ID粒度的實(shí)時(shí)應用,可以直接申請TPS級別為10000/s的DWS層的消息隊列。開(kāi)發(fā)成本更低,資源消耗更小,可擴展性更強。
讓我們舉一個(gè)實(shí)際的例子。為了開(kāi)發(fā)我們系統的實(shí)時(shí)數據屏幕,我們最初需要執行以上所有操作來(lái)獲取數據?,F在只需要消耗 DWS 層消息隊列,寫(xiě)一條 Flink SQL,只消耗 2 個(gè) CPU 核和 1G 內存。
可以看出,以50個(gè)消費者為例,在建立實(shí)時(shí)數倉前后,下游開(kāi)發(fā)一個(gè)實(shí)時(shí)應用可以減少98%的資源消耗。包括計算資源、存儲資源、人工成本和開(kāi)發(fā)者學(xué)習訪(fǎng)問(wèn)成本等。而且消費者越多,節省的越多。以 Redis 存儲為例,每月可節省數百萬(wàn)*敏*感*詞*。
8.實(shí)時(shí)存儲
介紹完實(shí)時(shí)計算,我們再來(lái)介紹實(shí)時(shí)存儲。
本節分為三個(gè)部分來(lái)介紹
8.1 分布式高可用性
我們這里聽(tīng)的是Clickhouse官方的建議,借助ZK實(shí)現高可用方案。數據寫(xiě)入一個(gè)shard,只寫(xiě)入一個(gè)副本,然后再寫(xiě)入ZK。ZK用來(lái)告訴同一個(gè)shard的其他副本,其他副本來(lái)拉數據,保證數據的一致性。
這里不使用消息隊列進(jìn)行數據同步,因為 ZK 更輕量級。并且在寫(xiě)入的時(shí)候,任意一個(gè)副本都被寫(xiě)入,其他副本都可以通過(guò)ZK獲得一致的數據。并且即使其他節點(diǎn)第一次獲取數據失敗,只要發(fā)現與ZK上記錄的數據不一致,就會(huì )再次嘗試獲取數據以保證一致性。
8.2 海量數據——寫(xiě)入
數據寫(xiě)入遇到的第一個(gè)問(wèn)題是,如果直接將海量數據寫(xiě)入Clickhouse,ZK的QPS會(huì )太高。解決辦法是使用Batch來(lái)寫(xiě)。批量設置有多大?如果batch太小,不會(huì )緩解ZK的壓力,batch也不宜太大,否則上游內存壓力太大。通過(guò)實(shí)驗,我們最終選擇了幾十萬(wàn)的batch。
第二個(gè)問(wèn)題是,隨著(zhù)數據量的增長(cháng),每天可能會(huì )有數百億的數據寫(xiě)入單個(gè)視點(diǎn)的視頻內容。默認的解決方案是寫(xiě)分布式表,這樣會(huì )導致單機磁盤(pán)瓶頸。,特別是Clickhouse的底層使用了Mergetree,原理類(lèi)似于HBase和RocketsDB的底層LSM-Tree。在合并的過(guò)程中,會(huì )出現寫(xiě)放大的問(wèn)題,會(huì )增加磁盤(pán)的壓力。峰值是每分鐘幾千萬(wàn)條數據,寫(xiě)入需要幾十秒。如果在做Merge,寫(xiě)請求會(huì )被阻塞,查詢(xún)會(huì )很慢。我們做了兩個(gè)優(yōu)化方案:一是在磁盤(pán)上做RAID,提高磁盤(pán)的IO;
第三個(gè)問(wèn)題,雖然我們的寫(xiě)法是按照shards來(lái)劃分的,但是這里介紹一個(gè)分布式系統中的一個(gè)常見(jiàn)問(wèn)題,就是本地Top不是全局Top。例如,相同內容ID的數據落在不同的分片上,計算全局Top100讀取的內容ID。有一個(gè)content ID在shard 1上是Top100,在其他shard上不是Top100,匯總時(shí)會(huì )丟失。影響最終結果的部分數據。我們做的優(yōu)化是在寫(xiě)之前加了一層路由,將所有具有相同content ID的記錄路由到同一個(gè)shard,解決了這個(gè)問(wèn)題。
寫(xiě)完介紹,接下來(lái)就是介紹Clickhouse的高性能存儲和查詢(xún)。
8.3 高性能-存儲-查詢(xún)
Clickhouse 的高性能查詢(xún)的一個(gè)關(guān)鍵點(diǎn)是稀疏索引。稀疏索引的設計非常講究。好的設計可以加快查詢(xún)速度,但不好的設計會(huì )影響查詢(xún)效率。我是基于我們的業(yè)務(wù)場(chǎng)景,因為我們的大部分查詢(xún)都是和時(shí)間和內容ID相關(guān)的,比如對于某個(gè)內容,在過(guò)去N分鐘內,它在各個(gè)人群中的表現如何?我有一個(gè)按日期、分鐘粒度時(shí)間和內容 ID 的稀疏索引。對于某個(gè)內容的查詢(xún),稀疏索引建立后,文件掃描可以減少99%。
另一個(gè)問(wèn)題是我們現在有太多的數據和太多的維度。以看點(diǎn)的視頻內容為例,每天有數百億的視頻,在某些維度上有上百個(gè)類(lèi)別。如果一次性預聚合所有維度,數據量會(huì )呈指數級增長(cháng),查詢(xún)速度會(huì )變慢,而且會(huì )占用大量?jì)却婵臻g。我們的優(yōu)化針對不同維度構建了相應的預聚合視圖,以空間換時(shí)間,可以縮短查詢(xún)時(shí)間。
分布式表查詢(xún)也存在問(wèn)題。查詢(xún)單個(gè)內容ID的信息,分布式表會(huì )將查詢(xún)發(fā)送到所有分片,然后返回查詢(xún)結果進(jìn)行匯總。事實(shí)上,因為路由,一個(gè)內容ID只存在于一個(gè)分片上,其余分片都是空的。對于這種查詢(xún),我們的優(yōu)化是按照相同的規則路由后臺,直接查詢(xún)目標shard,減少了N-1/N的負載,可以大大縮短查詢(xún)時(shí)間。并且因為我們提供OLAP查詢(xún),所以數據可以滿(mǎn)足最終的一致性,通過(guò)主從副本分離讀寫(xiě)可以進(jìn)一步提升性能。
我們還在后臺做了 1 分鐘的數據緩存。對于同一個(gè)查詢(xún),后臺會(huì )直接返回。
8.4 擴展
在這里,我們將介紹我們的擴張計劃,并調查一些業(yè)內常見(jiàn)的解決方案。
例如,在 HBase 中,原創(chuàng )數據存儲在 HDFS 中。擴容只是Region Server的擴容,不涉及原創(chuàng )數據的遷移。但是Clickhouse的各個(gè)分片數據都是本地的,屬于比較底層的存儲引擎,不能像HBase那樣容易擴展。
Redis 是一種類(lèi)似于一致性哈希的哈希槽,是比較經(jīng)典的分布式緩存方案。雖然在 Rehash 過(guò)程中 Redis slot 暫時(shí)不可用,但遷移一般比較方便,從原來(lái)的 h[0] 到 h[1],最后刪除 h[0]。但是Clickhouse大部分是OLAP批量查詢(xún),不是點(diǎn)查詢(xún),而且由于列存儲不支持刪除的特性,一致性哈希方案不是很適合。
目前的擴容方案是消費另外一份數據,寫(xiě)入新的Clickhouse集群,兩個(gè)集群一起運行一段時(shí)間,因為實(shí)時(shí)數據存儲3天,3天后,后臺服務(wù)直接訪(fǎng)問(wèn)新集群。
9. 結果
騰訊看點(diǎn)實(shí)時(shí)數倉:DWM層和DWS層,數據延遲1分鐘。
Foresight多維實(shí)時(shí)數據分析系統:多維條件查詢(xún)請求亞秒級響應,在緩存未命中的情況下,過(guò)去30分鐘99%的查詢(xún)耗時(shí)不到1秒;過(guò)去 24 小時(shí)內的查詢(xún),90% 的請求不到 5 秒,99% 的請求不到 10 秒。
技巧:關(guān)鍵詞分析-免費同行網(wǎng)站流量來(lái)源全面分析工具
關(guān)鍵詞分析,我們需要在構建網(wǎng)站之前選擇關(guān)鍵詞來(lái)優(yōu)化網(wǎng)站。哪個(gè)關(guān)鍵詞能獲得更多的流量和更高的轉化率,這些轉化率高的好關(guān)鍵詞自然需要我們更多的關(guān)注,而最直接的方法就是分析同行網(wǎng)站,通過(guò)對端網(wǎng)站的域名鏈接,抓取對端網(wǎng)站的所有關(guān)鍵詞布局進(jìn)行分析!
目錄:
對等 網(wǎng)站TDK 標簽
同行網(wǎng)站的收錄和外鏈分析
同行網(wǎng)站開(kāi)啟速度
網(wǎng)站更新頻率和文章質(zhì)量
1.對等網(wǎng)站TDK標簽
TDK是網(wǎng)站的標題、描述和關(guān)鍵詞(關(guān)鍵字),TDK是網(wǎng)站的一個(gè)很重要的元素,它是蜘蛛爬你的網(wǎng)站第一眼看到的之后,所以設置TDK對網(wǎng)站的優(yōu)化很關(guān)鍵。
標題:標題要有吸引力,同時(shí)收錄用戶(hù)的需求點(diǎn),長(cháng)度要合理。標題不能收錄太多關(guān)鍵詞,最好在3個(gè)以?xún)?,太多容易導致權重分散,不利于排名?/p>
描述(description):描述是為了突出公司或其主營(yíng)業(yè)務(wù)的服務(wù),是對整個(gè)網(wǎng)頁(yè)的簡(jiǎn)單概括。描述標簽的字符一般控制在200以?xún)?。如果是網(wǎng)站的首頁(yè),可以寫(xiě)公司的主要經(jīng)營(yíng)范圍或公司介紹。如果是內頁(yè),可以填寫(xiě)本頁(yè)內容的概要。例如,如果您是產(chǎn)品頁(yè)面,請編寫(xiě)產(chǎn)品頁(yè)面。簡(jiǎn)單來(lái)說(shuō),如果是文章頁(yè)面,寫(xiě)下文章的主要內容是什么,這樣蜘蛛就可以抓取到,讓用戶(hù)更好的知道你寫(xiě)了什么。如果不想每次發(fā)送文章都寫(xiě)描述,可以設置自動(dòng)抓取文章的前一部分作為描述。
關(guān)鍵詞(關(guān)鍵字):關(guān)鍵詞為簡(jiǎn)潔明了,多個(gè)關(guān)鍵詞用“,”分隔,關(guān)鍵詞最好設置在3以?xún)?,網(wǎng)站后發(fā)展到比較高的權重,可以增加到5左右。關(guān)鍵詞對網(wǎng)站的排名也有很大的影響,蜘蛛在抓取你的網(wǎng)頁(yè)時(shí)也會(huì )判斷你的關(guān)鍵詞 ,如果你不設置 關(guān)鍵詞 ,它將基于你的標題。
2. 競爭對手的外部鏈接和收錄
外鏈情況:分析對手的外鏈數量。一般來(lái)說(shuō),排名越高的網(wǎng)站,外鏈數據越多。要保證外鏈的數量,還要保證外鏈的質(zhì)量。優(yōu)質(zhì)的外鏈決定了網(wǎng)站在搜索引擎中的權重。發(fā)送外鏈時(shí),一定要在網(wǎng)站上以高權重發(fā)布有效的外鏈。
收錄情況:先列出關(guān)鍵詞和長(cháng)尾關(guān)鍵詞,用工具查詢(xún)收錄的文章使用的收錄的情況關(guān)鍵詞,如果想讓你的網(wǎng)站有排名,前提是收錄,收錄越多,關(guān)鍵詞在搜索中的排名就越好引擎等于機會(huì )越大
3.網(wǎng)站的開(kāi)啟速度
網(wǎng)站的打開(kāi)速度直接影響網(wǎng)站的收錄和用戶(hù)體驗,所以網(wǎng)站的打開(kāi)速度太重要了!
1、網(wǎng)站服務(wù)器配置偏低,網(wǎng)站流量大/爬蟲(chóng)爬取或者服務(wù)器內存快滿(mǎn)等都會(huì )影響網(wǎng)站的打開(kāi)速度。
2.網(wǎng)站服務(wù)器支持的區域少或機房帶寬差時(shí),會(huì )導致本地訪(fǎng)問(wèn)者訪(fǎng)問(wèn)本地網(wǎng)站的延遲,導致網(wǎng)站的打開(kāi)速度變慢>。
3. 網(wǎng)站服務(wù)器是否使用gzip壓縮功能。壓縮網(wǎng)站可以大大壓縮網(wǎng)站占用的用戶(hù)帶寬,提高網(wǎng)站的訪(fǎng)問(wèn)速度。
4. 網(wǎng)站更新頻率和文章質(zhì)量
眾所周知,蜘蛛喜歡新鮮事物,所以我們每天都要給我們的網(wǎng)站添加一些新的內容,只有先喂這些蜘蛛,搜索引擎才會(huì )對我們的網(wǎng)站進(jìn)行排名,那么我們在更新文章的時(shí)候應該注意哪些方面呢?
1. 文章 的質(zhì)量
首先,我們在更新網(wǎng)站的時(shí)候,一定要保證我們更新的內容是高質(zhì)量的,也就是說(shuō)內容是和我們的網(wǎng)站相關(guān)的。我正在做SEO優(yōu)化。如果我更新的內容都是關(guān)于賣(mài)靴子或買(mǎi)衣服的。我的內容再好也不過(guò)是一片云而已,對我的網(wǎng)站關(guān)鍵詞排名用處不大,所以我們在更新網(wǎng)站文章一定要質(zhì)量好,可讀性強,讓用戶(hù)喜歡我們的文章,搜索引擎根據用戶(hù)體驗來(lái)判斷,好的用戶(hù)體驗才是王道。
2. 文章是否原創(chuàng )
現在很多人覺(jué)得寫(xiě)文章太難了,干脆把網(wǎng)上的內容修改一下,發(fā)出去。結果這個(gè)文章的重復率達到了80%,這樣的文章@文章效果不大,而且搜索引擎很可能不會(huì )收錄,最好我們偽原創(chuàng )的方式就是看別人的文章然后根據自己的理解說(shuō)一二三,這樣的文章不再是偽原創(chuàng ),是絕對的原創(chuàng ),當然前提是你對這個(gè)行業(yè)比較熟悉,可以寫(xiě)的好文章加油。