HBase概述
Hbase是運行在Hadoop上的NoSQL數(shù)據(jù)庫恭应,它是一個分布式的和可擴展的大數(shù)據(jù)倉庫绘搞,也就是說HBase能夠利用HDFS的分布式處理模式够委,并從Hadoop的MapReduce程序模型中獲益。這意味著在一組商業(yè)硬件上存儲許多具有數(shù)十億行和上百萬列的大表肃叶。除去Hadoop的優(yōu)勢蹂随,HBase本身就是十分強大的數(shù)據(jù)庫,它能夠融合key/value存儲模式帶來實時查詢的能力因惭,以及通過MapReduce進行離線處理或者批處理的能力岳锁。總的來說蹦魔,Hbase能夠讓你在大量的數(shù)據(jù)中查詢記錄激率,也可以從中獲得綜合分析報告。
HBase不是一個關(guān)系型數(shù)據(jù)庫版姑,它需要不同的方法定義你的數(shù)據(jù)模型柱搜,HBase實際上定義了一個四維數(shù)據(jù)模型,下面就是每一維度的定義:
- 行鍵:每行都有唯一的行鍵剥险,行鍵沒有數(shù)據(jù)類型,它內(nèi)部被認為是一個字節(jié)數(shù)組宪肖。
- 列簇:數(shù)據(jù)在行中被組織成列簇表制,每行有相同的列簇健爬,但是在行之間,相同的列簇不需要有相同的列修飾符么介。在引擎中娜遵,HBase將列簇存儲在它自己的數(shù)據(jù)文件中,所以壤短,它們需要事先被定義设拟,此外,改變列簇并不容易久脯。
- 列修飾符:列簇定義真實的列纳胧,被稱之為列修飾符,你可以認為列修飾符就是列本身帘撰。
- 版本:每列都可以有一個可配置的版本數(shù)量跑慕,你可以通過列修飾符的制定版本獲取數(shù)據(jù)。
如圖摧找,通過行鍵獲取一個指定的行核行,它由一個或多個列簇構(gòu)成,每個列簇有一個或多個列修飾符(圖中稱為列)蹬耘,每列又可以有一個或多個版本芝雪。為了獲取指定數(shù)據(jù),你需要知道它的行鍵综苔、列簇绵脯、列修飾符以及版本。當設(shè)計HBase數(shù)據(jù)模型時休里,對考慮數(shù)據(jù)是如何被獲取是十分有幫助的蛆挫。你可以通過以下兩種方式獲得HBase數(shù)據(jù):
- 通過他們的行鍵,或者一系列行鍵的表掃描
- 使用map-reduce進行批操作
HBase通過key/value存儲來支持實時分析妙黍,以及通過map-reduce支持批處理分析悴侵。讓我們首先來看實時數(shù)據(jù)獲取,作為key/value存儲拭嫁,key是行鍵可免,value是列簇的集合。由于HBase是Key/Value存儲的做粤,所以行鍵的設(shè)計非常重要浇借。有以下兩個原因:
- 表掃描是對行鍵進行操作的,行鍵的設(shè)計控制著你能夠通過HBase執(zhí)行的實時/直接獲取量
- 當在生產(chǎn)環(huán)境中運行HBase時怕品,它在HDFS上部運行妇垢,數(shù)據(jù)基于行鍵通過HDFS,如果你所有的行鍵都是以user-開頭,那么很有可能你大部分數(shù)據(jù)都被分配一個節(jié)點上(違背了分布式數(shù)據(jù)的初衷)闯估,因此灼舍,你的行鍵應(yīng)該是有足夠的差異性以便分布式地通過整個部署。
HBase與關(guān)系型數(shù)據(jù)庫比較
比較項 | HBase | 關(guān)系型數(shù)據(jù)庫 |
---|---|---|
存儲方式 | 列式存儲涨薪,不同列的文件是分離的 | 行式存儲 |
擴展性 | 列不固定骑素,方便擴展 | 固定列 |
數(shù)據(jù)查詢 | 只能通過RowKey查詢 | 多種查詢 |
數(shù)據(jù)類型 | 只有字符 | 豐富的類型 |
數(shù)據(jù)操作 | 表是分離的,表與表沒有關(guān)系 | 有各種連接操作 |
數(shù)據(jù)維護 | 更新是插入新的數(shù)據(jù) | 修改數(shù)據(jù) |
關(guān)系型數(shù)據(jù)庫的優(yōu)勢:
- 保持數(shù)據(jù)的一致性(事務(wù)處理)
2.由于以標準化為前提刚夺,數(shù)據(jù)更新的開銷很邢壮蟆(相同的字段基本上都只有一處) - 可以進行Join等復(fù)雜查詢
其中能夠保持數(shù)據(jù)的一致性是關(guān)系型數(shù)據(jù)庫的最大優(yōu)勢。
關(guān)系型數(shù)據(jù)庫的不足:
- 大量數(shù)據(jù)的寫入處理
- 為有數(shù)據(jù)更新的表做索引或表結(jié)構(gòu)(schema)變更
- 字段不固定時應(yīng)用
- 對簡單查詢需要快速返回結(jié)果的處理
HBase的Shell操作
#創(chuàng)建blog_user表格
create 'blog_user','userInfo'
#往表格寫數(shù)據(jù)
put'blog_user','www.aboutyun.com','userInfo:user_Name','aboutyun'
put'blog_user','www.aboutyun.com','userInfo:user_Password','aboutyun'
#掃描表格數(shù)據(jù)
scan 'blog_user'
#刪除表格列的數(shù)據(jù)
delete 'blog_user','www.aboutyun.com','userInfo:user_Password'
#刪除記錄
deleteall 'blog_user','www.aboutyun.com'