參考書籍: Hadoop in action, 吳超沉思錄
1.Hbase簡介
1.面向列的分布式數據庫
2. 以HDFS作為文件系統
3. 利用MapReduce處理Hbase中海量數據
4. ZookKeeper作為協調工具
5. sqoop提供Hbase到關系型數據庫中數據導入功能
6. Hive和pig提供高層語言支持如HSQL
三種模式:單機模式,偽分布式模式,分布式模式
Hbase在單機模式下並不使用HDFS,直接將安裝文件解壓就可以運行(需要修改hbase-site.xml文件),默認情況下Hbase數據是存儲在跟目錄的tmp文件夾下, 使用start-hbase.sh和stop-hbase啟動和關閉
偽分布式和分布式模式下需要使用HDFS文件系統
關於服務器:
HBase和Hadoop中有兩種類型的機器:
master: HDFS的NameNode,MapReduce的JobTracker,HBase的Master
slave: HDFS的DataNode,MapReduce的TaskTracker,HBase的RegionServer
關於region:
HBase中擴展和負載均衡的基本單位稱為region,region本質上是按行鍵排序的連續存儲的區間,如果region太大,系統就會把它們動態划分;相反,就會把多個region合並,減少存儲空間的數量
一張表初始的時候只有一個region,用戶開始向表中插入數據時,系統會檢查這個region的大小,確保其不超過配置的最大值。如果超過了限制,系統會再中間鍵處將這個region拆分為兩個大致相等的子region
每一個region只能由一台region服務器加載,每一台region服務器可以同時加載多個region
region拆分和服務相當於其他系統提供的自動分區,當一個服務器出現故障后,該服務器上的region可以快速恢復,並獲得細粒度的負載均衡。
2. 偽分布式安裝
分布式模式的運行需要依賴分布式文件系統,因為此時必須保證HDFS已運行
准備: 安裝Hadoop 詳細見上一篇日志:hadoop分布式安裝
hbase版本:hbase-0.94.7-security.tar.gz
安裝目錄 /usr/local
步驟:
1. 安裝 tar -zxvf hbase-0.94.7-security.tar.gz
2. 重命名: mv hbase-0.94.7-security hbase
3. 配置環境變量hbase_home (vi /etc/profile)
4. 修改配置文件
1. hbase_home/conf/hbase_env.sh 修改java_home export JAVA_HOME=/usr/local/jdk/ 修改zookeeper(最后一行) export HBASE_MANAGES_ZK=true(使用Hbase托管的ZooKeeper) 2. hbase_home/conf/hbase-site.xml文件 configuration 中加入: <property> <name>hbase.rootdir</name> <value>hdfs://hadoop0:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop0</value> </property> <property> <name>dfs.replication</name> //指定Hlog和Hfile副本數,此參數值並不能大於HDFS節點數,如果datanode只有一台則此參數應該設置為1 <value>1</value> </property>
5. 啟動hbase
先啟動hdfs文件系統start-dfs.sh 或者hadoop(start-all.sh)
啟用hbase (start-hbase.sh) 關閉:stop-hbase.sh
jps查看進程 (HMaster,HRegionServer, HQuorumPeer)
http://hadoop0:60010可以查看管理界面,如下:
6. 進程說明:
HMaster: 管理Hbase table的DDL操作
給region分配工作
HResionServer: 原則上每個slave對應一個HRegionServer
HQuorumPeer: ZooKeeper的守護進程,此處我們使用的是Hbase內置的ZooKeeper(在hbase-env.sh中有配置)
3. 分布式安裝
准備條件: hadoop分布式環境已安裝,查看hadoop分布式安裝
hadoop0主機上hbase偽分布已安裝完成
安裝:
1. scp -rp /usr/local/hbase hadoop1:/usr/local
2. 在hadoop0上更改hbase_home/conf/regionservers 將localhost更改為hadoop1
regionservers文件中列出了所有運行HBase的機器,配置類似於Hadopp的slaves文件,Hbase啟動的時候,會將次文件中列出的機器啟動,同樣關閉時會將他們關閉
更改后在hadoop0和hadoop1兩台機器中,Hbase Master及HDFS NameNode是運行在hadoop0上, RegionServer運行在Hadoop1上
3.
在hbase-site.xml 中 <property> <name>hbase.cluster.distributed</name> <value>true</value> </property>
此處值設置為true即為分布式,若是false,則是偽分布式
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop0,hadoop1</value>
</property>
全分布式模式的Hbase集群需要運行ZooKeeper實例,默認情況下HBase自身維護着一組默認的ZooKeeper實例,可以自己配置實例,這樣Hbase會更加健壯
注意:使用默認的實例時,HBase將自動啟動或停止ZooKeeper,當使用獨立的ZooKeeper實例時,需要用戶手動啟動和停止ZooKeeper實例
4. 啟動hbase, 同偽分布式模式
先啟動hdfs文件系統start-dfs.sh 或者hadoop(start-all.sh)
啟用hbase (start-hbase.sh) 關閉:stop-hbase.sh
5. jps查看,如下:
hadoop0上進程:

hadoop1上進程:
同理可通過 hostname:60010訪問hbase管理界面,同分布式安裝部分
4. 數據模型
1. Hbase數據庫采用了和Bigtable非常類似的數據類型,表格是稀疏的;
1. row key 行鍵,table的主鍵
2. timestamp 時間戳,數據操作時對應的時間戳,可以看成數據的version number
3. Column Family 列簇,每個family可以由任意多個column組成,列名是<族名>:<標簽>形式;一個表格的族名時固定的,除非使用管理員權限來改變表格的族名; 不過可以在任何時候添加新的標簽;
eg:course對於表來說是一個有兩個列的列族(該列族由兩個列組成math和art);
rowkey |
name |
TimeStamp |
course |
|
math |
art |
|||
wish |
wish |
t1 t2 t3 |
97 93 97 |
98 76 99 |
rain |
rain |
t4 |
100 |
90 |
4.兩張特殊的表 -ROOT- 和 .META.
作用如下:(即-ROOT-記錄.META.的region信息,.META.記錄用戶表的region信息)
關系如下:
基本操作
(注意操作后不要加分號)
(常量不需要用引號引起來,在shell中輸入Object.constants命令可以查看常量)
(表名和列名都需要加引號,不區分單雙引號)
Hbase shell,是Hbase的命令行工具,命令行中執行hbase shell即可進入hbase shell命令行
1) list 查看hbase中所有表
2) 創建表:
create '表名','列簇1','列簇2'....
create 'student', 'name','grade','course'
在管理界面中查看student
3)describe 查看表結構
describe '表名'
eg: describe 'student'
hbase(main):003:0> describe "student" DESCRIPTION ENABLED 'student', {NAME => 'course', DATA_BLOCK_ENCODING = true > 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '3', COMPRESSION => 'NONE', MIN _VERSIONS => '0', TTL => '2147483647', KEEP_DELETED _CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', ENCODE_ON_DISK => 'true', BLOCKCACHE => 'true'}, {NAME => 'grade', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', VERSIONS => '3', COMPRESSION => 'NONE', MIN_V ERSIONS => '0', TTL => '2147483647', KEEP_DELETED_C ELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', ENCODE_ON_DISK => 'true', BLOCKCACHE => ' true'}, {NAME => 'name', DATA_BLOCK_ENCODING => 'NO NE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0 ', VERSIONS => '3', COMPRESSION => 'NONE', MIN_VERS IONS => '0', TTL => '2147483647', KEEP_DELETED_CELL S => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'f alse', ENCODE_ON_DISK => 'true', BLOCKCACHE => 'tru e'}
4)插入數據和查看數據
put '表名','行鍵名','列名','value','列名2','value2','family:列名1','value3'.......
put 'student','wish','name:','wish'
查詢數據:
get '表名','行名'
get 'student','wish'
插入更多數據
hbase(main):004:0> put 'student','wish','course:English','100' hbase(main):005:0> put 'student','wish','course:Chinese','60' hbase(main):006:0> put 'student','rain','course:Chinese','100' hbase(main):007:0> put 'student','rain','course:English','200'
查看表中數據: scan 'student'
其他get例子:
get 'student','wish','course' get 'student','wish',['course'] get 'student','wish',['course','name']
5)刪除數據
delete 'student','wish','course:Math'
6)刪除表
需停止表的可用性,再刪除表
disable 'student'drop 'student'
7) 統計行數
count 'student'
8)常用Hbase shell命令截圖
注意事項
1.關於Hadoop
1. 目前的HBase只能依賴特定的Hadoop版本,HBae和Hadoop之間的RPC是版本話的,需要調用方與被調用方相互匹配,細微的差異可能導致通信失敗
2. 由於Hadoop依賴於Hadoop,它要求Hadoop的JAR必須部署在HBase的lib目錄下。HBase使用的Hadoop版本必須與底層Hadoop集群上使用的Hadoop版本一直,因而使用Hadoop集群上運行的JAR替換HBase的lib目錄中依賴的Hadoop的JAR可以
避免版本不匹配的問題
3. 集群中所有的節點都要更新為一樣的JAR,否則版本不匹配問題可能造成集群無法啟動或者假死現象
2.關於HBase Shell
1.如果使用的分布式模式,那么在關閉Hadoop之前一定要確認HBase已經被正常關閉了
2. 使用stop-hbase.sh關閉HBase時,控制台會打印關於停止的信息,會周期性的打印 ".",關閉腳本需要幾分鍾完成,如果集群中機器數量很多,那么執行時間會更長