HBase相對(duì)于關(guān)系數(shù)據(jù)庫(kù)能解決的問(wèn)題是什么?
關(guān)于HBase與關(guān)系數(shù)據(jù)的區(qū)別問(wèn)題其實(shí)就是關(guān)系數(shù)據(jù)庫(kù)與HBase各自的優(yōu)缺點(diǎn)。
關(guān)系數(shù)據(jù)庫(kù)的缺憾:
1) 擴(kuò)展困難
2) 維護(hù)復(fù)雜
HBase就是解決可伸縮行的問(wèn)題。通過(guò)簡(jiǎn)單增加節(jié)點(diǎn)來(lái)獲取線性擴(kuò)展性。不支持SQL。
圖解Nosql(hbase)與傳統(tǒng)數(shù)據(jù)庫(kù)的區(qū)別
對(duì)于大多數(shù)做技術(shù)的人員,都知道我們傳統(tǒng)數(shù)據(jù)庫(kù)是什么樣子的,那么如下圖所示,我們操作的對(duì)象是行。也就是增刪改查,都是以為對(duì)象
1. 傳統(tǒng)數(shù)據(jù)庫(kù)增加刪除介紹
?
下面我們以mysql為例:
?
插入數(shù)據(jù)
mysql》INSERT INTO blog_user (`user_Name`,`user_Password`,`user_emial`)VALUES (‘a(chǎn)boutyun’,‘a(chǎn)boutyun’, ‘a(chǎn)boutyun@sina.com’);
?
刪除數(shù)據(jù):
mysql》 delete from blog_user where user_name=“aboutyun”;
?
2. Nosql數(shù)據(jù)庫(kù)增加刪除介紹
?
以hbase為例:
創(chuàng)建表:
create ‘blog_user’,‘userInfo’
?
插入數(shù)據(jù)
這里是關(guān)鍵點(diǎn),也是很多人不容易理解的地方
hbase(main):012:0》 put‘blog_user’,‘www.aboutyun.com’,‘userInfo:user_Name’,‘a(chǎn)boutyun’
0 row(s) in 1.7530 seconds
?
上面我們看到了
1所示是什么,我們?cè)趥鹘y(tǒng)數(shù)據(jù)塊里面根本沒(méi)有,這是nosql所特有的,是一個(gè)rowkey,是系統(tǒng)自帶的,也是nosql中一條記錄的唯一標(biāo)識(shí)。但是這個(gè)唯一標(biāo)識(shí),有跟我們的傳統(tǒng)數(shù)據(jù)庫(kù)是有所差別的。如圖1所示,“記錄1”便是rowkey.
2所示是我們插入的列user_Name,這也是最難以理解的地方,列竟然可以插入。并且其’value‘為3即‘a(chǎn)boutyun’
我們插入了列,下面我們來(lái)查看一下效果:?
下面來(lái)解釋一下上面的含義:
我們會(huì)看到
1為rowkey,插入數(shù)據(jù)’www.aboutyun.com‘,
2為列族下面列的名字user_Name
3我們并沒(méi)有在設(shè)計(jì)的添加這個(gè)列族,所以這個(gè)是系統(tǒng)自帶的,這個(gè)是記錄的操作時(shí)間,以時(shí)間戳的形式放到hbase里面。
4是我們插入的user_Name的值
下面我們?cè)诓迦雙assword:
1. hbase(main):015:0》 put‘blog_user’,‘www.aboutyun.com’,‘userInfo:user_Password’,‘a(chǎn)boutyun’
?
再次查詢結(jié)果:
1. hbase(main):016:0》 scan ‘blog_user’
2. ROW COLUMN+CELL
3. www.aboutyun.com column=userInfo:user_Name, timestamp=1400663775901, value=aboutyun
4. www.aboutyun.com column=userInfo:user_Password, timestamp=1400665203430, value=aboutyun
5. 1 row(s) in 0.0390 seconds
?
到這里,我們看到兩行記錄,傳統(tǒng)數(shù)據(jù)塊認(rèn)為這是兩行數(shù)據(jù),對(duì)于nosql,這是一條記錄。
刪除列數(shù)據(jù)
刪除數(shù)據(jù)分為刪除列和刪除記錄
1.刪除列
這里面的刪除,沒(méi)有刪除
delete ‘blog_user’,‘www.aboutyun.com’,‘userInfo:user_Password’
?
從上面我們看出列被刪除了
2.刪除記錄:
1. deleteall ‘blog_user’,‘www.aboutyun.com’
2. 這是刪除之前顯示結(jié)果,這里已經(jīng)是
?
刪除后結(jié)果
?
結(jié)論:
對(duì)于傳統(tǒng)數(shù)據(jù)庫(kù),增加列對(duì)于一個(gè)項(xiàng)目來(lái)講,改變是非常大的。但是對(duì)于nosql,插入列和刪除列,跟傳統(tǒng)數(shù)據(jù)庫(kù)里面的增加記錄和刪除記錄類(lèi)似
HBase有哪些基本的特征?
HBase是類(lèi)似于google的bigtable的開(kāi)源實(shí)現(xiàn),擁有以下特征:
1)在HDFS之上
2) 基于列存儲(chǔ)的分布式數(shù)據(jù)庫(kù)
3) 用于實(shí)時(shí)地讀、寫(xiě)大規(guī)模數(shù)據(jù)集
其他HBase的特性:
1)沒(méi)有真正的索引,行順序存儲(chǔ),也沒(méi)有所謂的索引膨脹問(wèn)題。
2) 自動(dòng)分區(qū),表增長(zhǎng)時(shí),自動(dòng)分區(qū)到新的節(jié)點(diǎn)上。
3) 線性擴(kuò)展和區(qū)域會(huì)自動(dòng)重新平衡,運(yùn)行RegionServer,達(dá)到負(fù)載均衡的目的。
4)容錯(cuò)和普通商用的硬件支持。這點(diǎn)同hadoop類(lèi)似。
HBase與RDBMS的區(qū)別?
1) 表的設(shè)計(jì):HBase的表可以很高,很寬,可伸縮性很強(qiáng)。而且表的模式是物理存儲(chǔ)的直接反映。
2) 拓?fù)洌?HBase能水平分區(qū)并在上千個(gè)節(jié)點(diǎn)上自動(dòng)復(fù)制。
3) 應(yīng)用形式: 開(kāi)發(fā)者必須承擔(dān)更多的責(zé)任來(lái)正確地利用HBase的檢索和存儲(chǔ)方式。
4) RDBMS 遵循固定的模式,如“codd 12 規(guī)則”,強(qiáng)調(diào)事務(wù)的“強(qiáng)一致性”、參照完整性、SQL支持、數(shù)據(jù)的邏輯與物理形式相對(duì)獨(dú)立。等等。適用于中小規(guī)模的數(shù)據(jù),但對(duì)于數(shù)據(jù)的規(guī)模和并發(fā)讀寫(xiě)方面進(jìn)行大規(guī)模擴(kuò)展時(shí),RDBMS會(huì)性能大大降低,分布式更為困難,因?yàn)槠湫枰艞壓芏郣DBMS的易用的特性。
HBase適用于上億、上千億級(jí)的數(shù)據(jù),如果是只有上千、上百萬(wàn)級(jí)別是數(shù)據(jù),傳統(tǒng)的RDBMS是更好的選擇。
HBase需要更多硬件,如果硬件較少,如5個(gè),干不成什么好事。
如果從RDBMS移植到HBase,需要消除RDBMS的很多額外特性,如列數(shù)據(jù)類(lèi)型、第二索引、事務(wù)、高級(jí)查詢等。
HBase的數(shù)據(jù)模式是怎么樣的?即有哪些元素?如何存儲(chǔ)?
1) 數(shù)據(jù)模式
如下列三個(gè)表:
第一個(gè)是一個(gè)稀疏的表,實(shí)際上它是一個(gè)虛表,僅是一個(gè)概念視圖,不是真實(shí)的存儲(chǔ)形式,它來(lái)源于后兩個(gè)表。
而后兩個(gè)表才是真正的表,物理視圖,他們是實(shí)際的存儲(chǔ)形式,而且它們是按列族進(jìn)行存儲(chǔ)的。
2) HBase的基本元素:
表、行、列、單元格: 表的基本要素
鍵:一般是指行的鍵,即唯一標(biāo)識(shí)某行的元素。表中的行,可以根據(jù)鍵進(jìn)行排序,而對(duì)表的訪問(wèn),也通過(guò)鍵。
列族:所有列族成員擁有相同的前綴,某列族的成員,需要預(yù)先定義,但也可以直接進(jìn)行追加。
列族成員會(huì)一起放進(jìn)存儲(chǔ)器。而HBase面向列的存儲(chǔ),是面向列族的數(shù)據(jù)存儲(chǔ)(這個(gè)通過(guò)上面那個(gè)表的示例可以看出來(lái)),數(shù)據(jù)存儲(chǔ)與調(diào)優(yōu)都在這個(gè)層次,HBase表與RDBMS中表類(lèi)似,行是排序的,客戶端可以把列添加到列族中去。
單元格cell: 單元格中存放的是不可分割的字節(jié)數(shù)組。并且每個(gè)單元格擁有版本信息。HBase的是按版本信息倒序排列。
區(qū)域region:將表水平劃分,是HBase集群分布數(shù)據(jù)的最小單位。在線的所有區(qū)域就構(gòu)成了表的內(nèi)容。
加鎖:對(duì)數(shù)據(jù)行進(jìn)行更新,都需加鎖。保持原子性。
3) 數(shù)據(jù)模型有哪些操作?
Get、Scan、Put、Delete,即返回特定行的屬性,多行屬性、插入、刪除數(shù)據(jù)。
這些都需要一個(gè)HTable實(shí)例來(lái)操作。分別有Get、Scan、Put、Delete類(lèi)來(lái)指定相應(yīng)的參數(shù)、屬性。
4) 返回結(jié)果的排序方式是什么?
先是行、再是列族、再是列修飾符,最后是時(shí)間戳(反向排序,最新的在前面)。
5)最后,HBase不支持聯(lián)合查詢
6)mapreduce與HBase表配合使用,默認(rèn)mapreduce的任務(wù)分割是根據(jù)HBase表中region的多少來(lái)分割,一個(gè)region就有一個(gè)map。
HBase的模式Schema設(shè)計(jì)的一些概念和原則
1)模式的創(chuàng)建與更新
可以使用HBase Shell或HBase Admin來(lái)創(chuàng)建和編輯HBase的模式。
在0.90.x 版本,只能先禁用表,再修改列族,而0.92.x版本以后,支持在線修改。
而且表和列族修改后,如size, region, block size等,在下次 主緊縮 或 存儲(chǔ)文件時(shí) 起作用。
2)列族的數(shù)量
-列族數(shù)量越少越好,即使同時(shí)有兩個(gè)列族,查詢的時(shí)候總是訪問(wèn)其中一個(gè)列族,不會(huì)同時(shí)訪問(wèn)。
-當(dāng)一個(gè)表存在多個(gè)列族,當(dāng)基數(shù)差距很大時(shí),如A族有100萬(wàn)行,B族10億行,A族可能會(huì)被分散到很多區(qū)域region,導(dǎo)致掃描A的效率降低。
-另外,多個(gè)列族在flush和compaction時(shí),會(huì)造成很多I/O負(fù)擔(dān)。
3)行鍵設(shè)計(jì)RowKey
a. 不要將RowKey設(shè)計(jì)成有序的形式,因?yàn)檫@樣容易阻塞并行性,將負(fù)載壓都在一臺(tái)機(jī)器上
b. 定位一個(gè)單元,需要行,列名和時(shí)間戳。如果一個(gè)單元格的坐標(biāo)很大,會(huì)占用內(nèi)存,索引用光。所以,解決方法:列族名盡量小,如一個(gè)字符a,短屬性名,而行鍵長(zhǎng)度可讀即可(行鍵長(zhǎng)度對(duì)數(shù)據(jù)訪問(wèn)無(wú)太大影響),將數(shù)字字符轉(zhuǎn)換為數(shù)字字節(jié)模式(節(jié)省空間)。
c. 倒序時(shí)間戳有助于找到找到最近版本值
d. 行鍵是在列族范圍內(nèi)有效,不同列族中可以擁有同樣的行鍵
e. 行鍵永遠(yuǎn)不能變
4)HBase支持所有能轉(zhuǎn)換為字節(jié)數(shù)組的東西,如字符串、數(shù)字、復(fù)雜對(duì)象、計(jì)數(shù)器、甚至圖像。
5)列族可以設(shè)置存活時(shí)間TTL,超時(shí)后,HBase自動(dòng)刪除數(shù)據(jù)
6)第二索引和查詢: 這里面有很多東西,需要查看對(duì)應(yīng)版本官方的文檔更好些。
HBase的拓?fù)浣Y(jié)構(gòu)是什么?
1)拓?fù)浣Y(jié)構(gòu): 類(lèi)似于HDFS的mast與slave,mapreduce的tasktracker與jobtracker的關(guān)系,HBase也有master和RegionServer
2)HBase與ZooKeeper的關(guān)系是什么?
HBase必須管理一個(gè)ZooKeeper實(shí)例,它依賴ZooKeeper,主要目的是,通過(guò)ZooKeeper來(lái)協(xié)調(diào)區(qū)域內(nèi)的服務(wù)器,它負(fù)責(zé)目錄表、主控機(jī)地址等重要信息,若有服務(wù)器崩潰,HBase就可以通過(guò)ZooKeeper來(lái)協(xié)調(diào)分配。
RegionServer在HBase的配置文件conf/regionservers文件中,而HBase集群的站點(diǎn)配置在conf/hbase-site.xml和conf/hbase-env.sh中配置。HBase盡量遵循了Hadoop的規(guī)則。
3)HBase的內(nèi)部結(jié)構(gòu)管理狀況:
其內(nèi)部有-ROOT, -META的特殊目錄表,用于維護(hù)當(dāng)前集群上所有區(qū)域的列表、位置和狀態(tài)。
-ROOT表包含 -META表的區(qū)域列表,而-META表示包含用戶的的區(qū)域列表。
所以,HBase管理的流程是:
Client -- 鏈接到ZooKeeper -- 查找-ROOT表的位置 -- 查找-META表的位置 -- 查找用戶的區(qū)域所在的節(jié)點(diǎn)、位置及其狀態(tài)等 -- 直接管理指定區(qū)域的RegionServer并進(jìn)行交互。
HBase支持Java及MapReduce的開(kāi)發(fā)。
HBase提供了Thrift、REST及Avro的接口。HBase需要有一個(gè)相應(yīng)的接口客戶端負(fù)責(zé)與這些接口的交互。但是這些需要代理進(jìn)行處理請(qǐng)求和響應(yīng),所以比java更慢。
%hbase-daemon.sh start/stop rest/thrift/avro //啟動(dòng)或終止對(duì)應(yīng)的客戶端
評(píng)論