導(dǎo)購網(wǎng)站建設(shè)網(wǎng)絡(luò)營銷有什么方式
????????本文結(jié)合了個人的筆記以及工作中實(shí)踐經(jīng)驗以及參考HBase官網(wǎng),我盡可能把自己的知識點(diǎn)呈現(xiàn)出來,如果有誤,還請指正。
1. HBase背景
????????HBase作為面向列的數(shù)據(jù)庫運(yùn)行在HDFS之上,HDFS缺乏隨機(jī)讀寫操作,HBase正是為此而出現(xiàn)。HBase參考 Google 的 Bigtable 實(shí)現(xiàn),以鍵值對的形式存儲。項目的目標(biāo)就是快速在主機(jī)內(nèi)數(shù)十億行數(shù)據(jù)中定位所需的數(shù)據(jù)并訪問它。
分析這句話包含的隱藏信息:
2. hbase特點(diǎn)
-
建立在HDFS之上的分布式面向列的數(shù)據(jù)庫
-
KV結(jié)構(gòu)數(shù)據(jù)庫,原生不支持標(biāo)準(zhǔn)SQL,屬于NOSQL數(shù)據(jù)庫
-
支持快速隨機(jī)讀寫海量數(shù)據(jù)
-
具備HDFS的高容錯能力
-
不屬于關(guān)系型數(shù)據(jù)庫,適合存儲非機(jī)構(gòu)化數(shù)據(jù),基于列存儲
3. hbase和hive的區(qū)別
-
hive適合統(tǒng)計分析,hive底層執(zhí)行的是MapReduce,延遲較高
-
列式存儲適合關(guān)聯(lián)查詢場景,而行式存儲適合點(diǎn)查詢場景
-
hbase適合大數(shù)據(jù)量查詢,不適合統(tǒng)計分析,hbase底層采用KV結(jié)構(gòu)存儲,可以快速返回數(shù)據(jù)(能知道你的數(shù)據(jù)存在哪個region上)
-
hbase采用列式存儲,可以動態(tài)擴(kuò)展列(想加多少列就能加多少)
具體對上面解釋的筆記
4. hbase數(shù)據(jù)單元
4.1 基礎(chǔ)知識
hbase是一個稀疏的、多維度、有序的映射表,表中的每個單元是通過行鍵、列族、列限定符和時間戳組成的索引來標(biāo)識的,每個單元存儲的值是一個未經(jīng)解釋的二進(jìn)制數(shù)組byte[],沒有數(shù)據(jù)類型,當(dāng)用戶在表中存儲數(shù)據(jù)時,每一行都有一個唯一的行鍵和任意多的列,表的每一行由一個或者多個列族組成,一個列族可以包含任意多個列。
-
行鍵rowkey(主鍵)
每條數(shù)據(jù)的主鍵,rowkey是有序的,采用字典順序排序,方便快速查找,rowkey的設(shè)計至關(guān)重要,建表時不指定。
-
列族column family(將相同類別的字段,放到同一個列族中)
多個列的組合,建表時指定。
-
列限定符column(字段)
歸屬于一個列族,代表著一列,建表時不指定,可動態(tài)擴(kuò)展列,表達(dá)方式為column family:column,例:cf:name,標(biāo)識在cf列族下的name列。
-
時間戳version
默認(rèn)為系統(tǒng)時間戳timestamp,代表著一份數(shù)據(jù)不同時間節(jié)點(diǎn)的版本。
-
值value
由rowkey、column family、column、version索引檢索得到的唯一值,key<rowkey、column family、column、version> ,value<唯一的值>,KV結(jié)構(gòu)就由此而來。
4.2 hbase架構(gòu)細(xì)節(jié)解釋
索引
表中的每個單元是通過行鍵、列族、列限定符和時間戳組成的索引來標(biāo)識的
????????????????????????????【這張圖片引用參考:https://zhuanlan.zhihu.com/p/151871736】
單元存儲
每個單元存儲的值是一個未經(jīng)解釋的二進(jìn)制數(shù)組byte[],沒有數(shù)據(jù)類型
hive行式存儲與hbase列式存儲
如下示例進(jìn)行兩種數(shù)據(jù)存儲方式的對比: 當(dāng)用戶在表中存儲數(shù)據(jù)時,每一行都有一個唯一的行鍵和任意多的列,表的每一行由一個或者多個列族組成,一個列族可以包含任意多個列。
列族
列族column family(將相同類別的字段,放到同一個列族中)
4.3兩種數(shù)據(jù)存儲方式的對比:
hive行式存儲
rowkey | name | age | address |
---|---|---|---|
1001 | user1 | 20 | beijing |
1002 | user2 | 21 | shanghai |
-
hbase列式存儲
rowkey | cf | column | version(時間戳) | value |
---|---|---|---|---|
1001 | cf | cf:name | t1 | user1 |
1001 | cf | cf:age | t2 | 20 |
1001 | cf | cf:address | t3 | beijing |
1002 | cf | cf:name | t4 | user2 |
1002 | cf | cf:age | t5 | 21 |
1002 | cf | cf:address | t6 | shanghai |
hbase 版本
????????hbase沒有修改語法,當(dāng)要修改一條數(shù)據(jù)只需要直接寫入即可。
????????version默認(rèn)是由系統(tǒng)時間戳表示,當(dāng)用戶重復(fù)寫入一條數(shù)據(jù)時,hbase會記錄兩條數(shù)據(jù),因為rowkey、column family、column相同,此時則使用version字段進(jìn)行區(qū)分,并且會保留上一個版本的數(shù)據(jù),同一條數(shù)據(jù)不同版本使用version倒序排序!如下:
原數(shù)據(jù)
rowkey | cf | column | version | value |
---|---|---|---|---|
1001 | cf | cf:name | t1 | user1 |
1001 | cf | cf:age | t2 | 20 |
1001 | cf | cf:address | t3 | beijing |
1002 | cf | cf:name | t4 | user2 |
1002 | cf | cf:age | t5 | 21 |
1002 | cf | cf:address | t6 | shanghai |
此時用戶要修改如下數(shù)據(jù)name的value值
rowkey | cf | column | value |
---|---|---|---|
1001 | cf | cf:name | newusername |
執(zhí)行添加數(shù)據(jù)命令put 'namespace:tablename','1001','cf:name','newusername'后hbase表數(shù)據(jù)
rowkey | cf | column | version | value |
---|---|---|---|---|
1001 | cf | cf:name | t7 | newusername |
1001 | cf | cf:name | t1 | user1 |
1001 | cf | cf:age | t2 | 20 |
1001 | cf | cf:address | t3 | beijing |
1001 | cf | cf:name | t4 | user2 |
1001 | cf | cf:age | t5 | 21 |
1001 | cf | cf:address | t6 | shanghai |
????????當(dāng)一條數(shù)據(jù)存在多個版本的時候,查詢?nèi)绻恢付ò姹?#xff0c;則默認(rèn)查詢最新一條數(shù)據(jù),hbase的version也不是可以無限存的,默認(rèn)版本數(shù)為3,可以設(shè)置最多存儲多少個版本,當(dāng)超過設(shè)定的版本數(shù)之后則刪除最早版本的數(shù)據(jù)。
laoli_matrix70演示:插入數(shù)據(jù)
參考資料:
Apache HBase? Reference Guide? ? HBASE官網(wǎng)