七貓公司簡(jiǎn)介
七貓是一家深耕文化娛樂(lè)行業(yè)的互聯(lián)網(wǎng)企業(yè),總部坐落在上海市前灘中心感憾。七貓旗下原創(chuàng)文學(xué)網(wǎng)站七貓中文網(wǎng)于2017年5月正式上線鲜戒,專注為原創(chuàng)作者提供創(chuàng)作指導(dǎo)、版權(quán)運(yùn)營(yíng)等全方位一體化服務(wù)沾歪。七貓拳頭產(chǎn)品七貓免費(fèi)小說(shuō)App于2018年8月正式上線,專注為用戶提供正版雾消、免費(fèi)灾搏、優(yōu)質(zhì)的網(wǎng)絡(luò)文學(xué)內(nèi)容閱讀服務(wù)。現(xiàn)平臺(tái)用戶超6億立润,規(guī)模位列數(shù)字閱讀行業(yè)前列狂窑。
七貓大數(shù)據(jù)架構(gòu)介紹
七貓的數(shù)倉(cāng)團(tuán)隊(duì)主要是承接七貓各條業(yè)務(wù)線的離線數(shù)據(jù)開(kāi)發(fā)、實(shí)時(shí)數(shù)據(jù)開(kāi)發(fā)桑腮、指標(biāo)建設(shè)泉哈、數(shù)據(jù)治理等工作。我加入七貓大約兩年時(shí)間破讨,加入后第一件事就是引入StarRocks≈枷铮現(xiàn)在七貓有五套StarRocks集群在生產(chǎn)環(huán)境投入了使用。據(jù)不完全統(tǒng)計(jì)添忘,數(shù)據(jù)治理前離線數(shù)據(jù)加實(shí)時(shí)數(shù)據(jù),總數(shù)據(jù)量大約在20PB左右若锁。那我們是如何維護(hù)和管理這些數(shù)據(jù)的呢搁骑?下面會(huì)通過(guò)一張簡(jiǎn)化版的數(shù)據(jù)架構(gòu)圖來(lái)介紹。
如上圖所示,最左邊是數(shù)據(jù)來(lái)源仲器,這些數(shù)據(jù)源可以理解為用戶在七貓APP上的用戶行為數(shù)據(jù)煤率,包括曝光、點(diǎn)擊乏冀、閱讀時(shí)長(zhǎng)蝶糯、點(diǎn)贊、評(píng)論辆沦、瀏覽廣告等昼捍。這些數(shù)據(jù)會(huì)通過(guò)日志埋點(diǎn)的形式上報(bào)到日志接收系統(tǒng)。日志接收系統(tǒng)會(huì)將用戶行為數(shù)據(jù)和廣告數(shù)據(jù)進(jìn)行分流肢扯,分別存在兩個(gè)Kafka里面妒茬。大數(shù)據(jù)通過(guò) Flink 實(shí)時(shí)消費(fèi)兩個(gè) Kafka 的數(shù)據(jù)并實(shí)時(shí)寫(xiě)入到 Hive 數(shù)據(jù)表中。在 Hive 里進(jìn)行一系列 ETL 操作之后蔚晨,數(shù)據(jù)會(huì)流入到 StarRocks 和 Redis 乍钻,為下游的業(yè)務(wù)提供直接的數(shù)據(jù)服務(wù),其中 Redis 主要應(yīng)對(duì)的是高并發(fā)的場(chǎng)景铭腕∫瘢基于 StarRocks 和 Redis,下游開(kāi)發(fā)各種系統(tǒng)累舷,比如統(tǒng)一的 BI 系統(tǒng)浩考、指標(biāo)管理系統(tǒng),AB實(shí)驗(yàn)系統(tǒng)笋粟、通用人群圈選系統(tǒng)等怀挠。后面將為大家重點(diǎn)介紹通用人群圈選系統(tǒng)的工作流程和設(shè)計(jì)思路。
中間部分是七貓大數(shù)據(jù)數(shù)倉(cāng)的基礎(chǔ)數(shù)據(jù)害捕。上下兩個(gè)分支分別是市場(chǎng)投放業(yè)務(wù)數(shù)據(jù)以及商業(yè)化業(yè)務(wù)數(shù)據(jù)绿淋。這兩條業(yè)務(wù)線的數(shù)據(jù)特點(diǎn)是數(shù)據(jù)量非常大,實(shí)時(shí)性要求高尝盼,每秒鐘可能產(chǎn)生幾百萬(wàn)條數(shù)據(jù)吞滞。分別通過(guò) Flink CDC 以及 Flink Connector 每五分鐘聚合寫(xiě)入到 StarRocks 里,關(guān)聯(lián)數(shù)倉(cāng)的其它用戶行為數(shù)據(jù)盾沫,為下游提供數(shù)據(jù)服務(wù)裁赠,滿足業(yè)務(wù)看數(shù)和用數(shù)的需求。
除了市場(chǎng)投放以及商業(yè)化業(yè)務(wù)數(shù)據(jù)之外赴精,還有其他八條業(yè)務(wù)線佩捞。所有的業(yè)務(wù)線都有用數(shù)看數(shù)的需求,要同時(shí)應(yīng)對(duì)各個(gè)業(yè)務(wù)線的數(shù)據(jù)需求蕾哟,必須要依靠工具的力量來(lái)提升數(shù)據(jù)的交付效率一忱。所以我們將各條業(yè)務(wù)線的數(shù)據(jù)需求莲蜘,抽象成公共的數(shù)據(jù)能力,統(tǒng)一的提供服務(wù)帘营。幾個(gè)比較典型的業(yè)務(wù)場(chǎng)景票渠,如數(shù)據(jù)地圖、自助指標(biāo)分析芬迄,數(shù)據(jù)治理问顷、AB實(shí)驗(yàn)等。對(duì)應(yīng)地在數(shù)據(jù)資產(chǎn)管理平臺(tái)里會(huì)提供元數(shù)據(jù)服務(wù)禀梳,統(tǒng)一指標(biāo)庫(kù)杜窄、成本核算等數(shù)據(jù)能力。
上圖所示的模塊出皇,大部分都已經(jīng)在生產(chǎn)環(huán)境使用了羞芍,只有小部分還在開(kāi)發(fā)中。中間有一段是數(shù)據(jù)讀寫(xiě)層郊艘。Flink 和 Spark 主要的功能是將數(shù)據(jù)寫(xiě)入到數(shù)倉(cāng)中荷科,然后 StarRocks、Kylin纱注、Trino畏浆、ClickHouse 的主要功能是將數(shù)倉(cāng)中的結(jié)果數(shù)據(jù)提供給業(yè)務(wù)線。由于歷史原因狞贱,平臺(tái) OLAP 引擎多樣且語(yǔ)法不統(tǒng)一刻获,導(dǎo)致給數(shù)據(jù)開(kāi)發(fā)和業(yè)務(wù)使用增加了門(mén)檻。所以在長(zhǎng)期規(guī)劃中瞎嬉,我們會(huì)逐步精簡(jiǎn) OLAP 引擎蝎毡,逐步打造基于 StarRocks + Kylin 的 OLAP 引擎,為業(yè)務(wù)數(shù)據(jù)提供統(tǒng)一支持氧枣。
阿里云EMR-StarRocks 在七貓的實(shí)踐案例
通用人群圈選系統(tǒng)
通用人群圈選系統(tǒng)上線之前沐兵,我們數(shù)倉(cāng)團(tuán)隊(duì)平均一周會(huì)接到2-3個(gè)用戶圈選需求,系統(tǒng)上線之后則是平均2-3個(gè)月接到一個(gè)需求便监。為什么會(huì)出現(xiàn)這么大的變化呢扎谎?類比邊緣計(jì)算的思路,邊緣計(jì)算將云計(jì)算所需要完成的工作前置到終端來(lái)進(jìn)行執(zhí)行烧董,從而減輕中心節(jié)點(diǎn)的負(fù)載和壓力毁靶。同理,原先用戶圈選需要由數(shù)倉(cāng)同學(xué)才能夠完成逊移,現(xiàn)在則將這些工作前置到業(yè)務(wù)團(tuán)隊(duì)來(lái)完成预吆。將圈選人群的工作下發(fā)到業(yè)務(wù),業(yè)務(wù)同學(xué)只需要寫(xiě)一段 SQL 提交到系統(tǒng)胳泉,系統(tǒng)就會(huì)自動(dòng)創(chuàng)建人群包啡浊。
用戶圈選系統(tǒng)的實(shí)現(xiàn)原理如上圖所示觅够,起點(diǎn)是分析師/運(yùn)營(yíng)通過(guò)自定義的 SQL 創(chuàng)建人群包,將人群配置信息注冊(cè)到圈選系統(tǒng)上巷嚣,數(shù)據(jù)資產(chǎn)管理平臺(tái)的人群圈選的模塊會(huì)定期讀取配置信息,然后調(diào)用作業(yè)調(diào)度系統(tǒng)的API钳吟,自動(dòng)生成圈選作業(yè)并定時(shí)調(diào)度廷粒,同時(shí)還會(huì)解決上下游依賴問(wèn)題。
第一版用戶圈選系統(tǒng)人群信息數(shù)據(jù)主要落在Redis红且,通過(guò)數(shù)據(jù)服務(wù)給到業(yè)務(wù)服務(wù)使用坝茎。因?yàn)闃I(yè)務(wù)服務(wù)針對(duì)不同人群有不同的策略及實(shí)驗(yàn),同時(shí)考慮到離線數(shù)據(jù)分析部分的人群信息暇番,也會(huì)自動(dòng)落一份數(shù)據(jù)到 Hive 里嗤放,幫助分析師或者算法同學(xué)關(guān)聯(lián)數(shù)倉(cāng)的用戶行為指標(biāo)來(lái)進(jìn)行分析。這部分可以了解人群建好一段時(shí)間之后的人群表現(xiàn)壁酬,并通過(guò)數(shù)據(jù)關(guān)聯(lián)進(jìn)行分析次酌。由于 Redis 的使用成本比較高,遂引入了 StarRocks 舆乔。StarRocks 可以存儲(chǔ)的數(shù)據(jù)量也比較大岳服,相對(duì) Redis 來(lái)說(shuō),整體使用成本比較低希俩。作業(yè)調(diào)度系統(tǒng)中吊宋,StarRocks、Redis颜武、Hive 都是可選的引擎璃搜,由業(yè)務(wù)同學(xué)自己決定×凵希可以看到在整個(gè)流程中这吻,數(shù)倉(cāng)同學(xué)幾乎沒(méi)有露臉,實(shí)現(xiàn)業(yè)務(wù)同學(xué)玩轉(zhuǎn)系統(tǒng)初衷因块。碰到疑難問(wèn)題橘原,再由數(shù)倉(cāng)同學(xué)介入解決,節(jié)省了人力成本以支持更多業(yè)務(wù)需求涡上。
通用人群圈選系統(tǒng)截圖
指標(biāo)異動(dòng)自動(dòng)下鉆探查
指標(biāo)異動(dòng)自動(dòng)下鉆探查是我們七貓數(shù)倉(cāng)團(tuán)隊(duì)自研的功能趾断,目前處于孵化階段。由于還沒(méi)有前端同學(xué)參與吩愧,界面稍顯簡(jiǎn)陋芋酌,但因?yàn)楣δ軓?qiáng)大,迫不及待跟大家分享雁佳。指標(biāo)異動(dòng)自動(dòng)下鉆探查功能脐帝,可以自動(dòng)發(fā)現(xiàn)細(xì)分維度下同云,指標(biāo)異常的根源,快速定位指標(biāo)異動(dòng)原因堵腹。
上圖所示的所有節(jié)點(diǎn)都是指標(biāo)炸站,出現(xiàn)在這棵指標(biāo)樹(shù)上的都是異常指標(biāo)。當(dāng)指標(biāo)出現(xiàn)異常如 DAU 上漲/下跌時(shí)旱易,可以根據(jù)節(jié)點(diǎn)和節(jié)點(diǎn)之間的連接關(guān)系,一層一層下鉆,找到最細(xì)維度組合下的指標(biāo)異常,然后定位到負(fù)責(zé)該指標(biāo)的業(yè)務(wù)同學(xué)或辖,了解業(yè)務(wù)是否有變更,導(dǎo)致 DAU 波動(dòng)忌堂。通過(guò)指標(biāo)異動(dòng)自動(dòng)下鉆探查功能,原本可能耗時(shí)半天的繁瑣SQL查詢酗洒,可以壓縮至5分鐘內(nèi)獲得洞察士修。
實(shí)現(xiàn)指標(biāo)異動(dòng)自動(dòng)下鉆探查功能,主要有兩個(gè)關(guān)鍵技術(shù)點(diǎn)寝蹈。第一個(gè)是如何判斷指標(biāo)是否異常李命;第二個(gè)是如何將異常指標(biāo)連接展現(xiàn)。
異常指標(biāo)判定:我們會(huì)通過(guò)預(yù)測(cè)算法箫老,基于歷史數(shù)據(jù)預(yù)測(cè)指標(biāo)的正常范圍封字。如果當(dāng)前指標(biāo)不在正常范圍中,則視為指標(biāo)異常耍鬓。例如阔籽,通過(guò)分析過(guò)去數(shù)月的DAU趨勢(shì),確定當(dāng)前DAU是否顯著偏移預(yù)測(cè)區(qū)間牲蜀。
異常指標(biāo)串聯(lián)展現(xiàn):對(duì)指標(biāo)的下鉆維度進(jìn)度編碼笆制,高效構(gòu)建指標(biāo)間的層級(jí)關(guān)系,實(shí)現(xiàn)從單一指標(biāo)到多維度組合的逐級(jí)下鉆分析涣达,將異常的指標(biāo)通過(guò)樹(shù)形結(jié)構(gòu)串聯(lián)起來(lái)在辆,然后進(jìn)行可視化展現(xiàn)。
730 天微聚合數(shù)據(jù)靈活下鉆分析
最近半年度苔,七貓?jiān)谔嵘脩魳?biāo)簽的覆蓋度和準(zhǔn)確度方向做了很多工作匆篓,覆蓋度和準(zhǔn)確度提升的同時(shí),也導(dǎo)致歷史數(shù)據(jù)分析的連續(xù)性和準(zhǔn)確性受到了干擾寇窑。如某用戶從原識(shí)別為女性調(diào)整為男性鸦概,直接對(duì)比更新前后的數(shù)據(jù)可能導(dǎo)致誤讀,如看似女性用戶閱讀時(shí)長(zhǎng)驟減而男性用戶時(shí)長(zhǎng)激增的現(xiàn)象甩骏,實(shí)則是歸類調(diào)整的結(jié)果窗市,并非真實(shí)行為變化先慷。這對(duì)依賴于此類數(shù)據(jù)進(jìn)行算法優(yōu)化和業(yè)務(wù)決策的團(tuán)隊(duì)構(gòu)成了嚴(yán)峻挑戰(zhàn),尤其是在面對(duì)大規(guī)模標(biāo)簽更新時(shí)咨察,問(wèn)題復(fù)雜度呈指數(shù)級(jí)增長(zhǎng)论熙,傳統(tǒng)處理方式難以為繼。
為應(yīng)對(duì)這一難題摄狱,團(tuán)隊(duì)集思廣益赴肚,提出了一項(xiàng)創(chuàng)新策略:每日采用最新用戶標(biāo)簽重新計(jì)算過(guò)去730天的數(shù)據(jù),以確保分析的一致性和時(shí)效性二蓝。然而,涉及約5億用戶指厌、150億指標(biāo)數(shù)據(jù)刊愚,執(zhí)行此策略面臨的數(shù)據(jù)處理規(guī)模十分龐大,涉及的查詢性能必然很差踩验。此外鸥诽,由于集群規(guī)模小,數(shù)據(jù)量龐大箕憾,數(shù)據(jù)甚至無(wú)法導(dǎo)入牡借,增加節(jié)點(diǎn),增大集群規(guī)模又會(huì)面臨很高的成本問(wèn)題袭异。探索如采用bitmap編碼優(yōu)化存儲(chǔ)與查詢效率的方式钠龙,也因?qū)嵤?fù)雜度和溝通成本高而未能采納。
最終御铃,通過(guò)一個(gè)StarRocks使用小技巧解決了這個(gè)問(wèn)題碴里,第一步是在 Hive 表中通過(guò)行轉(zhuǎn)列,將730條記錄合并成1條上真,再將縮小了730倍的數(shù)據(jù)導(dǎo)入到 StarRocks 中創(chuàng)建視圖咬腋,導(dǎo)入之后將數(shù)據(jù)與最新的標(biāo)簽數(shù)據(jù)進(jìn)行 join,再將指標(biāo)按照業(yè)務(wù)要求的維度進(jìn)行分組睡互,最后創(chuàng)建基于視圖的物化視圖根竿。每天只要 Refresh 物化視圖,就能夠達(dá)到指標(biāo)查詢加速的效果就珠,實(shí)現(xiàn)查詢秒出寇壳。經(jīng)過(guò)一段時(shí)間的運(yùn)行驗(yàn)證,系統(tǒng)穩(wěn)定性良好嗓违,業(yè)務(wù)部門(mén)反饋積極九巡,用戶標(biāo)簽更新帶來(lái)的問(wèn)題成功解決。
未來(lái)展望
指標(biāo)加速層建設(shè)
目前我們數(shù)倉(cāng)團(tuán)隊(duì)在 Hive 里構(gòu)建數(shù)據(jù)模型和指標(biāo)后蹂季,還需人工同步數(shù)據(jù)至 StarRocks冕广,手段在 BI 系統(tǒng)中創(chuàng)建數(shù)據(jù)集疏日,以及手動(dòng)在指標(biāo)管理系統(tǒng)內(nèi)進(jìn)行登記注冊(cè)。后續(xù)我們計(jì)劃在數(shù)據(jù)資產(chǎn)管理平臺(tái)建設(shè)指標(biāo)加速層撒汉,核心 OLAP 引擎選用 StarRocks+ Kylin沟优,數(shù)據(jù)開(kāi)發(fā)人員僅需在指標(biāo)管理系統(tǒng)中精準(zhǔn)定義模型和指標(biāo),即可自動(dòng)生成 BI 系統(tǒng)數(shù)據(jù)集睬辐,同時(shí)自動(dòng)完成 StarRocks 與 Redis 中的數(shù)據(jù)加速處理挠阁。
埋點(diǎn)全鏈路數(shù)據(jù)治理
2024年3月我們啟動(dòng)了數(shù)據(jù)治理專項(xiàng),截止到5月份溯饵,在數(shù)據(jù)量持續(xù)增長(zhǎng)的情況下侵俗,完成了降本 70萬(wàn)元/月 的目標(biāo)。主要涉及到的工作內(nèi)容如下:
1丰刊、數(shù)據(jù)開(kāi)發(fā)和治理規(guī)范
- 開(kāi)發(fā)數(shù)據(jù)治理工具:自動(dòng)識(shí)別需要治理的數(shù)據(jù)表和資源利用率低的任務(wù)隘谣,告警到個(gè)人。
- 開(kāi)發(fā)黑名單功能:對(duì)長(zhǎng)時(shí)間沒(méi)有優(yōu)化的數(shù)據(jù)表和任務(wù)啄巧,自動(dòng) Kill 寻歧。
2、存儲(chǔ)治理
- 基于對(duì)象存儲(chǔ)的歸檔能力秩仆,將訪問(wèn)頻度低的分區(qū)數(shù)據(jù)進(jìn)行分級(jí)歸檔(冷歸檔的存儲(chǔ)成本大約是標(biāo)準(zhǔn)存儲(chǔ)成本的 1/10)码泛。
- 基于數(shù)據(jù)血緣能力,將出度和入度較小的數(shù)據(jù)表下線澄耍,用其它熱度較高數(shù)據(jù)表代替噪珊。
3、計(jì)算資源治理
- 基于 Spark 集群的彈性擴(kuò)縮容的能力逾苫,減少常駐 Spark 節(jié)點(diǎn)數(shù)卿城。
- 通過(guò) YARN 資源的監(jiān)控,對(duì) Spark 任務(wù)進(jìn)行編排铅搓,減少?gòu)椥詳U(kuò)容的 Spark 節(jié)點(diǎn)數(shù)瑟押。
值得注意的是,目前的數(shù)據(jù)治理實(shí)踐主要圍繞數(shù)倉(cāng)內(nèi)的表與任務(wù)展開(kāi)星掰,尚未覆蓋至 StarRocks 多望。所以接下來(lái)我們計(jì)劃進(jìn)行面向埋點(diǎn)的全鏈路數(shù)據(jù)治理:
- 統(tǒng)計(jì)報(bào)表和數(shù)據(jù)集的訪問(wèn)頻次,下線低熱度報(bào)表和數(shù)據(jù)集氢烘,數(shù)據(jù)集對(duì)應(yīng)的 EMR StarRocks 數(shù)據(jù)表訪問(wèn)頻次會(huì)響應(yīng)降低怀偷;
- 根據(jù) EMR StarRocks 數(shù)據(jù)表的分區(qū)訪問(wèn)頻次,分辨冷熱數(shù)據(jù)表播玖、分區(qū)椎工,熱數(shù)據(jù)保留在EMR-StarRocks中,溫冷數(shù)據(jù)移動(dòng)到 Hive 中;
- Hive 表中訪問(wèn)頻次低的字段维蒙、埋點(diǎn)逐步下線掰吕;
- 借助EMR-StarRocks的存算分離的能力,根據(jù)統(tǒng)計(jì)信息制定規(guī)定颅痊,在本地存儲(chǔ)和對(duì)象存儲(chǔ)之間殖熟,自動(dòng)遷移數(shù)據(jù)。