Hbase特點
HBase是一個構建在HDFS上的分布式列存儲系統;
HBase是基於Google BigTable模型開發的,典型的key/value系統;
HBase是Apache Hadoop生態系統中的重要一員,主要用於海量結構化數據存儲;
從邏輯上講,HBase將數據按照表、行和列進行存儲。
與hadoop一樣,Hbase目標主要依靠橫向擴展,通過不斷增加廉價的商用服務器,來增加計算和存儲能力。
Hbase 儲存原理
HBase不是一個關系型數據庫,它需要不同的方法定義你的數據模型,HBase實際上定義了一個四維數據模型,下面就是每一維度的定義:
行鍵:每行都有唯一的行鍵,行鍵沒有數據類型,它內部被認為是一個字節數組。
列簇:數據在行中被組織成列簇,每行有相同的列簇,但是在行之間,相同的列簇不需要有相同的列修飾符。在引擎中,HBase將列簇存儲在它自己的數據文件中,所以,它們需要事先被定義,此外,改變列簇並不容易。
列修飾符:列簇定義真實的列,被稱之為列修飾符,你可以認為列修飾符就是列本身。
版本:每列都可以有一個可配置的版本數量,你可以通過列修飾符的制定版本獲取數據
RowKey:是Byte array,是表中每條記錄的“主鍵”,方便快速查找,Rowkey的設計非常重要。
Column Family:列族,擁有一個名稱(string),包含一個或者多個相關列
Column:屬於某一個columnfamily,familyName:columnName,每條記錄可動態添加
Version Number:類型為Long,默認值是系統時間戳,可由用戶自定義
Value(Cell):Byte array
Hbase 物理儲存模型
每個column family存儲在HDFS上的一個單獨文件中,空值不會被保存。
Key 和 Version number在每個 column family中均有一份;
HBase 為每個值維護了多級索引,即:<key, column family, column name, timestamp>
物理儲存
1,table中所有的行都是按照row key的字典排序
2,table在行方向上分割為多個Region
3,Region按大小分割,每個表做出一個region 隨着數據的增加,達到一個值只夠
就會自動拆分,之后會越來越多的Region
4,Region是Hbase中分布式儲存和負載均衡的最小單元
不同的Region 分布到不同的RegionServer上
5,Region雖然是分布式存儲的最小單元,但並不是存儲的最小單元。Region由一個或者多個Store組成,每個store保存一個columns family;每個Strore又由一個memStore和0至多個StoreFile組成,StoreFile包含HFile;memStore存儲在內存中,StoreFile存儲在HDFS上
Hbase架構及基本組件
Hbase基本組件說明
Client
包含訪問hbase的接口,並維護cache來加快對HBase的訪問,比如region的位置信息
Master
1為region server 分配region
2負責region server 的負載均衡
3發現生效的region server並重新分配其他的region
4管理用戶對表的增刪改查
Region server
1 region server維護region 處理對這些region'的io請求
2 region server 負責切分運行過程中變大的region
Zookeeoer
1 通過選舉,保證任何時候,集群中只有一個master master與regionservers啟動時會向zooker注冊
2儲存所有region的尋址入口
3實時監控region server的上下線信息,並實時給master
4 儲存hbase的schema和table元數據
5默認下 hbase管理zooeeper的實例,比如啟動或者停止zookeeper
6 zookeeper 的引入使得master不再是單點故障
write-ahead-Log(wal)
該機制用於數據的容錯和恢復:
每個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead Log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件中(HLog文件格式見后續),HLog文件定期會滾動出新的,並刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止后,HMaster會通過Zookeeper感知到,HMaster首先會處理遺留的 HLog文件,將其中不同Region的Log數據進行拆分,分別放到相應region的目錄下,然后再將失效的region重新分配,領取 到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然后flush到StoreFiles,完成數據恢復
HBase容錯性
Master容錯:Zookeeper重新選擇一個新的Master
ü無Master過程中,數據讀取仍照常進行
ü無master過程中,region切分、負載均衡等無法進行
RegionServer容錯:定時向Zookeeper匯報心跳,如果一旦時間內未出現心跳,Master將該RegionServer上的Region重新分配到其他RegionServer上,失效服務器上“預寫”日志由主服務器進行分割並派送給新的RegionServer
Zookeeper容錯:Zookeeper是一個可靠地服務,一般配置3或5個Zookeeper實例
Region定位流程:
尋找RegionServer
ZooKeeper--> -ROOT-(單Region)--> .META.--> 用戶表
-ROOT-
ü表包含.META.表所在的region列表,該表只會有一個Region;
üZookeeper中記錄了-ROOT-表的location。
.META.
表包含所有的用戶空間region列表,以及RegionServer的服務器地址。
Hbase使用場景
1大數據量的存儲,大數據量高並發的操作
2需要對數據的隨機的讀寫操作
3讀寫均是簡單的操作
Hdfs 適合批處理場景不支持數據的隨機查找 不支持增量數據的查找
不支持數據的更新
參考地址http://blog.csdn.net/woshiwanxin102213/article/details/17584043
Hbase shell 使用
使用hbase shell 進入命令行
1 查詢服務器狀態
Status
2創建表
注意不能加:
Create ‘lvhou’,’lvhou_id’,’address’,’info’
3獲取表的結構 及查看表
List
Desc ‘lvhou’
4 刪出一個列族
Disable ‘lvhou’
Alter ‘member’,{NAME=>’address’,METHOD=>’delete’}
Desc ‘lvhou’
Enable ‘lvhou’
5 刪除一個表
刪之前一定要設置表不可用
Disable ‘lvhou’
Drop ‘lvhou’
Desc ‘lvhou’
6將表重新創建回來
Create ‘lvhou’,’lvhou_id’,’addrss’,’info’
7插入數據
8查詢數據
掃描全表
刪除id=‘001’的info:age字段
刪除整行
查詢表中的行數
將整張表清空
使用hive操作表
首先在hbase中創建表
2在hive中創建表
3在hive插入數據
在hbase中查尋
PHOENIX操作
登陸到phoenix
查看表
插入數據
查看數據
查看hbase數據
官網phoenix總結
1select
Select * from lvhou_test limit 1000;
從一個或多個表中選擇數據。UNION ALL組合來自多個select語句的行。ORDER BY根據給定的表達式對結果進行排序。LIMIT(或FETCH FIRST)限制查詢返回的行數,如果未指定或指定為null或小於零,則不應用限制。的LIMIT(或FETCH FIRST)子句后執行ORDER BY,以支持前N個類型的查詢子句。OFFSET子句在開始返回行之前跳過很多行。可選的提示可用於覆蓋由查詢優化器做出的決定。
SELECT * FROM TEST LIMIT 1000;
SELECT * FROM TEST LIMIT 1000 OFFSET 100;
SELECT full_name FROM SALES_PERSON WHERE ranking >= 5.0
UNION ALL SELECT reviewer_name FROM CUSTOMER_REVIEW WHERE score >= 8.0
2 Upsert values
如果不存在則插入,否則更新表中的值。列的列表是可選的,如果不存在,則值將按照它們在模式中聲明的順序映射到列。值必須計算為常數。
ON DUPLICATE KEY如果您需要UPSERT原子,請使用該條款(Phoenix 4.9中提供)。在這種情況下,性能會更慢,因為在完成提交時需要在服務器端讀取該行。使用IGNORE,如果你不是要不要UPSERT,如果行已存在執行。否則,UPDATE表達式將被評估,並且用於設置列的結果,例如執行原子增量。一個UPSERT以相同的同一行提交的批處理將在執行順序進行處理。
例:
UPSERT INTO TEST VALUES('foo','bar',3);
UPSERT INTO TEST(NAME,ID) VALUES('foo',123);
UPSERT INTO TEST(ID, COUNTER) VALUES(123, 0) ON DUPLICATE KEY UPDATE COUNTER = COUNTER + 1;
UPSERT INTO TEST(ID, MY_COL) VALUES(123, 0) ON DUPLICATE KEY IGNORE;
Upsert select
如果不存在插入,並根據運行另一個查詢的結果更新表中的行。這些值根據源和目標表之間的匹配位置來設置。列的列表是可選的,如果不存在,將按照它們在模式中聲明的順序映射到列。如果自動提交開啟,並且a)目標表與源表匹配,並且b)select不執行聚合,則目標表的總體將在服務器端完成(具有約束違反記錄但是否則忽略)。否則,在客戶端上緩存數據,如果自動提交開啟,則按照UpsertBatchSize連接屬性(或phoenix.mutate.upsertBatchSize HBase配置屬性默認為10000行)按行批處理提交數據,
例:
UPSERT INTO test.targetTable(col1, col2) SELECT col3, col4 FROM test.sourceTable WHERE col5 < 100
UPSERT INTO foo SELECT * FROM bar;
3 Delete
刪除where子句選擇的行。如果自動提交開啟,則刪除完全由服務器端執行。
例:
DELETE FROM TEST;
DELETE FROM TEST WHERE ID=123;
DELETE FROM TEST WHERE NAME LIKE 'foo%';
4 Crteate table
創建一個新表。HBase引用的表和列族如果不存在,將被創建。除非是雙引號,否則所有表,列系列和列名都是高位,在這種情況下,它們是區分大小寫的。HBase表中存在但未列出的列系列將被忽略。在創建時,為了提高查詢性能,如果沒有明確定義列族,則將空鍵值添加到任何現有行或默認列族的第一列系列中。Upserts還將添加這個空鍵值。這可以通過擁有一個鍵值列來提高查詢性能,我們可以保證始終存在,從而最小化必須投影並隨后返回給客戶端的數據量。HBase表和列配置選項可以作為鍵/值對傳遞,以HBase根據需要配置表。請注意,當使用該IF NOT EXISTS子句時,如果表已經存在,則不會對此進行任何更改。另外,沒有驗證是否檢查現有的表元數據是否與提出的表元數據相匹配。所以最好使用DROP TABLE后面CREATE TABLE是表元數據可能會改變。
例:
CREATE TABLE my_schema.my_table ( id BIGINT not null primary key, date)
CREATE TABLE my_table ( id INTEGER not null primary key desc, date DATE not null,
m.db_utilization DECIMAL, i.db_utilization)
m.DATA_BLOCK_ENCODING='DIFF'
CREATE TABLE stats.prod_metrics ( host char(50) not null, created_date date not null,
txn_count bigint CONSTRAINT pk PRIMARY KEY (host, created_date) )
CREATE TABLE IF NOT EXISTS "my_case_sensitive_table"
( "id" char(10) not null primary key, "value" integer)
DATA_BLOCK_ENCODING='NONE',VERSIONS=5,MAX_FILESIZE=2000000 split on (?, ?, ?)
CREATE TABLE IF NOT EXISTS my_schema.my_table (
org_id CHAR(15), entity_id CHAR(15), payload binary(1000),
CONSTRAINT pk PRIMARY KEY (org_id, entity_id) )
TTL=86400
5 Drop table
放一張桌子 可選CASCADE關鍵字也會導致表上的任何視圖都被刪除。刪除表時,默認情況下,底層HBase數據和索引表將被刪除。phoenix.schema.dropMetaData可用於覆蓋此值,並保留HBase時間點查詢的表。
例:
DROP TABLE my_schema.my_table;
DROP TABLE IF EXISTS my_table;
DROP TABLE my_schema.my_table CASCADE;