日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Hbase总结(四)- Hbase与传统数据库的区别

發(fā)布時(shí)間:2024/1/17 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hbase总结(四)- Hbase与传统数据库的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一 Hbase是個(gè)啥東東??
在說Hase是個(gè)啥家伙之前,首先我們來看看兩個(gè)概念,面向行存儲(chǔ)和面向列存儲(chǔ)。面向行存儲(chǔ),我相信大伙兒應(yīng)該都清楚,我們熟悉的RDBMS就是此種類型的,面向行存儲(chǔ)的數(shù)據(jù)庫主要適合于事務(wù)性要求嚴(yán)格場(chǎng)合,或者說面向行存儲(chǔ)的存儲(chǔ)系統(tǒng)適合OLTP,但是根據(jù)CAP理論,傳統(tǒng)的RDBMS,為了實(shí)現(xiàn)強(qiáng)一致性,通過嚴(yán)格的ACID事務(wù)來進(jìn)行同步,這就造成了系統(tǒng)的可用性和伸縮性方面大大折扣,而目前的很多NoSQL產(chǎn)品,包括Hbase,它們都是一種最終一致性的系統(tǒng),它們?yōu)榱烁叩目捎眯誀奚艘徊糠值囊恢滦浴:孟?#xff0c;我上面說了面向列存儲(chǔ),那么到底什么是面向列存儲(chǔ)呢?Hbase,Casandra,Bigtable都屬于面向列存儲(chǔ)的分布式存儲(chǔ)系統(tǒng)。看到這里,如果您不明白Hbase是個(gè)啥東東,不要緊,我再總結(jié)一下下:

Hbase是一個(gè)面向列存儲(chǔ)的分布式存儲(chǔ)系統(tǒng),它的優(yōu)點(diǎn)在于可以實(shí)現(xiàn)高性能的并發(fā)讀寫操作,同時(shí)Hbase還會(huì)對(duì)數(shù)據(jù)進(jìn)行透明的切分,這樣就使得存儲(chǔ)本身具有了水平伸縮性。


二 Hbase數(shù)據(jù)模型?
HBase,Cassandra的數(shù)據(jù)模型非常類似,他們的思想都是來源于Google的Bigtable,因此這三者的數(shù)據(jù)模型非常類似,唯一不同的就是Cassandra具有Super cloumn family的概念,而Hbase目前我沒發(fā)現(xiàn)。好了,廢話少說,我們來看看Hbase的數(shù)據(jù)模型到底是個(gè)啥東東。

在Hbase里面有以下兩個(gè)主要的概念,Row key,Column Family,我們首先來看看Column family,Column family中文又名“列族”,Column family是在系統(tǒng)啟動(dòng)之前預(yù)先定義好的,每一個(gè)Column Family都可以根據(jù)“限定符”有多個(gè)column.下面我們來舉個(gè)例子就會(huì)非常的清晰了。

假如系統(tǒng)中有一個(gè)User表,如果按照傳統(tǒng)的RDBMS的話,User表中的列是固定的,比如schema 定義了name,age,sex等屬性,User的屬性是不能動(dòng)態(tài)增加的。但是如果采用列存儲(chǔ)系統(tǒng),比如Hbase,那么我們可以定義User表,然后定義info 列族,User的數(shù)據(jù)可以分為:info:name = zhangsan,info:age=30,info:sex=male等,如果后來你又想增加另外的屬性,這樣很方便只需要info:newProperty就可以了。

也許前面的這個(gè)例子還不夠清晰,我們?cè)倥e個(gè)例子來解釋一下,熟悉SNS的朋友,應(yīng)該都知道有好友Feed,一般設(shè)計(jì)Feed,我們都是按照“某人在某時(shí)做了標(biāo)題為某某的事情”,但是同時(shí)一般我們也會(huì)預(yù)留一下關(guān)鍵字,比如有時(shí)候feed也許需要url,feed需要image屬性等,這樣來說,feed本身的屬性是不確定的,因此如果采用傳統(tǒng)的關(guān)系數(shù)據(jù)庫將非常麻煩,況且關(guān)系數(shù)據(jù)庫會(huì)造成一些為null的單元浪費(fèi),而列存儲(chǔ)就不會(huì)出現(xiàn)這個(gè)問題,在Hbase里,如果每一個(gè)column 單元沒有值,那么是占用空間的。下面我們通過兩張圖來形象的表示這種關(guān)系:

?



上圖是傳統(tǒng)的RDBMS設(shè)計(jì)的Feed表,我們可以看出feed有多少列是固定的,不能增加,并且為null的列浪費(fèi)了空間。但是我們?cè)倏纯聪聢D,下圖為Hbase,Cassandra,Bigtable的數(shù)據(jù)模型圖,從下圖可以看出,Feed表的列可以動(dòng)態(tài)的增加,并且為空的列是不存儲(chǔ)的,這就大大節(jié)約了空間,關(guān)鍵是Feed這東西隨著系統(tǒng)的運(yùn)行,各種各樣的Feed會(huì)出現(xiàn),我們事先沒辦法預(yù)測(cè)有多少種Feed,那么我們也就沒有辦法確定Feed表有多少列,因此Hbase,Cassandra,Bigtable的基于列存儲(chǔ)的數(shù)據(jù)模型就非常適合此場(chǎng)景。說到這里,采用Hbase的這種方式,還有一個(gè)非常重要的好處就是Feed會(huì)自動(dòng)切分,當(dāng)Feed表中的數(shù)據(jù)超過某一個(gè)閥值以后,Hbase會(huì)自動(dòng)為我們切分?jǐn)?shù)據(jù),這樣的話,查詢就具有了伸縮性,而再加上Hbase的弱事務(wù)性的特性,對(duì)Hbase的寫入操作也將變得非常快。

上面說了Column family,那么我之前說的Row key是啥東東,其實(shí)你可以理解row key為RDBMS中的某一個(gè)行的主鍵,但是因?yàn)镠base不支持條件查詢以及Order by等查詢,因此Row key的設(shè)計(jì)就要根據(jù)你系統(tǒng)的查詢需求來設(shè)計(jì)了額。我還拿剛才那個(gè)Feed的列子來說,我們一般是查詢某個(gè)人最新的一些Feed,因此我們Feed的Row key可以有以下三個(gè)部分構(gòu)成<userId><timestamp><feedId>,這樣以來當(dāng)我們要查詢某個(gè)人的最進(jìn)的Feed就可以指定Start Rowkey為<userId><0><0>,End Rowkey為<userId><Long.MAX_VALUE><Long.MAX_VALUE>來查詢了,同時(shí)因?yàn)镠base中的記錄是按照rowkey來排序的,這樣就使得查詢變得非常快。


三 Hbase的優(yōu)缺點(diǎn)?
1 列的可以動(dòng)態(tài)增加,并且列為空就不存儲(chǔ)數(shù)據(jù),節(jié)省存儲(chǔ)空間.

2 Hbase自動(dòng)切分?jǐn)?shù)據(jù),使得數(shù)據(jù)存儲(chǔ)自動(dòng)具有水平scalability.

3 Hbase可以提供高并發(fā)讀寫操作的支持

Hbase的缺點(diǎn):

1 不能支持條件查詢,只支持按照Row key來查詢.

2 暫時(shí)不能支持Master server的故障切換,當(dāng)Master宕機(jī)后,整個(gè)存儲(chǔ)系統(tǒng)就會(huì)掛掉.


四.補(bǔ)充

1.數(shù)據(jù)類型,HBase只有簡(jiǎn)單的字符類型,所有的類型都是交由用戶自己處理,它只保存字符串。而關(guān)系數(shù)據(jù)庫有豐富的類型和存儲(chǔ)方式。
2.數(shù)據(jù)操作:HBase只有很簡(jiǎn)單的插入、查詢、刪除、清空等操作,表和表之間是分離的,沒有復(fù)雜的表和表之間的關(guān)系,而傳統(tǒng)數(shù)據(jù)庫通常有各式各樣的函數(shù)和連接操作。??
3.存儲(chǔ)模式:HBase是基于列存儲(chǔ)的,每個(gè)列族都由幾個(gè)文件保存,不同的列族的文件時(shí)分離的。而傳統(tǒng)的關(guān)系型數(shù)據(jù)庫是基于表格結(jié)構(gòu)和行模式保存的?
4.數(shù)據(jù)維護(hù),HBase的更新操作不應(yīng)該叫更新,它實(shí)際上是插入了新的數(shù)據(jù),而傳統(tǒng)數(shù)據(jù)庫是替換修改
5.可伸縮性,Hbase這類分布式數(shù)據(jù)庫就是為了這個(gè)目的而開發(fā)出來的,所以它能夠輕松增加或減少硬件的數(shù)量,并且對(duì)錯(cuò)誤的兼容性比較高。而傳統(tǒng)數(shù)據(jù)庫通常需要增加中間層才能實(shí)現(xiàn)類似的功能


下面是用詳細(xì)實(shí)際操作截圖比較區(qū)別


1.nosql數(shù)據(jù)庫能否刪除列
2.nosql數(shù)據(jù)庫如何刪除一條記錄
3.nosql數(shù)據(jù)庫列族和lieder區(qū)別是什么?
4.nosql操作與傳統(tǒng)數(shù)據(jù)庫的操作區(qū)別在什么地方?




對(duì)于大多數(shù)做技術(shù)的人員,都知道我們傳統(tǒng)數(shù)據(jù)庫是什么樣子的,那么如下圖所示,我們操作的對(duì)象是行。
也就是增刪改查,都是以為對(duì)象。

1.傳統(tǒng)數(shù)據(jù)庫增加刪除介紹
?圖1
下面我們以mysql為例:
?


插入數(shù)據(jù)mysql>INSERT INTO blog_user (`user_Name`,`user_Password`,`user_emial`)VALUES ('aboutyun','aboutyun', 'aboutyun@sina.com');
?

刪除數(shù)據(jù):
  • mysql> delete from blog_user where user_name="aboutyun";
  • 復(fù)制代碼?


    2.Nosql數(shù)據(jù)庫增加刪除介紹

    ?
    圖2
    以hbase為例:
    創(chuàng)建表:
  • create 'blog_user','userInfo'
  • 復(fù)制代碼
    ?


    插入數(shù)據(jù)
    這里是關(guān)鍵點(diǎn),也是很多人不容易理解的地方

  • hbase(main):012:0> put'blog_user','www.aboutyun.com','userInfo:user_Name','aboutyun'
  • 0 row(s) in 1.7530 seconds
  • 復(fù)制代碼?
    上面我們看到了
    1所示是什么,我們?cè)趥鹘y(tǒng)數(shù)據(jù)塊里面根本沒有,這是nosql所特有的,是一個(gè)rowkey,是系統(tǒng)自帶的,也是nosql中一條記錄的唯一標(biāo)識(shí)。但是這個(gè)唯一標(biāo)識(shí),有跟我們的傳統(tǒng)數(shù)據(jù)庫是有所差別的。如圖1所示,“記錄1”便是rowkey.

    2所示是我們插入的列user_Name,這也是最難以理解的地方,列竟然可以插入。并且其’value‘為3即'aboutyun'

    我們插入了列,下面我們來查看一下效果:
    ?


    下面來解釋一下上面的含義:
    我們會(huì)看到
    1為rowkey,插入數(shù)據(jù)’www.aboutyun.com‘,
    2為列族下面列的名字user_Name
    3我們并沒有在設(shè)計(jì)的添加這個(gè)列族,所以這個(gè)是系統(tǒng)自帶的,這個(gè)是記錄的操作時(shí)間,以時(shí)間戳的形式放到hbase里面。
    4是我們插入的user_Name的值

    下面我們?cè)诓迦雙assword:
  • hbase(main):015:0> put'blog_user','www.aboutyun.com','userInfo:user_Password','aboutyun'
  • 復(fù)制代碼
    ?


    再次查詢結(jié)果:
  • hbase(main):016:0> scan 'blog_user'
  • ROW? ?? ?? ?? ?? ?? ?? ?? ?? ???COLUMN+CELL? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
  • www.aboutyun.com? ?? ?? ?? ?? ?column=userInfo:user_Name, timestamp=1400663775901, value=aboutyun? ?? ?? ?? ?? ?? ?? ??
  • www.aboutyun.com? ?? ?? ?? ?? ?column=userInfo:user_Password, timestamp=1400665203430, value=aboutyun? ?? ?? ?? ?? ?? ?
  • 1 row(s) in 0.0390 seconds
  • 復(fù)制代碼?


    到這里,我們看到兩行記錄,傳統(tǒng)數(shù)據(jù)塊認(rèn)為這是兩行數(shù)據(jù),對(duì)于nosql,這是一條記錄。


    刪除列數(shù)據(jù)

    刪除數(shù)據(jù)分為刪除列和刪除記錄
    1.刪除列
    這里面的刪除,沒有刪除
    delete 'blog_user','www.aboutyun.com','userInfo:user_Password'
    ?

    從上面我們看出列被刪除了
    2.刪除記錄:
  • deleteall 'blog_user','www.aboutyun.com'
  • 復(fù)制代碼
    這是刪除之前顯示結(jié)果,這里已經(jīng)是
    ?

    刪除后結(jié)果

    ?



    總結(jié)
    對(duì)于傳統(tǒng)數(shù)據(jù)庫,增加列對(duì)于一個(gè)項(xiàng)目來講,改變是非常大的。但是對(duì)于nosql,插入列和刪除列,跟傳統(tǒng)數(shù)據(jù)庫里面的增加記錄和刪除記錄類似

    總結(jié)

    以上是生活随笔為你收集整理的Hbase总结(四)- Hbase与传统数据库的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。