參考書籍: Hadoop in action, 吳超沉思錄html
1.面向列的分佈式數據庫java
2. 以HDFS做爲文件系統node
3. 利用MapReduce處理Hbase中海量數據shell
4. ZookKeeper做爲協調工具數據庫
5. sqoop提供Hbase到關係型數據庫中數據導入功能服務器
6. Hive和pig提供高層語言支持如HSQLapp
三種模式:單機模式,僞分佈式模式,分佈式模式負載均衡
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能夠快速恢復,並得到細粒度的負載均衡。
分佈式模式的運行須要依賴分佈式文件系統,由於此時必須保證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中有配置)
準備條件: 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管理界面,同分布式安裝部分
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時,控制檯會打印關於中止的信息,會週期性的打印 ".",關閉腳本須要幾分鐘完成,若是集羣中機器數量不少,那麼執行時間會更長