<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于 Flink + ClickHouse 打造輕量級點(diǎn)擊流實(shí)時數(shù)倉

          共 2802字,需瀏覽 6分鐘

           ·

          2021-05-01 23:53

          Flink 和 ClickHouse 分別是實(shí)時計算和(近實(shí)時)OLAP 領(lǐng)域的翹楚,也是近些年非常火爆的開源框架,很多大廠都在將兩者結(jié)合使用來構(gòu)建各種用途的實(shí)時平臺、實(shí)時數(shù)倉,效果很好。關(guān)于兩者的優(yōu)點(diǎn)就不再贅述,本文來簡單介紹筆者團(tuán)隊在點(diǎn)擊流實(shí)時數(shù)倉方面的一點(diǎn)實(shí)踐經(jīng)驗(yàn)。


          點(diǎn)擊流及其維度建模


          所謂點(diǎn)擊流(click stream),就是指用戶訪問網(wǎng)站、App 等 Web 前端時在后端留下的軌跡數(shù)據(jù),也是流量分析(traffic analysis)和用戶行為分析(user behavior analysis)的基礎(chǔ)。點(diǎn)擊流數(shù)據(jù)一般以訪問日志和埋點(diǎn)日志的形式存儲,其特點(diǎn)是量大、維度豐富。以我們一個中等體量的普通電商平臺為例,每天產(chǎn)生約 200GB 左右、數(shù)十億條的原始日志,埋點(diǎn)事件 100+ 個,涉及 50+ 個維度。

          按照 Kimball 的維度建模理論,點(diǎn)擊流數(shù)倉遵循典型的星形模型,簡圖如下。


          點(diǎn)擊流數(shù)倉分層設(shè)計


          點(diǎn)擊流實(shí)時數(shù)倉的分層設(shè)計仍然可以借鑒傳統(tǒng)數(shù)倉的方案,以扁平為上策,盡量減少數(shù)據(jù)傳輸中途的延遲。簡圖如下。


          • DIM 層:維度層,MySQL 鏡像庫,存儲所有維度數(shù)據(jù)。
          • ODS 層:貼源層,原始數(shù)據(jù)由 Flume 直接進(jìn)入 Kafka 的對應(yīng) topic。
          • DWD 層:明細(xì)層,通過 Flink 將 Kafka 中數(shù)據(jù)進(jìn)行必要的 ETL 與實(shí)時維度 join 操作,形成規(guī)范的明細(xì)數(shù)據(jù),并寫回 Kafka 以便下游與其他業(yè)務(wù)使用。再通過 Flink 將明細(xì)數(shù)據(jù)分別寫入 ClickHouse 和 Hive 打成大寬表,前者作為查詢與分析的核心,后者作為備份和數(shù)據(jù)質(zhì)量保證(對數(shù)、補(bǔ)數(shù)等)。
          • DWS 層:服務(wù)層,部分指標(biāo)通過 Flink 實(shí)時匯總至 Redis,供大屏類業(yè)務(wù)使用。更多的指標(biāo)則通過 ClickHouse 物化視圖等機(jī)制周期性匯總,形成報表與頁面熱力圖。特別地,部分明細(xì)數(shù)據(jù)也在此層開放,方便高級 BI 人員進(jìn)行漏斗、留存、用戶路徑等靈活的 ad-hoc 查詢,這些也是 ClickHouse 遠(yuǎn)超過其他 OLAP 引擎的強(qiáng)大之處。


          要點(diǎn)與注意事項(xiàng)


          Flink 實(shí)時維度關(guān)聯(lián)


          Flink 框架的異步 I/O 機(jī)制為用戶在流式作業(yè)中訪問外部存儲提供了很大的便利。針對我們的情況,有以下三點(diǎn)需要注意:

          • 使用異步 MySQL 客戶端,如 Vert.x MySQL Client。
          • AsyncFunction 內(nèi)添加內(nèi)存緩存(如 Guava Cache、Caffeine 等),并設(shè)定合理的緩存驅(qū)逐機(jī)制,避免頻繁請求 MySQL 庫。
          • 實(shí)時維度關(guān)聯(lián)僅適用于緩慢變化維度,如地理位置信息、商品及分類信息等。快速變化維度(如用戶信息)則不太適合打進(jìn)寬表,我們采用 MySQL 表引擎將快變維度表直接映射到 ClickHouse 中,而 ClickHouse 支持異構(gòu)查詢,也能夠支撐規(guī)模較小的維表 join 場景。未來則考慮使用 MaterializedMySQL 引擎(當(dāng)前仍未正式發(fā)布)將部分維度表通過 binlog 鏡像到 ClickHouse。


          Flink-ClickHouse Sink 設(shè)計


          可以通過 JDBC(flink-connector-jdbc)方式來直接寫入 ClickHouse,但靈活性欠佳。好在 clickhouse-jdbc 項(xiàng)目提供了適配 ClickHouse 集群的 BalancedClickhouseDataSource 組件,我們基于它設(shè)計了 Flink-ClickHouse Sink,要點(diǎn)有三:

          • 寫入本地表,而非分布式表,老生常談了。
          • 按數(shù)據(jù)批次大小以及批次間隔兩個條件控制寫入頻率,在 part merge 壓力和數(shù)據(jù)實(shí)時性兩方面取得平衡。目前我們采用 10000 條的批次大小與 15 秒的間隔,只要滿足其一則觸發(fā)寫入。
          • BalancedClickhouseDataSource 通過隨機(jī)路由保證了各 ClickHouse 實(shí)例的負(fù)載均衡,但是只是通過周期性 ping 來探活,并屏蔽掉當(dāng)前不能訪問的實(shí)例,而沒有故障轉(zhuǎn)移——亦即一旦試圖寫入已經(jīng)失敗的節(jié)點(diǎn),就會丟失數(shù)據(jù)。為此我們設(shè)計了重試機(jī)制,重試次數(shù)和間隔均可配置,如果當(dāng)重試機(jī)會耗盡后仍然無法成功寫入,就將該批次數(shù)據(jù)轉(zhuǎn)存至配置好的路徑下,并報警要求及時檢查與回填。

          當(dāng)前我們僅實(shí)現(xiàn)了 DataStream API 風(fēng)格的 Flink-ClickHouse Sink,隨著 Flink 作業(yè) SQL 化的大潮,在未來還計劃實(shí)現(xiàn) SQL 風(fēng)格的 ClickHouse Sink,打磨健壯后會適時回饋給社區(qū)。另外,除了隨機(jī)路由,我們也計劃加入輪詢和 sharding key hash 等更靈活的路由方式。

          還有一點(diǎn)就是,ClickHouse 并不支持事務(wù),所以也不必費(fèi)心考慮 2PC Sink 等保證 exactly once 語義的操作。如果 Flink 到 ClickHouse 的鏈路出現(xiàn)問題導(dǎo)致作業(yè)重啟,作業(yè)會直接從最新的位點(diǎn)(即 Kafka 的 latest offset)開始消費(fèi),丟失的數(shù)據(jù)再經(jīng)由 Hive 進(jìn)行回填即可。

          ClickHouse 數(shù)據(jù)重平衡


          ClickHouse 集群擴(kuò)容之后,數(shù)據(jù)的重平衡(reshard)是一件麻煩事,因?yàn)椴淮嬖陬愃?HDFS Balancer 這種開箱即用的工具。一種比較簡單粗暴的思路是修改 ClickHouse 配置文件中的 shard weight,使新加入的 shard 多寫入數(shù)據(jù),直到所有節(jié)點(diǎn)近似平衡之后再調(diào)整回來。但是這會造成明顯的熱點(diǎn)問題,并且僅對直接寫入分布式表才有效,并不可取。

          因此,我們采用了一種比較曲折的方法:將原表重命名,在所有節(jié)點(diǎn)上建立與原表 schema 相同的新表,將實(shí)時數(shù)據(jù)寫入新表,同時用 clickhouse-copier 工具將歷史數(shù)據(jù)整體遷移到新表上來,再刪除原表。當(dāng)然在遷移期間,被重平衡的表是無法提供服務(wù)的,仍然不那么優(yōu)雅。如果大佬們有更好的方案,歡迎交流。


          The End


          作者:LittleMagic

          原文:jianshu.com/p/bedead165403

          推薦閱讀:

          世界的真實(shí)格局分析,地球人類社會底層運(yùn)行原理

          企業(yè)IT技術(shù)架構(gòu)規(guī)劃方案

          華為內(nèi)網(wǎng)最火的文章:什么是內(nèi)卷?

          不是你需要中臺,而是一名合格的架構(gòu)師(附各大廠中臺建設(shè)PPT)

          【中臺實(shí)踐】華為大數(shù)據(jù)中臺架構(gòu)分享.pdf

          阿里達(dá)摩院《機(jī)器學(xué)習(xí)算法學(xué)習(xí)指南》火了,限時開放下載!

          小米用戶畫像實(shí)戰(zhàn),48頁P(yáng)PT下載

          華為大數(shù)據(jù)解決方案(PPT)

          瀏覽 69
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费一二区| 成人无码视频在线观看 | 国模在线视频 | 美女性高潮视频 | 亚洲国产精品视频免费看 |