1. 程式人生 > >Hbase學習筆記,你想知道的Hbase

Hbase學習筆記,你想知道的Hbase

1、 什麼是Hbase?

  HBase是一個構建在HDFS之上的、分散式的、面向列的開源資料庫,不同於一般的關係資料庫,它是一個適合於非結構化海量資料儲存的資料庫,是由Google Bigtable的開源實現,它主要用於儲存海量資料,是Hadoop生態系統中的重要一員。Hbase可以使用shell、web、api等多種方式訪問,適合高讀寫(insert)的場景,HQL查詢語言,NoSQL的典型代表產品。

2、 Hbase邏輯模型

  • l  以表的形式存放資料
  • l  表由行與列組成,每個列屬於某個列族,由行和列確定的儲存單元稱為元素
  • l  每個元素儲存了同一份資料的多個版本,由時間戳來標識區分

行健

時間戳

列族contents

列族anchor

列族mime

“com.cnn.www”

t9

 

anchor.cnnsi.com= “CNN”

 

t8

 

anchor: my.look.ca= “CNN.com”

 

t6

contents:html= “<html>…”

 

mime: type= “text/html”

t5

contents:html= “<html>…”

 

 

t3

contents:html= “<html>…”

 

 

  1. 行健:行健是資料行在表裡的唯一標識,並作為檢索記錄的主鍵,訪問表裡的行只有三種方式,1、通過單個行鍵訪問2、給定行鍵的範圍訪問3、全表掃描。行鍵可以是最大長度不超過64KB的任意字串,並按照字典序儲存。對於經常要一起讀取的行,要對行鍵值精心設計,以便它們能放在一起儲存。
  2. 列族與列:1、列表示為<列族>:<限定符>  2、Hbase在磁碟上按照列族儲存資料,這種列式資料庫的設計非常適合於資料分析的情形。3、列族裡的元素最好具有相同的讀寫方式(例如等長的字串),以提高效能。
  3. 時間戳:1、對應每次資料操作的時間,可由系統自動生成,也可以由使用者顯式的賦值。2、Hbase支援兩種資料版本回收方式:1)每個資料單元,只儲存指定個數的最新版本 2)儲存指定時間長度的版本(例如7天)。
    • 常見的客戶端時間查詢:“某個時刻起的最新資料”或“給我全部版本的資料”
    • 元素由行鍵,列族:限定符,時間戳唯一決定
    • 元素以位元組碼形式存放,沒有型別之分

3、 Hbase的物理模型

 

  Region和Region伺服器

  • 表在行方向上,按照行鍵範圍劃分成若干的Region
  • 每個表最初只有一個region,當記錄數增加到超過某個閾值時,開始分裂成兩個region
  • 物理上所有資料存放在HDFS,由Region伺服器提供region的管理
  •  一臺物理節點只能跑一個HRegionServer
  •  一個Hregionserver可以管理多個Region例項
  • 一個Region例項包括Hlog日誌和存放資料的Store
  •  Hmaster作為總控節點
  •  Zookeeper負責排程

  HLog

  • 用於災難恢復
  • 預寫式日誌,記錄所有更新操作,操作先記錄進日誌,資料才會寫入

  -Root-和.META.表

  •  HBase中有兩張特殊的Table,-ROOT-和.META.
  • .META.:記錄了使用者表的Region資訊,.META.可以有多個regoin
  • -ROOT-:記錄了.META.表的Region資訊,-ROOT-只有一個region
  •  Zookeeper中記錄了-ROOT-表的location

  Memstore和storefile

  • 一個region由多個store組成,每個store包含一個列族的所有資料
  • Store包括位於把記憶體的memstore和位於硬碟的storefile
  • 寫操作先寫入memstore,當memstore中的資料量達到某個閾值,Hregionserver會啟動flashcache程序寫入storefile,每次寫入形成單獨一個storefile
  • 當storefile檔案的數量增長到一定閾值後,系統會進行合併,在合併過程中會進行版本合併和刪除工作,形成更大的storefile
  • 當storefile大小超過一定閾值後,會把當前的region分割為兩個,並由Hmaster分配到相應的region伺服器,實現負載均衡
  • 客戶端檢索資料時,先在memstore找,找不到再找storefile

  Hbase和Oracle

  • 索引不同造成行為的差異
  • Hbase適合大量插入同時又有讀的情況
  • Hbase的瓶頸是硬碟傳輸速度,Oracle的瓶頸是硬碟尋道時間
  • Hbase很適合尋找按照時間排序top n的場景

4、 Hbase實戰

  進入/opt/cloudera/parcels/CDH/lib/hbase/bin下,使用命令hbase shell啟動hbase。這是發現提示錯誤JAVA_HOME is not set。因此要進行配置,使用命令vi /conf/hbase-env.sh,新增export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64儲存退出。再次執行hbase shell,執行成功。

 

  利用shell命令進行簡單的管理和操作:

  1) 利用status命令查詢資料庫狀態

 

  2) 利用version命令檢視資料庫版本

 

  3) 建立表  create ‘member’, ‘member_id’, ‘address’, ‘info’; 其中member表示表名,‘member_id’, ‘address’, ‘info’表示列族的名字。

 

  4) 利用命令list列出所有的表,還可以用describe ‘member’

 

  5) 對錶的結構進行改動,刪除列族:alter、disable、enable命令。在修改表結構之前,必須先使用命令disable ‘member’將表進行離線,再進行刪除,刪除過後再設定enable ‘member’

 

  6) 刪除表,首先使用命令disable ‘member’將表進行離線disable 掉,再使用命令drop ‘member’進行表的刪除。

 

  7) 使用命令exists ‘member’查詢一個表是否存在

 

  8) 判斷表是否enable或disable,使用命令is_enabled ‘member’和命令 is_disabled ‘member’,表之前進行刪除了,後面不進行演示了,可以根據例子自行練習。

  9) 插入記錄使用命令,其中‘member’當然表示表名;‘scutshuxue’表示行健;‘info’表示列族名; 每一個put系統都會自動建立一個時間戳,當然這個時間戳也可以自己指定。其中,更新一條記錄其實跟插入資料是一樣的,做的是資料的覆蓋。

 put 'member', 'scutshuxue', 'info:age', '24'  
 put ‘member’, 'scutshuxue', 'info:birthday', '1987-06-17'
 put 'member', 'scutshuxue', 'info:company', 'alibaba'
 ……

  10) 獲取一個行健的所有資料,使用命令 get ‘member’, ‘scutshuxue’;也可以獲取一個行健中,某一個列族的所有資料使用命令 get ‘member’, ‘scutshuxue’, ‘info’; 還可以獲取一個行健,一個列族中一個列的所有資料使用命令 get ‘member’, ‘scutshuxue’, ‘info:age’

  11) 全表掃描,使用命令 scan ‘member’

  12) 刪除指定行健的欄位,使用命令 delete ‘member’, ‘scutshuxue’, ‘info:age’    刪除整行,使用命令deleteall ‘表明’, ‘行健’

  13) 查詢表中有多少行,使用命令 count ‘member’

  15) 要清空表的話,使用命令 truncate ‘member’,其原理是先刪除表,再進行重建

5、 什麼情況下我們可以使用Hbase?

  1. 成熟的資料分析主題,查詢模式已經確立並且不輕易改變
  2. 傳統的關係型資料庫已經無法承受負荷,高速插入,大量讀取
  3. 適合海量的,但同時也是簡單的操作(例如key-value)