當前位置:
首頁 > 科技 > ColumnStore在大數據中的應用實踐

ColumnStore在大數據中的應用實踐

作者 | 陳興隆


責編 | 仲培藝


隨著企業數據量急速增長,為了滿足業務需求,大數據統計早已成為迫切的需求。在引擎排行榜上MySQL已經長期處於第二,但大數據統計並沒有明顯突破。


MySQL解決方案包括Infobright、Greenplum、Spark等,與之更為密切的是Infobright,但是多表連接場景下,性能會大幅下降(且特殊功能需要付費)。而ColumnStore的出現則彌補了此處的空缺,是MariaDB在OLAP領域解決方案的突破。ColumnStore是InfiniDB與MariaDB 10.1的結合體,目前已經GA,擁有計算能力及存儲線性擴展、高壓縮比、MySQL協議兼容、自動水平和垂直分區、擴展窗口函數等特點。如果你正在尋找性能及存儲線性擴展、學習成本低、易維護且兼具數據安全及審計的數據倉庫解決方案,相信ColumnStore會給你帶來不小的驚喜。


圖1是來自官方的ColumnStore結構圖。

ColumnStore在大數據中的應用實踐



圖1 ColumnStore架構圖


UM:MariaDB SQL FRONT End(User Module);


PM:Distributed Query Engine(Performance Module);


整體架構分為計算層和存儲層,都是可擴展的,計算層需由以下幾項主要進程構成:


MariaDB(mysqld):收集用戶請求的一個SQL入口,存儲元數據信息;


Execution Manager:解析語法樹,轉化成任務列表(JOB LIST),包括優化、取數據、(HASH)JOIN、匯總、分組;


DMLProc/DDLProc:將DML/DDL語句發送到指定的PM執行;


Performance Module:接受Execution Manager發送過來的任務調度,分布式掃描,(HASH)JOIN與匯總。

由此,我們能清晰地理解整個處理流程:MariaDB收到用戶的SQL請求後,通過執行管理器將SQL轉化為任務列表,再由DMLProc/DDLProc發送任務給PM,最後PM將結果返回給UM進行匯總,返回結果給客戶端。


優勢


存儲、性能、兼容、擴展


為了解決在大數據統計性能上的問題,對比了Infobright和ColumnStore兩種解決方案,最終選取了ColumnStore,對比如下:


表1 數倉方案對比表

ColumnStore在大數據中的應用實踐



1. 對於存儲而言,InnoDB本身的壓縮率並不高,有1倍左右。相比之下,Infobright的壓縮率相對最高,有20倍之多;而ColumnStore則比較適中,為5倍左右。如果為了追求高壓縮比的歷史數據存檔,很明顯使用Infobright社區版是很好的方案。


2. InnoDB自身的擴展性並不高,需要外部中間件來實現分庫分表,因此給予擴展性低的評價;Infobright也可以部署集群,因此擴展性給予高評分;同樣ColumnStore也是易於擴展的分布式方案。


3. 在性能方面,InnoDB的OLTP性能遠高於後兩者,在數據倉庫中提供在線服務,可以考慮用InnoDB來存儲,但統計性能則相差甚遠;由於Infobright中存在Knowledge Grid(知識網格),又使用了列式存儲來壓縮數據,在數據量超過內存容量的情況下,對單列的統計表現卓越,100倍性能提升就成了極輕鬆的事,但如果統計欄位增加或多表查詢,性能也就極速下降;ColumnStore不僅擁有單列高速統計的優勢,而且在多表連接的場景下也表現不俗,當然欄位越多性能同樣會下降,但下降後的速度仍可以接受。

4. Infobright的社區版不支持DML,因此語法兼容性存在很大問題,對查詢的支持尚佳;ColumnStore本身開源,但語法也略有不同,例如多表連接時,不能對同一個表進行多次連接,分組查詢欄位(SELECT COLUMN LIST)必須要在分組列表(GROUP BY LIST)中。


窗口函數


窗口函數(Windowing Function)在數倉的場景下非常有用,當分析App中的行為路徑時,很簡單地就能把用戶的使用路徑串聯起來。


性能優勢


想了解ColumnStore的性能表現,請移步 Percona的性能測試對比(https://www.percona.com/blog/2010/01/07/star-schema-bechmark-infobright-infinidb-and-luciddb/)


限制


數據類型不一致


InnoDB支持的數據類型有:


TINYINT/SMALLINT/MEDIUMINT/INT或INTEGER/BIGINT


FLOAT/DOUBLE/DECIMAL

CHAR/VARCHAR/TINYBLOB/BLOB/MEDIUMBLOB/LOGNGBLOB/TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT/VARBINARY/BINARY


DATE/TIME/YEAR/DATETIME/TIMESTAMP


ENUM/SET


ColumnStore支持的數據類型為:


TINYINT/SMALLINT/INT或INTERGER/BIGINT


FLOAT/DOUBLE/DEAL/DECIMAL或NUMBER


CHAR/VARCHAR


DATE/DATETIME


通過對比可知,ColumnStore不支持的數據類型有:MEDIUMINT、BLOB、TEXT、BINARY、TIMESTAMP/TIME/YEAR、ENUM/SET


不支持的數據類型,我們通過類型轉換來保證兼容,規則如表2所示:

表2 類型轉換對照表

ColumnStore在大數據中的應用實踐



字元類型長度限制


ColumnStore的字元串類型欄位長度最長為8000,否則報語法錯誤。也許在ColumnStore工程師的眼中,過長的字元不具有很好的分析意義,加之如果文本過大,應該不利於列式存儲發揮壓縮統計的優勢,這可能正是8000長度限制的由來(純屬個人猜測)。大多數場景下,需要把過長的文本截斷以保證系統之間的兼容性。如果業務對此類文本內容依賴較強,建議在原數據中拆分為多行處理。


表總欄位總長度限制


對於長度的限制,不僅欄位的長度有限制,一個表中多個欄位長度總和也有限制。雖然碰見的情況比較少,但也不容忽視。


中文字元長度的限制


MySQL的老司機都知道,MySQL在早期版本里字元串長度的定義為位元組長度(一個漢字佔用三個位元組),後面的版本才定義為字元數(一個漢字佔用一個長度),但ColumnStore或者InfiniDB都佔用三個位元組。如果你的中文字元串莫名其妙地被截斷了,很可能是出現了這個問題,即VARCHAR(3)類型欄位只能存儲一個漢字。


窗口函數的視圖

如果SQL中包含了窗口函數,那麼在創建視圖時會報錯。


建表限制


不支持primary key/auto_increment/index等DDL語句,表名不支持關鍵字。


建議


由於碰到了ColumnStore如此多的限制,使用者很容易出錯,建議自己寫腳本將建表、數據抽取做到自動化,省時省力,其中可能包含的功能建議:


創建表結構


欄位數據類型轉換


欄位長度轉換


資料庫/表名稱變更:


有了以上四點,就不用人工審核每個欄位應該用什麼類型和多大的長度,如果表名字還是個關鍵字(那就更糟糕了),只有把名字改掉了,比如可以加個前綴。

多線程數據抽取


數據增量抽取


當數據量到一定程度,從原資料庫抽取數據會成為瓶頸,此時如果能多線程抽取,那可謂如虎添翼。之前等2個小時才能抽取完的任務,現在10分鐘就搞定。如果再加上增量抽取,那便可以再節省5分鐘。


欄位忽略


前面講過,ColumnStore的欄位長度和表總寬度有限制,但我們不能控制業務表設計,因而只能適應,所以如果有了欄位忽略的功能,把沒有分析統計意義的欄位直接忽略掉,數據就可以很愉快地抽取起來了。


參考


窗口函數


https://www.percona.com/live/mysql-conference-2014/sessions/windowing-functions-mysql-infinidb


性能對比


https://www.percona.com/blog/2010/01/07/star-schema-bechmark-infobright-infinidb-and-luciddb/

https://www.percona.com/blog/2017/03/17/column-store-database-benchmarks-mariadb-columnstore-vs-clickhouse-vs-apache-spark/


結構簡介


http://mt.sohu.com/20161216/n476022933.shtml


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

支持自動水平拆分的高性能分布式資料庫TDSQL
为什么我要改用Kotlin
Yelp是如何做到每天運行成千上萬個測試
2022年國外十大技術預測

TAG:CSDN |

您可能感興趣

你的iCloud數據可能存儲在Google Cloud中
TalkingData:曝光iPhoneX真實在用量數據
如何在TensorFlow中高效使用數據集
你的數據存在了iCloud,而iCloud在用Google雲服務保存它們
Fitbit將用Google Cloud,把數據提供給醫生
uCloudlink 推出創新移動數據服務 「GlocalMe Inside」
淺談大數據Bigtable與MapReduce、GFS有何聯繫
如果Facebook告訴你 你的數據被Cambridge Analytica使用
基於Markov Chain Monte Carlo的智能手錶睡眠數據分析
除了Facebook和Intel,還有誰在數據中心使用OCP設備?
Young Academy:unleash young的群體智慧,解碼26個月長PFS數據背後的真相
Spring Boot與Kotlin使用Spring-data-jpa簡化數據訪問層
阻止Facebook跟蹤數據的Firefox開源插件Facebook Container
Veritas收購雲數據管理公司fluid Operations AG
Salesforce數據現在可以導入到Google Analytics 360中了
Women in Data Science Beijing:與數據科學的美妙邂逅
教你在Python中用Scikit生成測試數據集
Illumina收購Edico Genome,加速基因組數據分析
數據挖掘平台Discover解鎖Tensorflow
Google在大數據上發布的下一件大事件:BigQuery服務