主頁 >  其他 > ClickHouse 在 UBA 系統中的字典編碼優化實踐

ClickHouse 在 UBA 系統中的字典編碼優化實踐

2022-02-10 08:02:05 其他

ClickHouse UBA 版本是位元組跳動內部在開源版本基礎上為火山引擎增長分析專門深度定制優化的版本,本文介紹在字典編碼方向上的優化實踐,作者系位元組跳動資料平臺研發工程師 Jet He,長期致力于 OLAP 引擎開發優化,在 OLAP 領域、用戶行為在線分析等有豐富的經驗,

背景

雖然 ClickHouse 列存已經有比較好的存盤壓縮率,但面對海量資料時,磁盤空間的占用跟常用的 Parquet 格式相比仍然有不少差距,特別是對于低基數列時,Parquet 的存盤空間會更加有優勢,

同時,大多這類資料的事件屬性都有低基數的特征,例如事件屬性中的城市、性別、品牌等等,Parquet 會自動對低基數列做字典編碼,因此會獲得更高的存盤效率,

同時 ClickHouse 官方也提供了一種字典編碼的解決方案即 LowCardinality 型別,網上也有一些測驗 Benchmark 資料,效果不錯,可以進一步降低存盤空間和提升查詢、IO 性能,

上圖是內部 LowCardinality 的存盤結構,寫入程序中,會構建一個字典,列資料通過 Positions 表示,數值是字典中每個 Unique 值的 Index,其他更加詳細的介紹可以參考官方檔案,

但在內部環境中通過驗證測驗發現,原始的 LowCardinality 列存在以下兩個致命問題:

  1. 在 LowCardinality 列比較多的情況下(平均 300+),Part Merge 耗時嚴重,在大量實時寫入的場景下,Merge 速度跟不上寫入速度,最侄訓導致集群不可用;
  2. 用戶資料中事件屬性多種多樣,UBA 版本通過動態 Map 列實作用戶屬性的自由上報,也會導致某些屬性基數非常大,不再適合做字典編碼,否則會同時導致存盤、計算性能下降,

如果以上兩個問題得不到解決,那么字典編碼功能就無法上線使用,需要一種解決方案,能夠做到支持大量的列做字典編碼的同時需要保證內部 Part 的 Merge 速度,另外就是面對高基數列時需要一個 Fall back 方案,讓高基數列時不再做字典編碼,改用原始列存盤,原作者在做字典編碼技術分享時也提到了針對高基數列時 Fall back 到原始列的構想,但社區版本中目前沒有付諸實作,

解決方案

首先來看針對 LowCardinality 列 Part Merge 的優化方案,

這里先介紹下 ClickHouse 的 Part Merge 程序,ClickHouse 的資料組織是以 Part 形式存在的,每個 Part 對應磁盤的一個資料目錄,每次寫入都會生成一個 Part,Part 目錄下包含各個列的資料檔案,因此每次寫入的時候最好是大批量的寫入,才能有較好的寫入吞吐,

ClickHouse 有常駐 Worker 執行緒不斷的做 Part 的 Merge,將小 Part 不斷地 Merge 成大 Part,從而提升查詢性能,如果 Part 不能及時 Merge 會造成嚴重的性能問題,更有甚者還會造成 Inodes 耗盡,

當統一把事件屬性列(Map 列)改為 LowCardinality 列時,發現 Part Merge 耗時嚴重,Part 數會不斷增長,最侄訓導致集群不可用,通過 Profile 發現,在 LowCardinality 列 Part Merge 時,耗時主要發生在字典構造上,具體如下圖灰色部分所示:

即在做 Part Merge 程序中,首先會通過 Primary Key 列做排序,然后從每個 Part 中獲取對應的 Row 寫入到一個新的 Part 中,例如一次從 Part1 中取 3 行寫入到新 Part 中,下一次從 Part2 中取 5 行寫入到新 Part 中,寫入到新 Part 時,LowCardinality 首先做構建新的字典,并生成好倒排索引,形成一個新的 LowCardinality 列,然后通過 Column 的 Insert 介面完成寫入,另外在構建字典的程序中,是通過一個 HashTable 實作,這樣在做 Merge 時這塊的性能損耗較大,所以優化的關鍵點就是在于字典的構建程序,

這里實作了一種先構建字典后做具體 Merge 的思路,即多個 Part 的 Merge 程序中,詞典只需要構建一次,然后接下來的 Merge 只需要將 Index 直接 Append 寫入到新 Part 即可,

整個程序可以分為兩個程序:

01 -Dictionary Merge

首先進行字典的 Merge,在 Merge 的程序中,先將待 Merge 的幾個 Part 中的字典部分做 Merge,生成一個字典,同時記錄下每個 Part 這個列中 Index 的變化,這個變化類似一個轉換矩陣;

Index Merge 程序中將這個轉換矩陣逐個 Apply 到 Part 中的 Index,有時這個轉換矩陣為空,例如 Unique 值很少的列,基本可以保證每個 Part 的字典基本一樣,如果轉換矩陣為空這步操作會直接跳過,

02 -Index Merge

Index Merge 程序跟之前的 Merge 程序一致,只不過這里不再做字典構建了,會直接將列中的 Index Append 到新列的 Index 中,如下圖所示:

經過這個 Merge 優化后,LowCardinality 的 Merge 性能有明顯提升,在大量寫入的場景也能應付自如,寫入的 Part 可以得到及時 Merge,

具體的性能優化測驗資料如下表所示,Merge 速度的是在表寫入程序中統計得出,寫入大量大概 10 億左右:

可以看出在基數 10 萬以內時性能提升非常明顯,當基數 100 萬+時,性能提升不明顯,并且在 1000 萬時還會導致性能回退,這里也不難理解,因為當基數變大時,Merge 程序中轉換矩陣會變得很大,轉換矩陣的 Apply 的程序就會變成一個新的瓶頸點,解決這一問題的只有 Fall back 方案,即將高基數列自動不做字典編碼,

Fall back 方案在內部做了很多討論,也跟原作者討論了可能的實作方案,

最終通過 LowCardinality 內部封裝的方式實作,如下圖所示:

Stream 可以理解為檔案流,通過 Version 值標識該列是否是已經是 Fall back 的列,

內部復用了 Index Stream,如果發生了 Fall back 那么這個 Stream 里面的值便是原始列的值,Fall back 可以發生在實時寫入程序中和 Part Merge 程序中,如果此列發生了 Fall back 后續的所有 Part 都將是 Fall back 的,

Fall back 后,一個高基數列的 Merge 速度和存盤性能對比,連續寫入 1 億條記錄的統計:

從表中可以看出,Fall back 后的列基本跟原始列性能接近,至少保證 Merge 和存盤性能沒有退化,如果不做 Fall back,存盤空間占用會比原始列還要多,Merge 性能無法支撐實時寫入,

通過 Merge 優化和自動 Fall back 解決了 LowCardinality 列的兩大絆腳石,接下來看下我們在內部一些大應用上的測驗驗證效果,

性能驗證

下面是在內部某些大 APP 上的驗證結果,

1、磁盤占用

資料表是內部某些 APP 某個時間段的資料,

從上表中可以看出,列越多,資料量越大,存盤空間下降就會越明顯,最高可以節省一半的資料存盤空間,在資料量非常的大 APP 場景下,上線 LowCardinality 后可以節省大量的存盤資源,

2、針對某個 APP,獲取其典型的 10 個業務 SQL,做查詢性能測驗,

下面是兩個資料表分別查詢的對比測驗結果:

從上圖可以看出,有兩個 SQL 導致查詢性能有回退現象,其余 SQL 都是 LowCardinality 的表查詢性能更優,耗時更短,

3、10 個查詢對應的磁盤資料讀取量:

可以看出,基本上所有 SQL 讀取的資料量都有明顯的減少,對磁盤 IO 的壓力會降低很多,SQL8 對應的查詢列已經做了 Fall back,所以跟原始列讀取資料量持平,

下圖是查詢時對應的記憶體使用量:

其中除了 SQL8 發生了 Fall back 外,其他查詢均是 LowCardinlity 表記憶體使用量較大,由于 LowCardinality 列計算程序中,如 filter,需要讀取的 Part 字典并將列反解出來,每個 Part 的字典是獨立存在的,這樣在計算程序中會多占用些記憶體,這塊也是后續優化的重點,

小結

目前 ClickHouse UBA 版已經全面啟用了字典編碼列,并且在火山引擎增長分析(DataFinder)服務的多個客戶環境中已經上線,

從實踐反饋看,我們為客戶節省了大量存盤資源,同時在大多數場景下查詢性能也有提升明顯,總體上由于字典位于每個 Part 中獨立存盤,查詢程序中無法做到在壓縮域直接計算,因而會造成個別場景下查詢性能不佳,并且記憶體使用量上會增加,

下一步作業的重點將是優化 LowCardinality 的計算程序,例如把字典做成 Part 間共享的,可以減少計算程序中記憶體占用,進一步擴展復雜場景在可以直接在壓縮域做計算,

參考文獻

https://github.com/yandex/clickhouse-presentations/raw/master/meetup19/string_optimization.pdf

https://clickhouse.com/docs/en/sql-reference/data-types/lowcardinality/

火山引擎增長分析

一站式用戶分析與運營平臺,為企業提供數字化消費者行為分析洞見,優化數字化觸點、用戶體驗,支撐精細化用戶運營,發現業務的關鍵增長點,提升企業效益,

歡迎關注同名公眾號「位元組跳動資料平臺」

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423588.html

標籤:其他

上一篇:虎年開工大吉

下一篇:資料結構 - 陣列

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more