HBase基本知識和應用場景
✿ 誕生背景:
hadoop局限性: Hadoop 只能執行批量處理,並且只以順序方式訪問數據。
✿ hadoop實際應用之一:Hadoop+HBase(隨機高效讀取)建立NoSQL分布式數據庫應用
一、HBase(HBase以表的形式存儲數據,表有行和列組成。)
1,什么是HBase?
HBase是一個分布式的、面向列的開源數據庫。本質是一個數據庫(適用於分布式的數據庫,它面向列)。
HBase 結構,首先是一張表結構,然后與一般表不同的是,一般表:同一個列名下的那些一個個的單元格的值類型是相同的,而 HBase表是同一個列名下的那些一個個的單元格的值類型是不同,且數量不同...
(相比於傳統表,同列名下的一個個單元格,hbase 的單元格內容,可以裝不定長的數據(一些以鍵值對形式存儲的數據,一些則直接也是單個值的形式))
✿ 傳統表:單元格 是一個坑一個蘿卜
✿ HBase表:單元格 是一個坑 一把花生 (花生有雙仁、單仁的哦)
(圖:傳統的表)
(圖2:HBase 表)
列族里的數據通過列限定符或列來定位,
通過列限定符來定位例如:Sname:nickName,Sage:female 等等;通過列來定位 的例如:Sname:小紅
2,HBase 中的表特點:
(1)大:一個表可以有上十億行,上百萬列
(2)面向列:列可以靈活指定,面向列(族)的存儲和權限控制,列(簇)獨立檢索。
(3)稀疏:對於為空(null)的列,並不占用存儲空間,因此,表可以設計的非常稀疏。
(4)無嚴格模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列
3.1,HTable一些基本概念1
☺ 在HBase中,HTable是其客戶端和服務端通信的java api對象,主要提供對表的put/get/delete/scan等操作
創建一個 hBase 對象:
Configuration conf = HBaseConfiguration.create(); HTable hTable = new HTable(conf, "tableName");
② HTable 的增刪改查,這里簡單舉幾個例子
●獲取指定行某些單元格對應的值:public Result get(final Get get) throws IOException
●獲取表名:public byte [] getTableName()
●添加值:public void put(final Put put) throws IOException
●刪除指定單元格/行:void delete(Delete delete) throws IOException
......
ps: HBase Java API 代碼開發
常用的幾個主要HBase API類和數據模型之間的對應關系:
3.2, HTable一些基本概念2 【表結構邏輯視圖】
表:HBase用表來組織數據。
行:在表里,數據按行存儲,行由行鍵唯一標識。行鍵沒有數據類型,為字節數組byte[]。
列族:行里的數據按照列族分組,列族必須事先定義並且不輕易修改。表中每行擁有相同的列族。
列限定符:列族里的數據通過列限定符或列來定位,列限定符不必事先定義。
單元:存儲在單元里的數據稱為單元值,值是字節數組。單元由行鍵,列族或列限定符一起確定。
時間版本:單元值有時間版本,是一個long類型。 |
1、 行鍵(RowKey):
① 通過單個 row key 訪問
② 通過 row key 的 range
③ 全表掃描
2、 列簇(Column Family):
- HBase 表中的每個列,都歸屬與某個列簇。列簇是表的 Schema 的一部分(而列不是)
- 列名都以列簇作為前綴。例如:student:name,student:age,teacher:age 等等 (例子在文章最后的圖1)
- 訪問控制、磁盤和內存的使用統計等都是在列簇層面進行的。
- 列簇越多,在取一行數據時所要參與 IO、搜尋的文件就越多,所以,如果沒有必要,不要設置太多的列簇,官網推薦是小於等於 3(最好就一個列簇)
3、 時間戳(TimeStamp):
■ 時間戳可以由 HBase (在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。
■ 每個單元格都保存着同一份數據的多個版本。版本通過時間戳來索引。
■ 如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。
■ 每個單元格中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。HBase 在查詢的時候,默認返回最新版本/最近的數據。如果需要讀取舊版本的數據,可以指定時間戳。
□ 為了避免數據存在過多版本造成的的管理(包括存儲和索引)負擔,HBase 提供了兩種數據版本回收方式:
保存數據的最后 n 個版本
保存最近一段時間內的版本(設置數據的生命周期 TTL)。
用戶可以針對每個列簇進行設置。
4、 單元格(Cell):
■ 由{RowKey, Column( =<Column Family> + <Qualifier>), Version} 唯一確定的單元。Cell 中的數據是沒有類型的,全部是字節碼形式存儲。
二、HBase 的安裝和應用
對應於Hadoop,HBase 也有三種運行模式:單機模式、偽分布式模式、分布式模式。
..........(安裝過程遇到的bug,請參考文章)《HBase 安裝之后版本的驗證的bug:(錯誤的替換、找不到或無法加載主類、SLF4J)》
附錄
圖1:HBase 表結構
圖2:列名以列簇作為前綴的例子
列族里的數據通過列限定符或列來定位,
通過列限定符來定位例如:Sname:nickName,Sage:female 等等;通過列來定位 的例如:Sname:小紅
參考文章:
《Hbase總結(五)-hbase常識及habse適合什么場景》https://blog.csdn.net/lifuxiangcaohui/article/details/39894265
《hBase之HTable踩坑》https://www.jianshu.com/p/8f5fad6d7c9c
《HBase基礎知識》https://blog.csdn.net/qq_1018944104/article/details/85013790
《HBase 的Get(讀),Put(寫),Delete(刪),Scan(掃描)和Increment(列值遞增)》https://www.cnblogs.com/wangleBlogs/p/9935553.html