pos機素材設計,作業(yè)幫基于 StarRocks 畫像系統(tǒng)的設計及優(yōu)化實踐

 新聞資訊2  |   2023-05-25 10:04  |  投稿人:pos機之家

網(wǎng)上有很多關于pos機素材設計,作業(yè)幫基于 StarRocks 畫像系統(tǒng)的設計及優(yōu)化實踐的知識,也有很多人為大家解答關于pos機素材設計的問題,今天pos機之家(www.rcqwhg.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機素材設計

pos機素材設計

一、背景介紹

作業(yè)幫為提高孩子學習效率通過搜題、答題、咨詢等各種行為數(shù)據(jù)以及輔導效果等結果數(shù)據(jù),利用算法、規(guī)則等技術手段建立用戶畫像,用于差異化輔導提升學習效率。我們根據(jù)畫像標簽特點并結合 StarRocks 能力建設了一套相對適合全場景的畫像圈人系統(tǒng)。本文主要介紹此畫像服務、標簽接入的系統(tǒng)設計及圈人性能優(yōu)化方式。

二、標簽特點

注:符號變量為創(chuàng)建人群時確定。

三、方案設計思考

為保證系統(tǒng)支持業(yè)務需求靈活可擴展、架構合理、實現(xiàn)后系統(tǒng)穩(wěn)定且性能滿足預期,在設計前梳理相關問題及思考。

如果滿足以上全部標簽類型,常規(guī)大寬表、標簽 bitmap 化設計無法滿足需求。需要將帶有修飾詞的行為類數(shù)據(jù)和常規(guī)標簽做交叉,而往往兩類數(shù)據(jù)存儲在不同的表或數(shù)據(jù)結構中,同時支持秒級查詢利用常規(guī) join 又無法滿足,最合理的方式仍然是利用 bitmap 的交叉能力,針對不同規(guī)則人群分別形成 bitmap,然后結果交叉。而使用 bitmap 結構就必須將用戶唯一標識字符串 cuid 轉化為數(shù)值類型 guid。

如何將用戶唯一標識轉化為數(shù)值型全局唯一自增 guid,并且實時和離線標簽要采用同一套映射關系。離線時效性不夠所以必須采用實時方案形成映射關系,然后同步到離線 hive 用于補充離線標簽,映射必須覆蓋實時和離線標簽全部用戶 id。

標簽會越來越多而且每個標簽基本都需要經(jīng)過生產(chǎn)計算、補充 guid、數(shù)據(jù)校驗報警、寫入存儲、原子切換上線等一系列操作,同時需要控制新增標簽的接入成本和后期維護成本。為此需要將標簽生產(chǎn)部分和標簽接入部分解耦,抽象接入流程,按照指定規(guī)范實施,盡可能做到標簽配置化接入,統(tǒng)一化管理,支持長線平臺化建設兼容。標簽生產(chǎn)也可按照業(yè)務方向多人并行落地。

性能方面保障需要利用真實數(shù)據(jù)做相關測試,并保證每個環(huán)節(jié)設計可按照資源擴展線性提高相關處理能力。例如數(shù)據(jù)入庫、圈人查詢、實時 cuid->guid mapping 等。

穩(wěn)定性方面保障需要針對關鍵環(huán)節(jié)配置相關監(jiān)控報警,設置預案并做故障演練。

四、總體方案設計1、方案總覽

大概由畫像服務、實時標簽接入、離線標簽接入三部分組成。

(1)畫像服務主要承擔標簽配置管理、標簽枚舉值解釋映射、人群圈選人群包管理、其他功能系統(tǒng)對接、標簽數(shù)據(jù)接入配置管理及快速回滾能力等。

(2)實時標簽接入主要負責標簽接入規(guī)范、cuid->guid 映射及備份、標簽實時入庫三部分。通過抽象工具,任務可配置化完成。

(3)離線標簽接入主要負責標簽接入規(guī)范、配置化接入(標簽數(shù)據(jù)組裝、cuid->guid 映射、校驗、監(jiān)控、入庫等)。

StarRocks 作為全場景 MPP 數(shù)據(jù)庫,支持多種表模型、秒級實時分析、并發(fā)查詢等能力,同時又具有 bitmap 存儲結構和配套的 UDF 函數(shù),降低了對 bitmap 存儲、交叉、管理等方面的工程復雜程度,所以我們最終選用 StarRocks 作為標簽的存儲。

根據(jù)需求場景、性能、靈活性等方面因素考慮,將標簽信息抽象為如下幾類進行存儲。每個分類會對應一個查詢模板解決不同業(yè)務場景問題。因讀寫性能、標簽更新時效、冪等接入等因素考慮,同一個類型支持了多個 StarRocks 表模型,同一標簽也可存儲在不同業(yè)務類型表中。

2、畫像服務

畫像服務核心能力有兩個。第一個人群圈選能力,特點為內(nèi)部系統(tǒng) qps 不高,秒級返回。第二個單用戶 id 規(guī)則判定能力,特點為 qps 很高,10 毫秒級返回。第二個不在本系統(tǒng)設計范圍內(nèi),只說人群圈選部分,大體執(zhí)行過程如下:

請求 DSL 參數(shù)解析及校驗:將人群圈選 DSL 按標簽拆分為多個獨立的表達式和組合關系,然后根據(jù)標簽配置信息補充隱含條件,同時校驗每個表達式的合理性。查詢邏輯優(yōu)化:標簽同表存儲時合并表達式,減少單表達式數(shù)據(jù)返回量加速查詢速度。表達式轉 SQL:根據(jù)抽象類型對應的查詢模板,將優(yōu)化合并后的表達式分別轉化為多個子查詢,然后結合組合關系形成整條 SQL 。執(zhí)行 SQL 圈選人群。建表語句及查詢模板性能測試

(1)Profile + Agg 測試

實時場景未采用 PK 主要因為不支持 REPLACE_IF_NOT_NULL 和局部列更新,標簽間入庫解耦需要此能力。性能測試如下:

測試所用集群:32C 96G 1TSSD * 5臺,3個FE,5個BE,5個Broker。 1.19.5版本表數(shù)據(jù):2.58億行,3個指標列,單副本約1.7G,AGGREGATE KEY(`guid`), DISTRIBUTED BY HASH(`guid`),數(shù)據(jù)分布均勻。 1.profile_b5表 bucket 5 共5個tablet 每個tablet 365M 2.profile_b20表 bucket 20 共20個tablet 每個tablet 95M 3.profile_b5_p5kw表 bucket 5 共30個tablet 每個tablet 67M 1)profile_b5_p5kw表中adpos_id、unit_id加bitmap索引。 2)profile_b5_p5kw表按PARTITION BY RANGE(`guid`) 每5kw一個分區(qū)。測試數(shù)據(jù)說明: Fragment 1有5個instance,下邊均采用ip為211的instance相關數(shù)據(jù)。 Fragment 0有1個instance,直接引用結果。 數(shù)據(jù)均為多次查詢后取相對合理且耗時較少的profile信息此測試前已有認知: 離線標簽采用profile+dup模型測試bitmap_union(to_bitmap(guid))性能,單BE 1個instance 1500W/s,to_bitmap耗時是bitmap_union耗時的2倍左右,兩個算子耗時主要由guid數(shù)量決定。 bitmap_union算子耗時與單個tablet內(nèi)guid集中度有關,guid取值范圍越集中性能越好,建表時采用Range guid分區(qū),步調(diào)1000W,bucket為1。

復制代碼

結論 1:測試 1/2 可知查詢耗時點為 Fragment 1 階段 Scan 操作含 merge-on-Read 過程[OLAP_SCAN_NODE]、to_bitmap[PROJECT_NODE]、bitmap_union[AGGREGATION_NODE],而 Fragment 0 階段因數(shù)據(jù)量很少所以耗時很少。

結論 2:測試 2/3 對比考慮優(yōu)化 Scan 耗時。增加 bucket 數(shù)量后,Scan 耗時明顯下降。tablet 數(shù)量增加引起 scan 并行度提高。doris_scanner_thread_pool_thread_num 默認 48,tablet 數(shù)量調(diào)整前后為 5->25 均在此范圍內(nèi),除 profile 信息外還可以通過 Manager 查看對應時間 Scan 相關監(jiān)控??筛鶕?jù)集群負載情況適當增加線程數(shù)用于提高查詢速度。

結論 3:測試 3/5 對比考慮優(yōu)化 bitmap_union 耗時并兼顧寫負載平衡。采用 Range guid 分區(qū),5kw 一個步調(diào),bucket 設為 5。每個 tablet 大約 1kw 數(shù)據(jù)量且差值低于 5kw,避免部分 guid 活躍度高帶來的單分區(qū)寫熱點問題。同為 5160W+數(shù)據(jù)量 bitmap_union 耗時減少約 700ms。

結論 4:測試 3/4 對比考慮加上 where 條件后的查詢耗時表現(xiàn),因返回數(shù)據(jù)量降低一個數(shù)量級 bitmap_union(to_bitmap(guid))耗時明顯減少,性能瓶頸主要表現(xiàn)在 Scan 階段。因增加 where 條件后多掃描了 grade 列,增加耗時部分主要消耗在此列的數(shù)據(jù)掃描和 merge 過程,暫無較好優(yōu)化方式。

(2)Fact + Dup 測試

實時場景 Fact + Agg/Uniq 和 Profile + Agg 情況差不多,相關優(yōu)化可結合上邊結論。針對離線場景 Fact + Dup 模型測試數(shù)據(jù)如下:

測試所用集群:32C 96G 1TSSD * 5臺,3個FE,5個BE,5個Broker。1.19.5版本表數(shù)據(jù):按日期天級別分區(qū)、3個分區(qū)有數(shù)據(jù),每個分區(qū)3.4億,DUPLICATE KEY(`guid`), DISTRIBUTED BY HASH(`guid`),其他字段見上邊建表sql。測試過程無數(shù)據(jù)寫入。dup表: bucket 5。共15個tablet,每個tablet 450M,單副本數(shù)據(jù)分布均勻,總大小6G左右dup_b5表: bucket 20 共60個tablet,每個tablet 110M,單副本數(shù)據(jù)分布均勻,總大小6G左右dup_bitmap表:bucket 5。共15個tablet,每個tablet 670M,單副本數(shù)據(jù)分布均勻,總大小9G左右,adpos_id、unit_id加bitmap索引測試數(shù)據(jù)說明: Fragment 2/1有5個instance,下邊均采用ip為211的instance相關數(shù)據(jù)。 Fragment 0有1個instance,直接引用結果。 數(shù)據(jù)均為多次查詢后取相對合理且耗時較少的profile信息。

復制代碼

結論 1:測試 1/2 可知查詢耗時點為:

Scan 過程[OLAP_SCAN_NODE]。兩階段 group by guid [Fragment2 AGGREGATION_NODE 和 Fragment1 的第一個 AGGREGATION_NODE]。group by 耗時主要為 HashTable 構建時間含 count(1)結果更新,本質(zhì)取決于 scan 返回數(shù)據(jù)條數(shù)以及 HashTableSize 大小 。to_bitmap[Fragment1 的第一個 PROJECT_NODE] 和 bitmap_union[Fragment1 的第二個 AGGREGATION_NODE] 算子,總體優(yōu)化思路見上邊測試結論。結論 2:測試 2/3 分析無論是否增加 bitmap 索引,查詢都有一定程度的下推到存儲層【simd filter】,增加 bitmap 索引但未應用,因區(qū)分度太低而不走 bitmap 索引【過濾條件枚舉值數(shù)量/總數(shù)據(jù)條數(shù) < 1/1000 ,可通過 bitmap_max_filter_ratio 參數(shù)調(diào)節(jié)】,但執(zhí)行計劃發(fā)生變化 bitmap 表少了一次 group by agg 操作,就總體查詢耗時變化不大。同時增加 bitmap 索引后存儲成本增加,所以不增加 bitmap 索引。

結論 3:[推測未做測試] 針對測試 1 DUPLICATE KEY(guid), DISTRIBUTED BY HASH(guid) ,如果不用 guid 作為排序列和分桶使數(shù)據(jù)分布均勻那么會因為每個節(jié)點都有全部 guid 導致 HashTableSize 基本為現(xiàn)在節(jié)點的 5 倍,進而影響查詢耗時會更長。

結論 4:測試 4 分析 fragment 1/2 實際并行度計算公式如下。適當增加 tablet 個數(shù)【partition、bucket】和 exec instance num 可以加快查詢速度。此加速過程會作用于結論 1 中全部耗時點。

當 tablet 個數(shù)【不含副本】小于 parallel_fragment_exec_instance_num * BE 個數(shù)時取 tablet 個數(shù)當 tablet 個數(shù)【不含副本】大于 parallel_fragment_exec_instance_num * BE 個數(shù)時取 exec_instance_num * BE 個數(shù)(3)kv + Agg 測試

此部分主要用于存儲標簽枚舉值較少的用戶集合,所以數(shù)據(jù)量并不多,基本 1s 內(nèi)返回。

根據(jù)查詢模板猜測當數(shù)據(jù)量較大時可能的性能瓶頸點主要:

Scan 過程[OLAP_SCAN_NODE]:bitmap 對象反序列化和 SegmentRead 過程。 可考慮用 enable_bitmap_union_disk_format_with_set 優(yōu)化。bitmap_union 算子,如果按照上邊優(yōu)化方案調(diào)整 bitmap 元素分布就需要在表中增加更多行的數(shù)據(jù)性能未必會好。需要測試看數(shù)據(jù)后選擇平衡。**(**4)補充說明

遇到的坑 :

查詢 bitmap_or(to_bitmap(字段 A),to_bitmap(字段 B)),字段 A/B 有空值時計算錯誤。通過 ifnull(to_bitmap(字段名),bitmap_empty())解決。Uniq 模型多副本排除外部干擾的情況下,5be 節(jié)點、無分區(qū)、bucket 為 5、副本數(shù)為 2,數(shù)據(jù)分布均勻、tablet 狀態(tài)正常。查詢時會出現(xiàn) 4 個 Be 節(jié)點工作,其中一個掃描 2 個 tablet,BE 接收的 task 分布不均勻的情況導致總體耗時變長。已反饋 StarRocks 同學。增加 where 條件后比全量掃描 Scan 耗時多不太合理。見 profile 類型性能測試結論 4 和 fact 類型性能測試結論 1 相關測試。應該可以通過 simd 過濾 where 部分數(shù)據(jù),這樣 merge 過程數(shù)據(jù)量就會減少可降低查詢耗時。已反饋 StarRocks 同學。測試為排除 be 任務調(diào)度不均勻的情況造成測試不準確,全部采用單副本進行。優(yōu)化思路主要是依據(jù)對 StarRocks 及其他 OLAP 技術的認識,猜測執(zhí)行過程思考優(yōu)化方式,結合具體測試并查看 explain、profile、manager 監(jiān)控來驗證效果迭代認識以達到優(yōu)化效果。3、實時標簽接入

實時標簽接入大概分為一個規(guī)范和三類 Flink 工具任務。規(guī)范指實時標簽計算后寫入指定 Kafka Topic 規(guī)范。三類 Flink 工具任務指 1. cuid->guid mapping 過程。2.根據(jù)標簽類型進行數(shù)據(jù)分發(fā)。3.各標簽數(shù)據(jù)獨立寫入到 StarRocks 表。注意全流程按照 cuid 做 kafka partition 分區(qū)保證順序。

(1)接入規(guī)范

標簽計算類任務將標簽結果統(tǒng)一輸出為如下格式,寫入指定 kafka topic,并按照 cuid 分區(qū)。

{"header":{"type":"", "cuid":"cuid"}, "body":{"xxx":"xxx",...}}type 表是標簽類型,全局唯一。sys_offline_cuid、sys_cguid_mapping 為 type 保留字用補數(shù)和新映射數(shù)據(jù)輸出。

body 為標簽的結果數(shù)據(jù),接入過程不做額外處理。

(2)mapping 過程

mapping 過程邏輯非常簡單就是獲取全局自增數(shù)值型 guid 和 cuid 形成一一映射關系。此過程大體存在如下幾步 1.查 task LRU 堆外內(nèi)存 2.內(nèi)存不存在查 codis 3.codis 不存在通過發(fā)號器取新號 4.逐層緩存 mapping 信息。

此過程穩(wěn)定性是整個系統(tǒng)的關鍵,結合作業(yè)幫已有的發(fā)號器和 codis 能力作為選型的主要參考。利用發(fā)號器產(chǎn)生全局唯一自增數(shù)值 id guid,利用 codis 存儲 cuid 與 guid 關系。為保證一一映射關系將 mapping 過程設計為一個 flink 任務。思考如下:

業(yè)務實際情況:

cuid 總量 14 億,日增百萬高峰期每小時新增 20W 每秒 30+。全量實時標簽數(shù)據(jù)最高 10W qps

理論資源測算:

發(fā)號器:默認支持 3W qps,數(shù)據(jù)第一次初始化耗時 13 小時,之后最高 30+qps 不需額外資源即可滿足需求。codis:14 億 mapping 數(shù)據(jù)存儲約 200G【未考慮 buffer 部分】,12 個 pod 每個 pod 16G 內(nèi)存大約可支持 50W qps。flink 任務:

qps 取決于上游 kafka 寫入的標簽數(shù)據(jù)量約 10W qps。

計算由近 N 個月活躍 cuid mapping 總內(nèi)存占用除以每個 task 500M 到 1G 堆外內(nèi)存得到數(shù)值 A,和上游 kafka 數(shù)據(jù) 10W qps 除以在確定內(nèi)存命中率時單個 task 可處理的 qps 得到數(shù)值 B,然后可算出 flink 并行度 max(A, B) + 對業(yè)務預期發(fā)展給予一定 buffer 決定。

上游 kafka topic 需按照 cuid 分區(qū)并且分區(qū)數(shù)最好為 flink 并行度的 3 倍以上【取決于后續(xù)新增標簽數(shù)據(jù)量】。

任務重啟后對 codis 產(chǎn)生的最大 qps 小于 10W,如果 flink task LRU 緩存足夠平時 codis qps 最高基本在 30+,就目前 codis 資源配置已滿足需求。

任務本身只關注 cuid,除 cuid 以外數(shù)據(jù)可不做解析。

潛在風險思考:

數(shù)據(jù)延遲:因使用場景更多用于觸達,一定程度的延遲可以接受,較大延遲觸發(fā)報警暫停觸達。cuid 臟數(shù)據(jù),當 guid 超過 Integer.MAX_VALUE 后 StarRocks bitmap 查詢性能下降。增加 cuid 嚴格校驗邏輯,根據(jù)業(yè)務實際情況設置每天 cuid 增量監(jiān)控,超過后人工排查,如果 cuid 臟數(shù)據(jù)不多時可不做處理,因錯誤 cuid 并不會收到觸達信息。如果 cuid 臟數(shù)據(jù)較多時需要重置發(fā)號器位置并恢復到某一時間點數(shù)據(jù)后重刷全部標簽、人群包數(shù)據(jù)。codis+發(fā)號器替換為 mysql 主鍵自增,此方案并未經(jīng)過實際測試就目前的場景是可以滿足需求的,弊端在于 flink 任務重啟后會對 mysql 造成比較大的沖擊【flink 增量 checkpoint 無人維護存儲所以暫未使用】,做好 mysql qps 限流后會造成一段時間的數(shù)據(jù)延遲。好處在于任務實現(xiàn)簡化同時可以避免一些特殊情況導致的同一 cuid 被分配多個 guid 造成數(shù)據(jù)錯誤的情況。(3)分發(fā)過程

根據(jù)標簽類型將 mapping 后的數(shù)據(jù)分發(fā)到獨立的 kafka topic,方便寫入 StarRocks 時表級別管控。

(4)入 StarRocks 過程

利用 flink-starrocks-connector 將標簽數(shù)據(jù)寫入 StarRocks。注意考慮寫入頻次、數(shù)據(jù)行數(shù)、數(shù)據(jù)大小等參數(shù)配置。

(5)cuid 離線補充映射

實時已接入激活標簽流數(shù)據(jù),為防止出現(xiàn)遺漏及第一次初始化數(shù)據(jù)采用小時級增量補實時未覆蓋的 cuid。

4、離線標簽接入

常規(guī)標簽數(shù)據(jù)當計算完成后可統(tǒng)一寫入指定的高表【建表語句見下方】中,以高表為媒介做到標簽開發(fā)和接入的解耦。帶有修飾、行為類標簽數(shù)據(jù)可直接利用基礎數(shù)倉表和標簽源數(shù)據(jù)信息完成自動接入。

(1)接入規(guī)范

離線接入大概分為兩類數(shù)據(jù)源,高表接入、數(shù)倉行為數(shù)據(jù)接入。

高表接入

標簽計算后寫入高表【已按 cuid 排重】,tagkv 為 map 結構,其中 key 為標簽名字。高表中如果存增量數(shù)據(jù)數(shù)據(jù)接入走增量邏輯,如果為全量標簽走全量接入邏輯。hive 建表 sqlcreate table picasso_all(

cuid string comment '同用戶唯一標識體系下的唯一 id',

tagkv Map<string, string> comment '組合標簽 kv 數(shù)據(jù)'

)

partitioned by (dt string, tagk string)

stored as parquet

數(shù)倉行為數(shù)據(jù)接入:

只能應用于單表且需包含 cuid(2)接入步驟任務入口:通過畫像服務接口獲取需要導入的目標表名字,然后通過調(diào)度系統(tǒng) api 創(chuàng)建并行接入任務,以下為每個任務的執(zhí)行邏輯 。狀態(tài)檢查:根據(jù)目標表名通過畫像服務接口獲取需要導入此表標簽對應的數(shù)據(jù)來源信息、hive 字段映射等信息【目前僅支持 hive 數(shù)據(jù)源】,檢查依賴數(shù)據(jù)狀態(tài)。數(shù)據(jù)校驗:以元數(shù)據(jù)配置規(guī)則為標準校驗標簽數(shù)據(jù),例如標簽枚舉值合理性、數(shù)值型標簽取值范圍、空值率等。數(shù)據(jù)組裝:根據(jù)不同業(yè)務場景利用 insert overwrite directory select 組裝數(shù)據(jù)【場景匹配 sql 模板、補充 guid 等】并寫入 cos/hdfs 等存儲。數(shù)據(jù)導入:建表/分區(qū),利用 StarRocks Broker Load 方式導入數(shù)據(jù)。原子切換:調(diào)用畫像服務接口,接口內(nèi)完成表相關字段校驗、與線上數(shù)據(jù)交換臨時分區(qū)/表,歸檔臨時分區(qū)/表用于回滾恢復現(xiàn)狀:刪除此過程中產(chǎn)生的臨時文件。(3)數(shù)據(jù)組裝四、未來規(guī)劃標簽內(nèi)容還需持續(xù)迭代,此部分主要為業(yè)務需求驅(qū)動。單用戶規(guī)則判定能力支持,用于解決例如某種活動、權益等參與資質(zhì)判定。標簽數(shù)據(jù)多表冗余,根據(jù)人群圈選 DSL 支持自動化路由查詢,以加快人群數(shù)計算速度。實時、離線標簽接入目前是通過通用化工具實現(xiàn),可考慮和調(diào)度系統(tǒng)、數(shù)據(jù)地圖系統(tǒng)打通進一步打通,實現(xiàn)標簽生產(chǎn)、接入平臺化。標簽準確是核心,為保證準確性還需要豐富標簽接入過程的數(shù)據(jù)校驗部分,支持更多數(shù)據(jù)校驗方式比如分布同環(huán)比等。

以上就是關于pos機素材設計,作業(yè)幫基于 StarRocks 畫像系統(tǒng)的設計及優(yōu)化實踐的知識,后面我們會繼續(xù)為大家整理關于pos機素材設計的知識,希望能夠幫助到大家!

轉發(fā)請帶上網(wǎng)址:http://www.rcqwhg.com/newsone/53546.html

你可能會喜歡:

版權聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。