1躬存、Hbase簡(jiǎn)介
Hbase(Hadoop Database的簡(jiǎn)稱(chēng))是分布式、面向列的開(kāi)源數(shù)據(jù)庫(kù)(其實(shí)準(zhǔn)確的說(shuō)是面向列族NoSQL非關(guān)系型數(shù)據(jù)庫(kù))困介。
HDFS為Hbase提供可靠的底層數(shù)據(jù)存儲(chǔ)服務(wù)姐刁,MapReduce為Hbase提供高性能的計(jì)算能力,Zookeeper為Hbase提供穩(wěn)定服務(wù)和Failover機(jī)制贿肩,其實(shí)也可以說(shuō)Hbase是一個(gè)通過(guò)大量廉價(jià)的機(jī)器解決海量數(shù)據(jù)的高速存儲(chǔ)和讀取的分布式數(shù)據(jù)庫(kù)解決方案峦椰。
HBase 并不是足夠快,只是數(shù)據(jù)量很大的時(shí)候慢的不明顯尸曼,我們一探究竟们何。
2、Hbase存儲(chǔ)結(jié)構(gòu)
先明確一下基礎(chǔ)概念:
- Row Key:格式為字符數(shù)組控轿,是表中每條記錄的“主鍵”冤竹,方便快速查找。Table中所有行都按照row key排列茬射,因此row key的設(shè)計(jì)非常重要鹦蠕。
- Column Family:列族,擁有一個(gè)名稱(chēng)(string)在抛,包含一個(gè)或者多個(gè)相關(guān)列钟病。每個(gè)列族存儲(chǔ)在HDFS上的一個(gè)單獨(dú)文件中。
- Column:屬于某一個(gè)列族刚梭,列名定義為family:qualifier肠阱,其中qualifier可以是任意的字符串。每個(gè)column family可以有上百萬(wàn)個(gè)columns朴读,可以以此設(shè)計(jì)出精妙的存儲(chǔ)模型屹徘。
- TimeStamp:類(lèi)型為L(zhǎng)ong,默認(rèn)值是系統(tǒng)時(shí)間戳衅金,可由用戶(hù)自定義噪伊。用于標(biāo)識(shí)數(shù)據(jù)的不同版本,每條數(shù)據(jù)寫(xiě)入時(shí)如果不指定時(shí)間戳氮唯,系統(tǒng)會(huì)自動(dòng)添加為其寫(xiě)入 HBase 的時(shí)間鉴吹。并且讀取數(shù)據(jù)的時(shí)候一般只拿出數(shù)據(jù)的Type符合,時(shí)間戳最新的數(shù)據(jù)惩琉。之所以按照Type取數(shù)據(jù)是因?yàn)镠DFS支持增刪查豆励,但不支持改。
- Type:數(shù)據(jù)對(duì)應(yīng)的操作類(lèi)型琳水,當(dāng)你新增/修改一個(gè)單元格的時(shí)候肆糕,HBase 在 HDFS 上新增一條Put類(lèi)型數(shù)據(jù)般堆,版本號(hào)增大。當(dāng)你刪除一個(gè)單元格的時(shí)候诚啃,HBase 還是新增一條數(shù)據(jù)淮摔,只是這條數(shù)據(jù)沒(méi)有 value,類(lèi)型為 DELETE始赎,這條數(shù)據(jù)叫做墓碑標(biāo)記(Tombstone)和橙。真正刪除發(fā)生在Hbase每間隔一段時(shí)間都會(huì)進(jìn)行的合并(Compaction)的時(shí)候。
- StoreFile:一個(gè)Store包含了一個(gè)MemStore和0個(gè)或多個(gè)StoreFile造垛。其中MemStroe是一個(gè)內(nèi)存數(shù)據(jù)結(jié)構(gòu)魔招,StoreFile是文件系統(tǒng)級(jí)別的數(shù)據(jù)結(jié)構(gòu)。Store是由Region去管理的五辽,用于維護(hù)列族的數(shù)據(jù)办斑。 對(duì)于一個(gè)HBase的表,設(shè)計(jì)了幾個(gè)列族杆逗,那么對(duì)于任何一個(gè)Region而言就會(huì)有幾個(gè)Store乡翅。這也是HBase被稱(chēng)為列族式數(shù)據(jù)庫(kù)的原因。 同時(shí)HBase會(huì)以Store大小來(lái)判斷罪郊,是否需要去切分Region蠕蚜。
2.1邏輯結(jié)構(gòu)
邏輯結(jié)構(gòu)看起來(lái)就像一張關(guān)系數(shù)據(jù)庫(kù)中的普通表,實(shí)際中我們也會(huì)以此進(jìn)行表設(shè)計(jì)悔橄。
2.2物理存儲(chǔ)結(jié)構(gòu)
最基本的存儲(chǔ)單位是列(column)靶累,一個(gè)列或者多個(gè)列形成一行(row)。傳統(tǒng)數(shù)據(jù)庫(kù)是嚴(yán)格的行列對(duì)齊癣疟。但是在 HBase 中挣柬,行跟行的列可以完全不一樣,這個(gè)行的數(shù)據(jù)跟另外一個(gè)行的數(shù)據(jù)也可以存儲(chǔ)在不同的機(jī)器上睛挚,甚至同一行內(nèi)的列也可以存儲(chǔ)在完全不同的機(jī)器上凛忿。 HBase 每個(gè)行(row)都擁有唯一的行鍵(row key)來(lái)標(biāo)定這個(gè)行的唯一性。每個(gè)列都有多個(gè)版本竞川,多個(gè)版本的值都存在單元格(cell)中。
3叁熔、RowKey 的設(shè)計(jì)原則
Rowkey的概念和mysql中的主鍵是完全一樣的委乌,Hbase使用Rowkey來(lái)唯一的區(qū)分某一行的數(shù)據(jù)。
- 唯一原則:RowKey 必須在設(shè)計(jì)上保證其唯一性荣回,RowKey 是按照字典順序排序存儲(chǔ)的遭贸,因此設(shè)計(jì) RowKey 時(shí)可以將將經(jīng)常讀取的數(shù)據(jù)存儲(chǔ)到一塊。
- 長(zhǎng)度原則:二進(jìn)制碼流RowKey 最大長(zhǎng)度 64Kb心软,實(shí)際應(yīng)用中一般為 10-100bytes疆拘,以 byte[] 形式保存迟杂,一般設(shè)計(jì)定長(zhǎng)恼布。建議越短越好,因?yàn)镠File是按照KV存儲(chǔ)的Key太大浪費(fèi)空間踏堡。
- 散列原則:RowKey 在設(shè)計(jì)時(shí)候要盡可能的實(shí)現(xiàn)可以將數(shù)據(jù)均衡的分布在每個(gè) RegionServer 上。
4咒劲、常用命令
- 查看當(dāng)前數(shù)據(jù)庫(kù)表/命名空間
list
list_namespace
- 創(chuàng)建表
create "employee","info"
- 查看表結(jié)構(gòu)
describe '表名'
- 插入數(shù)據(jù)
格式為: 表名 顷蟆,rowkey名,列簇名:字段名腐魂,字段值
put "employee","row_key1","persional_info:name","張三"
put "employee","row_key1","persional_info:city","北京"
- 查看表數(shù)據(jù)(limit限制數(shù)量)
scan 'employee',LIMIT => 1
- 根據(jù)rowKey查詢(xún)數(shù)據(jù)
get 'employee','row_key1'