HBase(1/5)

 

HBase學習(一)

一、了解HBase

官方文檔://hbase.apache.org/book.html

 

 

1.1 HBase概述

HBase 是一個高可靠性、高性能、面向列、可伸縮的分散式存儲系統,用於存儲海量的結構化或者半結構化,非結構化的數據(底層是位元組數組做存儲的)

HBase是Hadoop的生態系統之一,是建立在Hadoop文件系統(HDFS)之上的分散式、面向列的資料庫,通過利用Hadoop的文件系統提供容錯能力。如果需要進行實時讀寫或者隨機訪問大規模的數據集的時候,會考慮使用HBase。

HBase作為Google Bigtable的開源實現,Google Bigtable利用GFS作為其文件存儲系統類似,則HBase利用Hadoop HDFS作為其文件存儲系統;Google通過運行MapReduce來處理Bigtable中的海量數據,同樣,HBase利用Hadoop MapReduce來處理HBase中的海量數據;Google Bigtable利用Chubby作為協同服務,HBase利用Zookeeper作為對應。在2010年5月,成為apache頂級項目

 

 

1.2 HBase處理數據

雖然Hadoop是一個高容錯、高延時的分散式文件系統和高並發的批處理系統,但是它不適用於提供實時計算;

HBase是可以提供實時計算的分散式資料庫,數據被保存在HDFS分散式文件系統上,由HDFS保證期高容錯性;

但是再生產環境中,HBase是如何基於hadoop提供實時性呢?

HBase上的數據是以StoreFile(HFile)二進位流的形式存儲在HDFS上block塊兒中;

但是HDFS並不知道的HBase用於存儲什麼,它只把存儲文件認為是二進位文件,也就是說,HBase的存儲數據對於HDFS文件系統是透明的。

1.3 HBase與HDFS

在下面的表格中,我們對HDFS與HBase進行比較:

HDFS HBase
HDFS適於存儲大容量文件的分散式文件系統。 HBase是建立在HDFS之上的資料庫。
HDFS不支援快速單獨記錄查找。 HBase提供在較大的錶快速查找
HDFS提供了高延遲批量處理;沒有批處理概念。 HBase提供了數十億條記錄低延遲訪問單個行記錄(隨機存取)。
HDFS提供的數據只能順序訪問。 HBase內部使用哈希表和提供隨機接入,並且其存儲索引,可將在HDFS文件中的數據進行快速查找。

Hbase—>HashMap

二、HBase相關概念

2.1 分散式資料庫

1、畫圖理解分散式是什麼樣子(region)

 

2.2 列式存儲

2、畫圖理解列式存儲 拿與mysql(必須項:表+列)中的表做對比(必須項:表+列簇)

 

2.3 稀疏性

3、畫圖理解稀疏(rowkey)

HBase中需要根據行鍵、列族、列限定符和時間戳來確定一個單元格,因此,可以視為一個「四維坐標」,即[行鍵, 列族, 列限定符, 時間戳]

 

2.4 數據模型

HBase通過表格的模式存儲數據,每個表格由列和行組成,其中,每個列又被劃分為若干個列族(colnum family),請參考下面的圖:

 

 

表:HBase的數據同樣是用表來組織的,表由行和列組成,列分為若干個列族,行和列的坐標交叉決定了一個單元格。

  行:每個表由若干行組成,每個行有一個行鍵作為這一行的唯一標識。訪問表中的行只有三種方式:通過單個行鍵進行查詢、通過一個行鍵的區間來訪問、全表掃描。

  列族:一個HBase表被分組成許多「列族」的集合,它是基本的訪問控制單元。

  列修飾符(列限定符):列族裡的數據通過列限定符(或列)來定位

  單元格:在HBase表中,通過行、列族和列限定符確定一個「單元格」(cell),單元格中存儲的數據沒有數據類型,總被視為位元組數組byte[]

  時間戳:每個單元格都保存著同一份數據的多個版本,這些版本採用時間戳進行索引

2.4.1 Hbase數據模型

HBase將數據存放在帶有標籤的中,表由行和列組成,行和列交叉確定一個單元格,單元格有版本號,版本號自動分配,為數據插入該單元格時的時間戳。單元格的內容沒有數據類型,所有數據都被視為未解釋的位元組數組

  表格中每一行有一個行鍵(也是位元組數組,任何形式的數據都可以表示成字元串,比如數據結構進行序列化之後),整個表根據行鍵的位元組序來排序,所有對錶的訪問必須通過行鍵。

  表中的列又劃分為多個列族(column family),同一個列族的所有成員具有相同的前綴,具體的列由列修飾符標識,因此,列族和列修飾符合起來才可以表示某一列,比如:info:format、cotents:image

 

 

在創建一個表的時候,列族必須作為模式定義的一部分預先給出,而列族是支援動態擴展的,也就是列族成員可以隨後按需加入。物理上,所有的列族成員一起存放在文件系統上,所以實際上說HBase是面向列的資料庫,更準確的應該是面向列族,調優和存儲都是在列族這個層次上進行的。一般情況下,同一個列族的成員最後具有相同的訪問模式和大小特徵。

  總結起來,HBase表和我們熟知的RDBMS的表很像,不同之處在於:行按行鍵排序,列劃分為列族,單元格有版本號,沒有數據類型。

2.4.2 Hbase數據坐標

HBase中需要根據行鍵、列族、列限定符和時間戳來確定一個單元格(cell),cell中的數據是沒有類型的,全部是位元組碼形式存貯。,因此,可以視為一個「四維坐標」,即[行鍵, 列族, 列限定符, 時間戳]

 

 

對於上圖這樣一個HBase表,其數據坐標舉例如下:

[「201505003」, 「Info」, 「email」, 1174184619081] [email protected]
[「201505003」, 「Info」, 「email」, 1174184620720] [email protected]

2.4.3 HBase區域

HBase自動把表水平劃分為區域(Region),每個區域都是有若干連續行構成的,一個區域由所屬的表、起始行、終止行(不包括這行)三個要素來表示。

  一開始,一個表只有一個區域,但是隨著數據的增加,區域逐漸變大,等到它超出設定的閾值大小,就會在某行的邊界上進行拆分,分成兩個大小基本相同的區域。然後隨著數據的再增加,區域就不斷的增加,如果超出了單台伺服器的容量,就可以把一些區域放到其他節點上去,構成一個集群。也就是說:集群中的每個節點(Region Server)管理整個表的若干個區域。所以,我們說:區域是HBase集群上分布數據的最小單位

 

 

三、HBase系統架構

3.1 架構圖

 

 

3.2 組件介紹

HBase由三種類型的伺服器以主從模式構成:

  • Region Server:負責數據的讀寫服務,用戶通過與Region server交互來實現對數據的訪問。

  • HBase HMaster:負責Region的分配及資料庫的創建和刪除等操作。

  • ZooKeeper:負責維護集群的狀態(某台伺服器是否在線,伺服器之間數據的同步操作及master的選舉等)。

HDFS的DataNode負責存儲所有Region Server所管理的數據,即HBase中的所有數據都是以HDFS文件的形式存儲的。出於使Region server所管理的數據更加本地化的考慮,Region server是根據DataNode分布的。HBase的數據在寫入的時候都存儲在本地。但當某一個region被移除或被重新分配的時候,就可能產生數據不在本地的情況。這種情況只有在所謂的compaction之後才能解決。

Client

包含訪問HBase的介面並維護cache來加快對HBase的訪問

Zookeeper

保證任何時候,集群中只有一個master

存貯所有Region的定址入口。

實時監控Region server的上線和下線資訊。並實時通知Master

存儲HBase的schema和table元數據

Master

為Region server分配region

負責Region server的負載均衡

發現失效的Region server並重新分配其上的region

管理用戶對table的增刪改操作

RegionServer

Region server維護region,處理對這些region的IO請求

Region server負責切分在運行過程中變得過大的region 

HLog(WAL log):

HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey對象,HLogKey中記錄了寫入數據的歸屬資訊,除了table和 region名字外,同時還包括sequence number和timestamp,timestamp是」 寫入時間」,sequence number的起始值為0,或者是最近一次存入文件系 統sequence number。

HLog SequeceFile的Value是HBase的KeyValue對象,即對應HFile中的 KeyValue

Region

HBase自動把表水平劃分成多個區域(region),每個region會保存一個表裡面某段連續的數據;每個表一開始只有一個region,隨著數據不斷插 入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region(裂變);

當table中的行不斷增多,就會有越來越多的region。這樣一張完整的表被保存在多個Regionserver上。

Memstore 與 storefile

  1. 一個region由多個store組成,一個store對應一個CF(列簇)

  2. store包括位於記憶體中的memstore和位於磁碟的storefile寫操作先寫入 memstore,當memstore中的數據達到某個閾值,hregionserver會啟動 flashcache進程寫入storefile,每次寫入形成單獨的一個storefile

  3. 當storefile文件的數量增長到一定閾值後,系統會進行合併(minor、 major compaction),在合併過程中會進行版本合併和刪除工作 (majar),形成更大的storefile。

  4. 當一個region所有storefile的大小和超過一定閾值後,會把當前的region 分割為兩個,並由hmaster分配到相應的regionserver伺服器,實現負載均衡。

  5. 客戶端檢索數據,先在memstore找,找不到再找storefile

  6. HRegion是HBase中分散式存儲和負載均衡的最小單元。最小單元就表 示不同的HRegion可以分布在不同的HRegion server上。

  7. HRegion由一個或者多個Store組成,每個store保存一個columns family。

  8. 每個Strore又由一個memStore和0至多個StoreFile組成。

如圖:StoreFile 以HFile格式保存在HDFS上。

 

 

 

 

3.3 理解難點

  1、flush刷新在HDFS上呈現究竟是怎麼刷新的呢??
    我們目前剛剛學習的時候,添加數據,都是一條一條的put進去,而我們在put的數據比較少(小於128M)的時候,我們put完去HDFS上並未查看到我們put的文件,這是因為數據還在記憶體中,也就是還在memStore中,所以要想在HDFS中查看到,我們必須手動刷新到磁碟中,這是將memStore的數據刷新到StoreFile中去,這樣我們在HDFS中就可以查看到了。  

  2、為什麼Hbase不可以使用像Mysql那樣進行查詢??
    首先,我們應該可以感受到,我們在插入的時候,每行數據,有多少列,列名叫什麼完全是我們自己定義的,之所以不支援像MySql那樣對列進行查詢和操作,因為不確定列的個數和名稱。

  3、數據最後存在HDFS上的,HDFS不支援刪改,為什麼Hbase就可以呢??
    這裡有個思想誤區,的確,數據是以HFile形式存在HDFS上的,而且HDFS的確是不支援刪改的,但是為什麼Hbase就支援呢?首先,這裡的刪除並不是真正意義上的對數據進行刪除,而是對數據進行打上標記,我們再去查的時,就不會查到這個打過標記的數據,這個數據Hmaster會每隔1小時清理。修改是put兩次,Hbase會取最新的數據,過期數據也是這個方式被清理。

四、HBase1.4.6安裝搭建

4.1 hbase下載

官網下載地址://www.apache.org/dyn/closer.lua/hbase/1.4.6/hbase-1.4.6-bin.tar.gz

 

 

4.2 前期準備(Hadoop,zookeeper,jdk)

啟動hadoop

start-all.sh

驗證

//master:50070

啟動zookeeper(三台分別啟動)

zkServer.sh start

檢查狀態

zkServer.sh status

4.3 搭建Hbase

1、上傳解壓

tar -zxvf hbase-1.4.6-bin.tar.gz

2、配置環境變數

export HBASE_HOME=/usr/local/soft/hbase-1.4.6

$HBASE_HOME/bin

source /etc/profile

3、修改hbase-env.sh文件

增加java配置

export JAVA_HOME=/usr/local/soft/jdk1.8.0_171

關閉默認zk配置(原本是注釋的,放開修改false)

export HBASE_MANAGES_ZK=false

4、修改hbase-site.xml文件

   <property> 
      <name>hbase.rootdir</name> 
      <value>hdfs://master01:9000/hbase</value> 
   </property> 
   <property> 
      <name>hbase.cluster.distributed</name> 
      <value>true</value> 
   </property> 
   <property> 
      <name>hbase.zookeeper.quorum</name> 
      <value>node1,node2,master01</value> 
   </property> 

5、修改regionservers文件

如果是偽分散式版本,增加master即可

node1
node2

6、同步到所有節點(如果是偽分散式不需要同步)

scp -r hbase-1.4.6 node1:`pwd`
scp -r hbase-1.4.6 node2:`pwd`

7、啟動hbase集群 , 在master上執行

start-hbase.sh

 

 

8、驗證hbase

//master:16010

 

 

hbase日誌文件所在的目錄: /usr/local/soft/hbase-1.7.1/logs

9、關閉集群的命令

stop-hbase.sh

4.4 啟動順序

啟動順序
Hadoop及hbase集群啟動順序 zookeepeer -> hadoop -> hbase

停止順序
Hadoop及hbase集群關閉順序 hbase -> hadoop -> zookeepeer

4.5 重置hbase

1、關閉hbase集群
   1)殺死進程
   
   2)stop-hbase.sh
2、刪除數據 hdfs
 hdfs dfs -rmr /hbase
3、刪除元數據 zk
   zkCli.sh
   rmr /hbase
4、重新啟動hbase
   start-hbase.sh
時間同步
yum install ntp -y

ntpdate -u time.windows.com

五、hbase shell

命名 描述 語法
help 『命名名』 查看命令的使用描述 help 『命令名』
whoami 我是誰 whoami
version 返回hbase版本資訊 version
status 返回hbase集群的狀態資訊 status
table_help 查看如何操作表 table_help
create 創建表 create 『表名』, 『列族名1』, 『列族名2』, 『列族名N』
alter 修改列族 添加一個列族:alter 『表名』, 『列族名』 刪除列族:alter 『表名』, {NAME=> 『列族名』, METHOD=> 『delete』}
describe 顯示錶相關的詳細資訊 describe 『表名』
list 列出hbase中存在的所有表 list
exists 測試表是否存在 exists 『表名』
put 添加或修改的表的值 put 『表名』, 『行鍵』, 『列族名』, 『列值』 put 『表名』, 『行鍵』, 『列族名:列名』, 『列值』
scan 通過對錶的掃描來獲取對用的值 scan 『表名』 掃描某個列族: scan 『表名』, {COLUMN=>『列族名』} 掃描某個列族的某個列: scan 『表名』, {COLUMN=>『列族名:列名』} 查詢同一個列族的多個列: scan 『表名』, {COLUMNS => [ 『列族名1:列名1』, 『列族名1:列名2』, …]}
get 獲取行或單元(cell)的值 get 『表名』, 『行鍵』 get 『表名』, 『行鍵』, 『列族名』
count 統計表中行的數量 count 『表名』
incr 增加指定錶行或列的值 incr 『表名』, 『行鍵』, 『列族:列名』, 步長值
get_counter 獲取計數器 get_counter 『表名』, 『行鍵』, 『列族:列名』
delete 刪除指定對象的值(可以為表,行,列對應的值,另外也可以指定時間戳的值) 刪除列族的某個列: delete 『表名』, 『行鍵』, 『列族名:列名』
deleteall 刪除指定行的所有元素值 deleteall 『表名』, 『行鍵』
truncate 重新創建指定表 truncate 『表名』
enable 使表有效 enable 『表名』
is_enabled 是否啟用 is_enabled 『表名』
disable 使表無效 disable 『表名』
is_disabled 是否無效 is_disabled 『表名』
drop 刪除表 drop的表必須是disable的 disable 『表名』 drop 『表名』
shutdown 關閉hbase集群(與exit不同)  
tools 列出hbase所支援的工具  
exit 退出hbase shell  

HBase Shell 是官方提供的一組命令,用於操作HBase。如果配置了HBase的環境變數了,就可以知己在命令行中輸入hbase shell 命令進入命令行。

hbase shell

 

 

在hbase中如果輸入錯誤,按住ctrl+退格 才能刪除

5.1 help命令

可以通過 help '命名名稱'來查看命令行的具體使用,包括命令的作用和用法。 通過help 『hbase』 命名來查看hbase shell 支援的所有命令,hbase將命令進行分組,其中ddl、dml使用較多。

 

 

help 'list'

 

 

5.2 general 類

5.2.1 顯示集群狀態status

 

 

5.2.2 查詢資料庫版本version

 

 

5.2.3 顯示當前用戶與組 whoami

 

 

5.2.4 查看操作表的命令table_help

 

 

5.2.5 退出HBase Shell exit

 

 

5.3 DDL相關

5.3.1. 創建表create

注意:創建表時只需要指定列族名稱,不需要指定列名。

# 語法
create '表名', {NAME => '列族名1'}, {NAME => '列族名2'}, {NAME => '列族名3'}
# 此種方式是上上面的簡寫方式,使用上面方式可以為列族指定更多的屬性,如VERSIONS、TTL、BLOCKCACHE、CONFIGURATION等屬性
create '表名', '列族名1', '列族名2', '列族名3'

create '表名', {NAME => '列族名1', VERSIONS => 版本號, TTL => 過期時間, BLOCKCACHE => true}


# 示例
create 'tbl_user', 'info', 'detail'
create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}

 

 

5.3.2 修改(添加、刪除)表結構Schema alter

5.3.2.1 添加一個列簇
# 語法 
alter '表名', '列族名'

# 示例
alter 'tbl_user', 'address'

 

 

5.3.2.2 刪除一個列簇
# 語法 
alter '表名', {NAME=> '列族名', METHOD=> 'delete'}

# 示例
alter 'tbl_user', {NAME=> 'address', METHOD=> 'delete'}

 

 

5.3.2.3 修改列族的屬性

可以修改列族的VERSIONS、IN_MEMORY

# 修改f1列族的版本為5
alter 't1', NAME => 'f1', VERSIONS => 5

# 修改多個列族,修改f2為記憶體,版本號為5
alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}

# 也可以修改table-scope屬性,例如MAX_FILESIZE, READONLY,MEMSTORE_FLUSHSIZE, DEFERRED_LOG_FLUSH等。
# 例如,修改region的最大大小為128MB:
alter 't1', MAX_FILESIZE => '134217728'

5.3.3 獲取表的描述describe

# 語法 
describe '表名'

# 示例
describe 'tbl_user'

 

 

5.3.4 列舉所有表list

 

 

5.3.5 表是否存在exists

# 語法 
exists '表名'

# 示例
exists 'tbl_user'

 

 

5.3.6 啟用表enable和禁用表disable

通過enable和disable來啟用/禁用這個表,相應的可以通過is_enabled和is_disabled來檢查表是否被禁用。

# 語法
enable '表名'
is_enabled '表名'

disable '表名'
is_disabled '表名'

# 示例
disable 'tbl_user'
is_disabled 'tbl_user'

enable 'tbl_user'
is_enabled 'tbl_user'

5.3.7 禁用滿足正則表達式的所有表disable_all

  • .匹配除「\n」和”\r”之外的任何單個字元

  • *匹配前面的子表達式任意次

# 匹配以t開頭的表名
disable_all 't.*'
# 匹配指定命名空間ns下的以t開頭的所有表
disable_all 'ns:t.*'
# 匹配ns命名空間下的所有表
disable_all 'ns:.*'

5.3.8 啟用滿足正則表達式的所有表enable_all

enable_all 't.*'
enable_all 'ns:t.*'
enable_all 'ns:.*'

5.3.9 刪除表drop

需要先禁用表,然後再刪除表,啟用的表是不允許刪除的

# 語法
disable '表名'
drop '表名'

# 示例
disable 'tbl_user'
drop 'tbl_user'

直接刪除報錯:

 

 

先禁用後刪除

 

 

5.3.10 刪除滿足正則表達式的所有表drop_all

drop_all 't.*'
drop_all 'ns:t.*'
drop_all 'ns:.*'

5.3.11 獲取某個表賦值給一個變數 get_table

通過 var = get_table 『表名』 賦值給一個變數對象,然後對象.來調用,就像面向對象編程一樣,通過對象.方法來調用,這種方式在操作某個表時就不必每次列舉表名了。

 

 

5.3.12 獲取rowKey所在的區 locate_region

locate_region '表名', '行鍵'

5.3.13 顯示hbase所支援的所有過濾器show_filters

過濾器用於get和scan命令中作為篩選數據的條件,類型關係型資料庫中的where的作用

 

 

5.4 namespace

hbase中沒有資料庫的概念 , 可以使用namespace來達到資料庫分類別管理表的作用

5.4.1 列舉命名空間 list_namespace

 

 

5.4.2 獲取命名空間描述 describe_namespace

describe_namespace 'default'

 

 

5.4.3 查看命名空間下的所有表 list_namespace_tables

list_namespace_tables 'default'

list_namespace_tables 'hbase'

 

 

5.4.4 創建命名空間create_namespace

create_namespace 'bigdata17'

5.4.5 刪除命名空間drop_namespace

drop_namespace '命名空間名稱'

5.5 DML

5.5.1 插入或者修改數據put

 

 

# 語法
# 當列族中只有一個列時'列族名:列名'使用'列族名'
put '表名', '行鍵', '列族名', '列值'
put '表名', '行鍵', '列族名:列名', '列值'

# 示例

# 創建表
create 'users', 'info', 'detail', 'address'

# 第一行數據
put 'users', 'rk1001', 'info:id', '1'
put 'users', 'rk1001', 'info:name', '張三'
put 'users', 'rk1001', 'info:age', '28'
put 'users', 'rk1001', 'detail:birthday', '1990-06-26'
put 'users', 'rk1001', 'detail:email', '[email protected]'
put 'users', 'rk1001', 'detail:create_time', '2019-03-04 14:26:10'
put 'users', 'rk1001', 'address', '上海市'

# 第二行數據
put 'users', 'rk1002', 'info:id', '2'
put 'users', 'rk1002', 'info:name', '李四'
put 'users', 'rk1002', 'info:age', '27'
put 'users', 'rk1002', 'detail:birthday', '1990-06-27'
put 'users', 'rk1002', 'detail:email', '[email protected]'
put 'users', 'rk1002', 'detail:create_time', '2019-03-05 14:26:10'
put 'users', 'rk1002', 'address', '北京市'


# 第三行數據
put 'users', 'rk1003', 'info:id', '3'
put 'users', 'rk1003', 'info:name', '王五'
put 'users', 'rk1003', 'info:age', '26'
put 'users', 'rk1003', 'detail:birthday', '1990-06-28'
put 'users', 'rk1003', 'detail:email', '[email protected]'
put 'users', 'rk1003', 'detail:create_time', '2019-03-06 14:26:10'
put 'users', 'rk1003', 'address', '杭州市'

5.5.2 全表掃描scan

# 語法
scan '表名'

# 示例
scan 'users'

 

 

掃描整個列簇

# 語法
scan '表名', {COLUMN=>'列族名'}

# 示例
scan 'users', {COLUMN=>'info'}

掃描整個列簇的某個列

# 語法
scan '表名', {COLUMN=>'列族名:列名'}

# 示例
scan 'users', {COLUMN=>'info:age'}

5.5.3 獲取數據get

# 語法
get '表名', '行鍵'

# 示例
get 'users', 'xiaoming'

根據某一行某列族的數據

# 語法
get '表名', '行鍵', '列族名'

# 示例
get 'users', 'xiaoming', 'info'
# 創建表,c1版本為4, 元數據mykey=myvalue
hbase(main):009:0> create 't1', {NAME => 'c1', VERSIONS => 4}, METADATA => { 'mykey' => 'myvalue' }
0 row(s) in 2.2810 seconds

=> Hbase::Table - t1
# 添加列族c2, c3
hbase(main):010:0> alter 't1', 'c2', 'c3'
Updating all regions with the new schema...
1/1 regions updated.
Done.
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.8320 seconds

# 出入數據,c1 插入4個版本的值
hbase(main):011:0> put 't1', 'r1', 'c1', 'v1'
0 row(s) in 0.1000 seconds

hbase(main):012:0> put 't1', 'r1', 'c1', 'v11'
0 row(s) in 0.0180 seconds

hbase(main):013:0> put 't1', 'r1', 'c1', 'v111'
0 row(s) in 0.0140 seconds

hbase(main):014:0> put 't1', 'r1', 'c1', 'v1111'
0 row(s) in 0.0140 seconds

# 插入c2、c3的值
hbase(main):015:0> put 't1', 'r1', 'c2', 'v2'
0 row(s) in 0.0140 seconds

hbase(main):016:0> put 't1', 'r1', 'c3', 'v3'
0 row(s) in 0.0210 seconds

# 獲取rowKey=r1的一行記錄
hbase(main):017:0> get 't1', 'r1'
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
 c2:                                                timestamp=1552819392398, value=v2
 c3:                                                timestamp=1552819398244, value=v3
3 row(s) in 0.0550 seconds

# 獲取rowKey=r1並且 1552819392398 <= 時間戳範圍 < 1552819398244
hbase(main):018:0> get 't1', 'r1', {TIMERANGE => [1552819392398, 1552819398244]}
COLUMN                                              CELL
 c2:                                                timestamp=1552819392398, value=v2
1 row(s) in 0.0090 seconds

# 獲取指定列的值
hbase(main):019:0> get 't1', 'r1', {COLUMN => 'c1'}
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
1 row(s) in 0.0160 seconds

# 獲取指定列的值,多個值使用數組表示
hbase(main):020:0> get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']}
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
 c2:                                                timestamp=1552819392398, value=v2
 c3:                                                timestamp=1552819398244, value=v3
3 row(s) in 0.0170 seconds

# 獲取c1的值,獲取4個版本的值,默認是按照時間戳降續排序的
hbase(main):021:0> get 't1', 'r1', {COLUMN => 'c1', VERSIONS => 4}
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
 c1:                                                timestamp=1552819376343, value=v111
 c1:                                                timestamp=1552819368993, value=v11
 c1:                                                timestamp=1552819362975, value=v1
4 row(s) in 0.0180 seconds

# 獲取c1的3個版本值
hbase(main):027:0* get 't1', 'r1', {COLUMN => 'c1', VERSIONS => 3}
COLUMN                                               CELL
 c1:                                                 timestamp=1552819382575, value=v1111
 c1:                                                 timestamp=1552819376343, value=v111
 c1:                                                 timestamp=1552819368993, value=v11
3 row(s) in 0.0090 seconds

# 獲取指定時間戳版本的列
hbase(main):022:0> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => 1552819376343}
COLUMN                                              CELL
 c1:                                                timestamp=1552819376343, value=v111
1 row(s) in 0.0170 seconds

hbase(main):023:0> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => 1552819376343, VERSIONS => 4}
COLUMN                                              CELL
 c1:                                                timestamp=1552819376343, value=v111
1 row(s) in 0.0130 seconds

# 獲取rowKey=r1中的值等於v2的所有列
hbase(main):024:0> get 't1', 'r1', {FILTER => "ValueFilter(=, 'binary:v2')"}
COLUMN                                              CELL
 c2:                                                timestamp=1552819392398, value=v2
1 row(s) in 0.0510 seconds


hbase(main):025:0> get 't1', 'r1', {COLUMN => 'c1', ATTRIBUTES => {'mykey'=>'myvalue'}}
COLUMN                                              CELL
 c1:                                                timestamp=1552819382575, value=v1111
1 row(s) in 0.0100 seconds

5.5.4 刪除某個列族中的某個列delete

# 語法
delete '表名', '行鍵', '列族名:列名'

delete 'users','xiaoming','info:age'

create 'tbl_test', 'columnFamily1'

put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column2', 'value2'

delete 'tbl_test', 'rowKey1', 'columnFamily1:column1'

5.5.5 刪除某行數據deleteall

# 語法
deleteall '表名', '行鍵'

# 示例
deleteall 'users', 'xiaoming'

5.5.6 清空整個表的數據truncate

先disable表,然後再drop表,最後重新create表

truncate '表名'

 

 

5.5.7 自增incr

# 語法
incr '表名', '行鍵', '列族:列名', 步長值

# 示例 
# 注意:incr 可以對不存的行鍵操作,如果行鍵已經存在會報錯,如果使用put修改了incr的值再使用incr也會報錯
# ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it's 2 bytes wide
incr 'tbl_user', 'xiaohong', 'info:age', 1

 

 

5.5.8 計數器get_counter

# 點擊量:日、周、月
create 'counters', 'daily', 'weekly', 'monthly'
incr 'counters', '20110101', 'daily:hits', 1
incr 'counters', '20110101', 'daily:hits', 1
get_counter 'counters', '20110101', 'daily:hits'

5.5.9 修飾詞

1、修飾詞
# 語法
scan '表名', {COLUMNS => [ '列族名1:列名1', '列族名1:列名2', ...]}

# 示例
scan 'tbl_user', {COLUMNS => [ 'info:id', 'info:age']}
2、TIMESTAMP 指定時間戳
# 語法
scan '表名',{TIMERANGE=>[timestamp1, timestamp2]}

# 示例
scan 'tbl_user',{TIMERANGE=>[1551938004321, 1551938036450]}
3、VERSIONS

默認情況下一個列只能存儲一個數據,後面如果修改數據就會將原來的覆蓋掉,可以通過指定VERSIONS時HBase一列能存儲多個值。

create 'tbl_test', 'columnFamily1'
describe 'tbl_test'

# 修改列族版本號
alter 'tbl_test', { NAME=>'columnFamily1', VERSIONS=>3 }

put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value2'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value3'

# 默認返回最新的一條數據
get 'tbl_test','rowKey1','columnFamily1:column1'

# 返回3個
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>3}
# 返回2個
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>2}
4、STARTROW

ROWKEY起始行。會先根據這個key定位到region,再向後掃描

# 語法
scan '表名', { STARTROW => '行鍵名'}

# 示例
scan 'tbl_user', { STARTROW => 'vbirdbest'}
5、STOPROW :截止到STOPROW行,STOPROW行之前的數據,不包括STOPROW這行數據
# 語法
scan '表名', { STOPROW => '行鍵名'}

# 示例
scan 'tbl_user', { STOPROW => 'xiaoming'}
6、LIMIT 返回的行數
# 語法
scan '表名', { LIMIT => 行數}

# 示例
scan 'tbl_user', { LIMIT => 2 }

5.5.10 FILTER條件過濾器

過濾器之間可以使用AND、OR連接多個過濾器。

1、ValueFilter 值過濾器
# 語法:binary 等於某個值
scan '表名', FILTER=>"ValueFilter(=,'binary:列值')"
# 語法 substring:包含某個值
scan '表名', FILTER=>"ValueFilter(=,'substring:列值')"

# 示例
scan 'tbl_user', FILTER=>"ValueFilter(=, 'binary:26')"
scan 'tbl_user', FILTER=>"ValueFilter(=, 'substring:6')"
2、ColumnPrefixFilter 列名前綴過濾器
# 語法 substring:包含某個值
scan '表名', FILTER=>"ColumnPrefixFilter('列名前綴')"

# 示例
scan 'tbl_user', FILTER=>"ColumnPrefixFilter('birth')"
# 通過括弧、AND和OR的條件組合多個過濾器
scan 'tbl_user', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:26')"
3、rowKey字典排序

Table中的所有行都是按照row key的字典排序的

 

Tags: