生產(chǎn)實(shí)踐 | Flink + 直播(二)| 如何建設(shè)實(shí)時(shí)公共畫像維表?

本系列每篇文章都是從一些實(shí)際生產(chǎn)實(shí)踐需求出發(fā),解決一些生產(chǎn)實(shí)踐中的問(wèn)題,拋磚引玉,以幫助小伙伴們解決一些實(shí)際生產(chǎn)問(wèn)題。本篇文章主要介紹直播間畫像實(shí)時(shí)維表建設(shè)的整個(gè)過(guò)程,如果對(duì)小伙伴有幫助的話,歡迎點(diǎn)贊 + 再看~

技術(shù)架構(gòu)

回顧上一節(jié)的技術(shù)架構(gòu)圖。

tec-arc.png

整個(gè)架構(gòu)相對(duì)來(lái)說(shuō)是比較好理解的。從數(shù)據(jù)源到數(shù)據(jù)處理以及最后到數(shù)據(jù)匯部分。

但是大家的疑惑點(diǎn)可能就集中在三個(gè)維表的建設(shè)上,包含主播用戶畫像維表,觀眾用戶畫像維表,直播間畫像維表。

dim-tec-arc.png

我們依然從以下幾個(gè)角度的問(wèn)題出發(fā),通過(guò)分析場(chǎng)景,解答這幾個(gè)問(wèn)題來(lái)給大家介紹以上三個(gè)維表的建設(shè)過(guò)程。

Question

  • WHAT:直播實(shí)時(shí)公共畫像維表是指什么?離線公共畫像維表又指什么?區(qū)別?
  • WHY:為什么架構(gòu)圖中的三類公共畫像維表要按照實(shí)時(shí)和離線進(jìn)行劃分?為什么需要建設(shè)實(shí)時(shí)公共畫像維表,離線公共畫像維表不能滿足需求?
  • HOW:怎樣才能建設(shè)滿足直播實(shí)時(shí)數(shù)據(jù)的實(shí)時(shí)公共畫像維表?
  • WHO:需要使用什么樣的組件建設(shè)直播實(shí)時(shí)公共畫像維表?為什么選用這些組件進(jìn)行建設(shè)?

WHAT:實(shí)時(shí) & 離線公共畫像維表?

概念

首先簡(jiǎn)單介紹下,實(shí)時(shí) & 離線公共畫像維表中存儲(chǔ)的內(nèi)容就是實(shí)體的固有屬性(比如用戶的年齡等),我理解這兩個(gè)詞本身是高層抽象的概念,本文中介紹的主播用戶畫像維表,觀眾用戶畫像維表,直播間畫像維表是其具體實(shí)現(xiàn)。

其他大佬的文章解釋中會(huì)對(duì)實(shí)時(shí)公共畫像維表 & 離線公共畫像維表有更加深度的理解,這里我只說(shuō)明我在直播實(shí)時(shí)數(shù)據(jù)建設(shè)過(guò)程中的理解~

區(qū)別

其實(shí)這兩個(gè)詞的區(qū)別從名字上就可以區(qū)分出來(lái),實(shí)時(shí)公共畫像維表和離線公共畫像維表的最大區(qū)別就是數(shù)據(jù)建設(shè)和應(yīng)用場(chǎng)景要求的時(shí)效性不同。

離線公共畫像維表

特點(diǎn):

  • 場(chǎng)景:適合離線場(chǎng)景,時(shí)效性要求比較弱的場(chǎng)景,為指標(biāo)提供畫像維度填充或者打標(biāo)服務(wù)
  • 建設(shè):一般都是以離線 t + 1 的方式進(jìn)行建設(shè)
  • 應(yīng)用:使用的數(shù)據(jù)為離線 t + 1 的數(shù)據(jù)
  • 舉例:數(shù)據(jù)倉(cāng)庫(kù)中的用戶畫像維表,為應(yīng)用層數(shù)據(jù)提供畫像服務(wù);比如不但需要統(tǒng)計(jì)總 uv,還需要統(tǒng)計(jì)分年齡段的 uv。

實(shí)時(shí)公共畫像維表

特點(diǎn):

  • 場(chǎng)景:適合實(shí)時(shí)場(chǎng)景,時(shí)效性要求比較強(qiáng)的場(chǎng)景,為指標(biāo)提供畫像維度填充或者打標(biāo)服務(wù)
  • 建設(shè):實(shí)時(shí)的進(jìn)行建設(shè),延遲一般在秒級(jí)別
  • 應(yīng)用:使用的數(shù)據(jù)都是實(shí)時(shí)建設(shè)好的,必須可以實(shí)時(shí)獲?。爰?jí)別延遲后獲取到)并使用

WHY:為什么建設(shè)實(shí)時(shí)公共畫像維表?

為什么架構(gòu)圖中的三類公共畫像維表要按照實(shí)時(shí)和離線進(jìn)行劃分?為什么需要建設(shè)實(shí)時(shí)公共畫像維表,離線公共畫像維表不能滿足需求?

這幾個(gè)問(wèn)題其實(shí)圍繞著我們的直播實(shí)時(shí)數(shù)據(jù)建設(shè)以及應(yīng)用的場(chǎng)景就可以展開解答。

接上篇技術(shù)架構(gòu)圖,其中直播實(shí)時(shí)數(shù)據(jù)需要建設(shè)的公共維表分為以下三類:

  • 直播間畫像維表:包含直播對(duì)應(yīng)的直播類別、開播客戶端、標(biāo)題、開播地址等信息
  • 主播畫像維表:主播對(duì)應(yīng)的主播名、主播類別、性別、年齡段等
  • 觀眾畫像維表:觀眾對(duì)應(yīng)的觀眾性別、年齡段等

直播間畫像維表

首先拋出結(jié)論:直播間畫像都是直播間的固有屬性畫像,直播間畫像維表的建設(shè)過(guò)程是實(shí)時(shí)的

由于大多數(shù)直播的時(shí)長(zhǎng)都在幾小時(shí)不等,隨著直播的開始,主播域觀眾的互動(dòng)也隨即產(chǎn)生,從而直播生產(chǎn)和消費(fèi)的指標(biāo)也開始產(chǎn)出,隨著直播的結(jié)束,主播和觀眾的互動(dòng)也就結(jié)束了,對(duì)應(yīng)的直播生產(chǎn)和消費(fèi)指標(biāo)也就不存在了,因此直播間畫像的所能提供給其他指標(biāo)作為維表的價(jià)值也就快速消失了,所以直播間畫像(標(biāo)題,開播地址)的應(yīng)用場(chǎng)景特點(diǎn)就是時(shí)效性很強(qiáng)。
因此直播間畫像維表對(duì)于直播生產(chǎn)消費(fèi)指標(biāo)的建設(shè)和應(yīng)用來(lái)說(shuō),需要滿足可實(shí)時(shí)建設(shè)、可實(shí)時(shí)查詢獲取的要求。

主播 & 觀眾用戶畫像維表

結(jié)論:這類畫像都是用戶的固有屬性畫像,而非直播間固有屬性,和直播間是非強(qiáng)相關(guān)的。主播 & 觀眾用戶畫像維表的建設(shè)過(guò)程可以是離線的。

無(wú)論直播間的開播關(guān)播,直播過(guò)程中的生產(chǎn)消費(fèi),主播畫像和觀眾畫像基本上不會(huì)產(chǎn)生變動(dòng)。
(舉例:大多數(shù)情況下,當(dāng)已經(jīng)判定一個(gè)用戶的年齡段畫像為 18 - 23 時(shí),即使這個(gè)用戶開了 10 場(chǎng)直播,或者這個(gè)用戶觀看了 10 場(chǎng)直播,其年齡段判定也基本不會(huì)有變化)。
因此主播用戶畫像維表 & 觀眾用戶畫像維表對(duì)于直播生產(chǎn)消費(fèi)指標(biāo)的建設(shè)和應(yīng)用來(lái)說(shuō),可以滿足離線 t + 1 建設(shè),提供數(shù)據(jù)服務(wù)進(jìn)行實(shí)時(shí)獲取的要求。

Notes:

主播 & 觀眾用戶畫像需要根據(jù)用戶生產(chǎn)消費(fèi)行為以及其他信息,使用到機(jī)器學(xué)習(xí)進(jìn)行性別和年齡段等的用戶畫像信息判定產(chǎn)出。
也有非常多的場(chǎng)景將這類畫像進(jìn)行實(shí)時(shí)建設(shè),用于實(shí)時(shí)個(gè)性化推薦等。只不過(guò)本文的直播實(shí)時(shí)數(shù)據(jù)建設(shè)對(duì)于這兩類畫像的時(shí)效性要求較弱,所以采用了離線的方式進(jìn)行建設(shè)。

HOW + WHO:怎樣建設(shè)?用什么建設(shè)?

直播間生命周期 & 數(shù)據(jù)流轉(zhuǎn)

直播間整個(gè)生命周期如圖所示。

live-stream-life-cycle.png
  • 1.主播創(chuàng)建直播間,直播間進(jìn)入開播的狀態(tài);
  • 2.觀眾進(jìn)入直播間后,在直播間內(nèi)與主播進(jìn)行互動(dòng);
  • 3.最后就是主播對(duì)直播間進(jìn)行關(guān)播,標(biāo)識(shí)著直播間生命周期的結(jié)束狀態(tài)。

直播間畫像維表-實(shí)時(shí)

實(shí)時(shí)畫像維表的建設(shè)。上圖中紅色的字體為實(shí)時(shí)畫像維表的建設(shè)和應(yīng)用過(guò)程。

直播間畫像實(shí)時(shí)數(shù)據(jù)流轉(zhuǎn)

  • 1.當(dāng)主播開播,直播間進(jìn)行直播后,直播間產(chǎn)生了直播間畫像信息,這時(shí)可以將畫像信息實(shí)時(shí)的建設(shè)到直播間畫像實(shí)時(shí)維表中。
    并且可以同時(shí)建設(shè)生產(chǎn)側(cè)的實(shí)時(shí)指標(biāo),利用建設(shè)好的直播間畫像實(shí)時(shí)維表 + 主播 & 觀眾畫像離線維表進(jìn)行生產(chǎn)側(cè)指標(biāo)的維度填充;
  • 2.當(dāng)觀眾進(jìn)入直播間后,與主播進(jìn)行互動(dòng),產(chǎn)生一系列的消費(fèi)行為,隨即可以建設(shè)消費(fèi)側(cè)的實(shí)時(shí)指標(biāo),利用建設(shè)的直播間畫像實(shí)時(shí)維表 + 主播 & 觀眾畫像離線維表進(jìn)行消費(fèi)側(cè)指標(biāo)的維度填充;
  • 3.當(dāng)主播對(duì)直播間進(jìn)行關(guān)播的時(shí)候,從直播間畫像實(shí)時(shí)維表中就可以對(duì)該直播間的畫像進(jìn)行刪除。

組件選型

通過(guò)上文的分析,可以了解到直播間畫像實(shí)時(shí)維表建設(shè)的要求如下:

  • 實(shí)時(shí)畫像:首先需要支持實(shí)時(shí)建設(shè),實(shí)時(shí)訪問(wèn);
  • 實(shí)時(shí)畫像:建設(shè)的數(shù)據(jù)都為實(shí)時(shí)指標(biāo),即要求低延遲的請(qǐng)求響應(yīng)時(shí)間;
  • 公共畫像:需要支撐多個(gè)大流量生產(chǎn)消費(fèi)實(shí)時(shí)任務(wù)的訪問(wèn)請(qǐng)求,即提供高 QPS 畫像數(shù)據(jù)服務(wù);
  • 公共畫像:高穩(wěn)定性。

因此組件選型就自然落在了高速緩存的范疇中,我們最后經(jīng)過(guò)方案對(duì)比之后,選擇了 redis 作為我們的實(shí)時(shí)維表的存儲(chǔ)引擎。

使用了 redis 中的 hash 作為維表存儲(chǔ)結(jié)構(gòu),其中直播間畫像維度存儲(chǔ)設(shè)計(jì)如下圖。

live-stream-dim-redis-hash.png

flink 實(shí)時(shí)維表建設(shè)代碼示例

public class LiveStreamRealtimeDimBuilderJob {

    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        DataStream<byte[]> source = SourceFactory.getSourceDataStream();
        source.process(new ProcessFunction<byte[], String>() {
            @Override
            public void processElement(byte[] bytes, Context context, Collector<String> collector) throws Exception {
                CommonModel c = CommonModel.parseFrom(bytes);
                // 開播
                if (c.isStartLiveStream()) {
                    RedisConfig
                            .get()
                            .hmset(c.getLiveStreamId()
                                    , ImmutableMap.<String, String>builder()
                                            .put("type", c.getType())
                                            .put("client", c.getClient())
                                            .put("title", c.getTitle())
                                            .put("address", c.getAddress())
                                            .build()
                            );
                    RedisConfig
                            .get()
                            .expire(c.getLiveStreamId(), 30 * 24 * 60 * 60);
                } else if (c.isEndLiveStream()) {
                // 關(guān)播
                    RedisConfig
                            .get()
                            .expire(c.getLiveStreamId(), 2 * 24 * 60 * 60);
                }
            }
        });

        env.execute();
    }

    @Data
    public static class CommonModel {
        private String liveStreamId; // 直播間 id
        private String type; // 直播間類型
        private String client; // 開播客戶端
        private String title; // 直播間標(biāo)題
        private String address; // 直播間開播地址

        public static CommonModel parseFrom(byte[] bytes) {
            // 邏輯根據(jù)業(yè)務(wù)邏輯判定
            return null;
        }

        public boolean isStartLiveStream() {
            // 邏輯根據(jù)業(yè)務(wù)邏輯判定
            return false;
        }

        public boolean isEndLiveStream() {
            // 邏輯根據(jù)業(yè)務(wù)邏輯判定
            return false;
        }
    }
}

主播 & 觀眾用戶畫像維表-離線

離線畫像維表的建設(shè)。主要包含主播和觀眾的用戶畫像,性別,年齡等信息。如下圖藍(lán)色的字體為離線畫像維表的應(yīng)用過(guò)程。

live-stream-life-cycle.png

主播 & 觀眾畫像數(shù)據(jù)流轉(zhuǎn)

在產(chǎn)出直播間生產(chǎn)側(cè)、消費(fèi)側(cè)實(shí)時(shí)數(shù)據(jù)時(shí),使用主播 & 觀眾畫像進(jìn)行了畫像維度填充。

存儲(chǔ)組件

其中離線畫像維表的存儲(chǔ)組件選型與實(shí)時(shí)相同,同為 redis,畫像信息存儲(chǔ)方式也是使用 redis hash 結(jié)構(gòu)進(jìn)行存儲(chǔ)。

以 t + 1 的方式進(jìn)行畫像數(shù)據(jù)建設(shè)并進(jìn)行數(shù)據(jù)同步,將建設(shè)好的全量主播和觀眾用戶畫像同步到 redis 高速緩存當(dāng)中。

總結(jié)

本文銜接上文,主要介紹直播間實(shí)時(shí)維表的建設(shè)過(guò)程。提出幾個(gè)建設(shè)的問(wèn)題,以這幾個(gè)問(wèn)題出發(fā),引出了一下三小節(jié)。

第一節(jié)簡(jiǎn)單介紹了實(shí)時(shí) & 離線公共畫像維表的概念。

第二節(jié)從數(shù)據(jù)應(yīng)用場(chǎng)景的角度出發(fā),介紹了為什么需要建設(shè)實(shí)時(shí)的公共畫像維表。

第三節(jié)主要介紹了實(shí)時(shí)畫像維表的建設(shè)過(guò)程以及詳細(xì)的技術(shù)方案。

最后一節(jié)對(duì)本文進(jìn)行了總結(jié)。

如果你也建設(shè)過(guò)實(shí)時(shí)畫像維表,或者有相同的需求,歡迎留言或者留下你的文章鏈接,相互交流~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容