遷移HBase至Hologres
本文為您介紹如何遷移HBase的語法和數(shù)據(jù)至Hologres上進(jìn)行數(shù)據(jù)開發(fā)。
背景信息
Hologres支持行存表模式,在該模式下,提供高性能基于主鍵的點(diǎn)查能力,廣泛應(yīng)用在Flink維度表、ID-Mapping、標(biāo)簽獲取、訂單明細(xì)查詢等場景中。相比傳統(tǒng)的HBase等技術(shù),Hologres保留了橫向擴(kuò)展能力和高性能的主鍵點(diǎn)查能力,同時解決了Schema Free帶來的數(shù)據(jù)質(zhì)量管理難題,也通過更少的外部依賴提升了系統(tǒng)的穩(wěn)定性。支持寬表設(shè)計、多流合并、前綴掃描(Prefix Scan)等多種HBase常用場景。支持針對HBase接口平滑遷移的SDK。您可以從HBase遷移表和數(shù)據(jù)至Hologres獲取更好的數(shù)據(jù)開發(fā)體驗(yàn)。
Hologres與HBase對比
Hologres與HBase產(chǎn)品特性對比如下。
能力 | HBase | Hologres | |
產(chǎn)品定位 | 分布式面向列簇的開源數(shù)據(jù)庫。 | 云原生分布式實(shí)時數(shù)倉。 | |
系統(tǒng)架構(gòu) | 存儲計算耦合,存儲依賴底層Hadoop分布式文件系統(tǒng)(HDFS),HDFS集群需要手動擴(kuò)容。HBase表根據(jù)Region大小進(jìn)行分區(qū),分別存儲在集群不同的節(jié)點(diǎn)上。 | 計算節(jié)點(diǎn)采用海量并行處理(MPP,Massively Parallel Processing)架構(gòu),基于存儲計算分離(Storage Disaggregation),計算和存儲資源獨(dú)立擴(kuò)展,支持根據(jù)不同業(yè)務(wù)場景對計算能力和存儲空間進(jìn)行配比,更加靈活、經(jīng)濟(jì)。 | |
多態(tài)存儲 | 僅支持行存,以 | 支持行存儲,列存儲,行列共存多種模式。多態(tài)存儲可以根據(jù)數(shù)據(jù)訪問模式的不同而使用靈活的存儲方式。 | |
Schema表達(dá)能力 | 弱Schema,弱數(shù)據(jù)類型。 | 強(qiáng)Schema,豐富的數(shù)據(jù)類型。強(qiáng)Schema可以保證開發(fā)的效率,在數(shù)據(jù)質(zhì)量不可靠,數(shù)據(jù)接口不明確的情況下,更易于通過Schema排查開發(fā)問題。 | |
全局排序 | 全局排序 | 局部排序,聚簇索引。 | |
分片策略 | 支持預(yù)先分片和自動分片的模式。 | 支持哈希(Hash)和隨機(jī)分片的模式。 | |
批量導(dǎo)入 | 支持,BulkLoad接口。 | 支持,BulkLoad接口(COPY)。 | |
實(shí)時寫入 | 支持,寫入即可查。寫入系統(tǒng)吞吐量(TPS)受限于Compaction性能。 | 支持,寫入即可查。高TPS寫入。 | |
實(shí)時更新 | 支持。 | 支持。 | |
SQL支持 | 通過Phoenix擴(kuò)展支持,功能弱,不支持Join。受限于鍵值對(KV)存儲模式,SQL性能弱。 | 高度兼容PostgreSQL:協(xié)議兼容、語法兼容、生態(tài)兼容。 | |
存儲能力 | 基于HDFS,用戶自行維護(hù)集群,集群會自動同步數(shù)據(jù)至多副本,存儲能力與集群規(guī)模有關(guān),支持線性擴(kuò)展,LSM-Tree數(shù)據(jù)結(jié)構(gòu),多種壓縮算法。 | 基于分布式文件系統(tǒng)Pangu/HDFS,存儲能力與集群規(guī)模有關(guān),支持線性擴(kuò)展,單表最大容量3PB+;多種存儲模式和多種壓縮算法賦能存儲。 | |
查詢及分析能力 | 原生僅支持點(diǎn)查 | 億級以上數(shù)據(jù),實(shí)時查詢及分析亞秒級響應(yīng);Join能力強(qiáng)大。點(diǎn)查QPS高。支持OLAP場景。 | |
聯(lián)邦計算 | 不支持。 | 支持離線實(shí)時聯(lián)邦計算,支持MaxCompute、OSS等外部表查詢加速。 | |
備份及容災(zāi) | 支持,在數(shù)據(jù)方面,具備大數(shù)據(jù)標(biāo)準(zhǔn)三副本保障。 | 支持,在數(shù)據(jù)方面,具備大數(shù)據(jù)標(biāo)準(zhǔn)三副本保障。 | |
查詢語言 | 查詢語言 | Java API(需要與其他框架共同使用,例如Apache Phoenix)。 | PostgreSQL,無需額外結(jié)合其他組件和框架即可使用支持完備的SQL語法,DDL對象也更豐富,支持全Join關(guān)聯(lián)查詢。 |
DDL | 支持(關(guān)鍵字:create,alter,drop,describe,list;對象:namespace,table,column family)。 | 支持(關(guān)鍵字:create,alter,drop;對象:database,table,view,schema,cast,extension,role,user,user mapping,group)。 | |
DML | 支持(關(guān)鍵字:put,get,scan,delete,truncate)。 | 支持(關(guān)鍵字:select,insert,update,delete)。 | |
DCL | 支持(關(guān)鍵字:grant,revoke,rollback)。 | 支持(關(guān)鍵字:grant,revoke,rollback)。 | |
運(yùn)維 | 需自行運(yùn)維。 | 全托管,系統(tǒng)自動化感知集群的拓?fù)湫畔⒆兓脩魝?cè)無感知。 | |
生態(tài) | HBase兼容Hadoop生態(tài)。 | Hologres高度兼容PostgreSQL生態(tài)。 | |
適用場景 | 海量存儲,非結(jié)構(gòu)化存儲,單點(diǎn)查詢性能優(yōu)異,寫密集型數(shù)據(jù)庫。 | 實(shí)時數(shù)倉,在線數(shù)據(jù)服務(wù)。聯(lián)通數(shù)據(jù)孤島,海量數(shù)據(jù)實(shí)時查詢及分析,彈性擴(kuò)展集群,完整SQL支持。 | |
開發(fā)方式 | 應(yīng)用開發(fā)復(fù)雜,需要將業(yè)務(wù)分析的指標(biāo)、維度、表、聚合等概念,轉(zhuǎn)化為存儲的KeyValue概念,將應(yīng)用層查詢過濾場景翻譯為對Key的字節(jié)過濾操作,系統(tǒng)效率嚴(yán)重依賴Key設(shè)計的質(zhì)量。整個系統(tǒng)從數(shù)據(jù)錄入到數(shù)據(jù)分析查詢等復(fù)雜多樣的場景,依賴應(yīng)用層對KeyValue基礎(chǔ)接口的使用。 | 應(yīng)用開發(fā)簡單,面向Table開發(fā),使用SQL標(biāo)準(zhǔn)語句,適用于復(fù)雜多維分析,嵌套查詢,關(guān)聯(lián)查詢等場景。提供JDBC、ODBC接口,面向數(shù)據(jù)主題建模開發(fā)。從面向指標(biāo),面向?qū)挶黹_發(fā),轉(zhuǎn)化為Hologres面向主題域建模,減少了數(shù)據(jù)模型在采集端、處理端、分析端的異構(gòu)信息衰減,減少了數(shù)據(jù)加工的層次,提高了數(shù)據(jù)使用的靈活性。 |
語法遷移
SQL語法和常見命令映射
Hologres支持HBase常見的基本語法,并提供SQL接口,以及Hologres Client客戶端SDK。
HBase語法
Hologres語法
客戶端命令
PUT
insert into values on conflict
HoloClient.put(Put(表名,主鍵值,數(shù)據(jù)列的值))
DELETE
delete from
HoloClient.put(Delete(表名,主鍵值))
SCAN
select from where filter=XX
HoloClient.scan(Scan(表名,主鍵值+主鍵范圍,返回列))
GET
select from where PK=XX
HoloClient.get(Get(表名,主鍵值,返回列))
寬表設(shè)計
寬表是HBase最基本的數(shù)據(jù)模型,在Hologres中使用行存表,有關(guān)行存表的設(shè)計方案,請參見Key/Value查詢場景最佳實(shí)踐。
行存表可以支持3000列,列存表的列不建議超過1000列。
由于TEXT類型會默認(rèn)創(chuàng)建Bitmap索引和字典編碼,因此對于超多列場景,不建議使用默認(rèn)設(shè)置,建議手工配置需要的Bitmap索引和字典編碼。
多流合并
多流合并是利用Hologres的局部更新能力,多個數(shù)據(jù)流同時寫入單一表,通過表的主鍵實(shí)現(xiàn)Merge即Join的效果。有關(guān)多流合并的實(shí)踐請參見Flink全托管概述。
前綴掃描
前綴掃描是利用HBase的前綴順序特性,高效率過濾數(shù)據(jù),在Hologres通過Distribution Key和Clustering Key的設(shè)計實(shí)現(xiàn)相同的過濾效果。
假如HBase的rowkey為
[hash(pk0, pk1), pk0, pk1,..., pkN]
,Hologres應(yīng)設(shè)置Primary Key為(pk0, pk1,..., pkN)
、Distribution Key為(pk0, pk1)
、Clustering Key與Primary Key保持一致。那么支持前綴equals掃描的SQL如下:
WHERE pk0=? AND pk1=? AND ... AND pkX=? ;
支持前綴range掃描的SQL如下:
WHERE pk0=? AND ... AND pkX=? AND pkX+1 BETWEEN ? AND ?;
如果表的主鍵為
(rowkey, ts)
,查詢命令如下:SELECT col1, col2, ts FROM tbl WHERE rowkey = '1234567890' AND ts BETWEEN 1637637479606 AND 1640229479607 LIMIT 100;
這種條件下,適合Distribution key設(shè)計為rowkey,Clustering key設(shè)計為
(rowkey, ts)
的組合鍵。如果表的主鍵為 (rowkey, ts),查詢命令如下:
SELECT col1, col2, ts FROM tbl WHERE rowkey = '1234567890' AND ts = 1637637479606;
這種條件下,適合Distribution key設(shè)計為
(rowkey, ts)
, Clustering key設(shè)計為(rowkey, ts)
的組合鍵。
批量更新
Hologres支持Insert、Update、Insert on Conflict等多種更新方式,支持行更新、列更新和Upsert等場景,在實(shí)現(xiàn)批量更新場景下,寫入更新的吞吐量比較大,有可能影響線上對延遲敏感的在線服務(wù),這種情況建議通過寫入臨時表再原子替換的方式實(shí)現(xiàn)批量更新,類似BulkLoad模式,示例如下。
--假設(shè)線上服務(wù)的表為 t_online; --創(chuàng)建臨時表 BEGIN; CREATE TABLE t_tmp ( ... ) COMMIT; --向臨時表寫入數(shù)據(jù) INSERT INTO t_tmp SELECT * FROM t_offline; --更新統(tǒng)計信息 vacuum t_tmp; analyze t_tmp; --在事務(wù)中,實(shí)現(xiàn)原子替換 BEGIN; ALTER TABLE t_online rename TO t_online_outdate; ALTER TABLE t_tmp rename TO t_online; COMMIT; --延遲5s,讓針對老表上的查詢結(jié)束再刪除無用數(shù)據(jù) SELECT pg_sleep(5); DROP TABLE t_online_outdate;
OLAP
Hologres不僅支持行存主鍵點(diǎn)查,也支持OLAP場景,在存儲上,可以設(shè)計為行列共存模式,在查詢時,查詢引擎根據(jù)查詢特征,選擇最佳的存儲結(jié)構(gòu),詳情請參見CREATE TABLE。