1 HBase 介紹
HBASE是一個高可靠性、高性能、面向列、可伸縮(列是可以進行增刪的)的分佈式存儲系統,利用HBASE技術可在廉價PC Server上,搭建起大規模結構化存儲集羣。HBASE的目標是存儲並處理大型的數據,更具體來說是僅需使用普通的硬件配置,就能夠處理由成千上萬的行和列所組成的大型數據。HBASE是Google Bigtable的開源實現,但是也有很多不同之處。比如:Google Bigtable利用GFS作爲其文件存儲系統,HBASE利用Hadoop HDFS作爲其文件存儲系統;Google運行MAPREDUCE來處理Bigtable中的海量數據,HBASE同樣利用Hadoop MapReduce來處理HBASE中的海量數據;Google Bigtable利用Chubby作爲協同服務,HBASE利用Zookeeper作爲對應。
1.1 與傳統數據庫的對比
傳統數據庫遇到的問題:
- 數據量很大的時候無法存儲;
- 沒有很好的備份機制
- 數據達到一定數量開始緩慢,很大的話基本無法支撐
HBASE優勢:
- 線性擴展,隨着數據量增多可以通過節點擴展進行支撐
- 數據存儲在hdfs上,備份機制健全
- 通過zookeeper協調查找數據,訪問速度塊。
1.2 hbase集羣中的角色
- 一個或者多個主節點,Hmaster
- 多個從節點,HregionServer
2 HBase 數據模型
2.1 Row Key
與nosql數據庫們一樣,row key是用來檢索記錄的主鍵。訪問HBASE table中的行,只有三種方式:
- 通過單個row key訪問
- 通過row key的range(正則)
- 全表掃描
Row key行鍵 (Row key)可以是任意字符串(最大長度是64KB,實際應用中長度一般爲 10-100bytes),在HBASE內部,row key保存爲字節數組。存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)
2.2 Columns Family
列簇 :HBASE表中的每個列,都歸屬於某個列族。列族是表的schema的一部分(而列不是),必須在使用表之前定義。列名都以列族作爲前綴。例如 courses:history,courses:math都屬於courses 這個列族。
2.3 Cell
由{row key, columnFamily, version} 唯一確定的單元。cell中的數據是沒有類型的,全部是字節碼形式存貯。
2.4 Time Stamp
HBASE 中通過rowkey和columns確定的爲一個存貯單元稱爲cell。每個cell都保存着同一份數據的多個版本(即更新數據數據)。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由HBASE(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。每個cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
爲了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,HBASE提供了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。
3 HBase 安裝
前提安裝了hadoop-2.7.6, zookeeper-3.4.5(配置在奇數節點,node1,node2,node3)
hbase 的版本要和 hadoop 的版本對應起來,見鏈接hbase和hadoop版本對應
3.1 上傳並解壓源碼
3.2 配置環境變量
/ect/profile
export HBASE_HOME=/home/hadoop/apps/hbase
export PATH=$PATH:$HBASE_HOME/bin
3.3 修改配置文件
3.3.1 hbase-env.sh
# The java implementation to use. Java 1.7+ required.
export JAVA_HOME=/usr/apps/jdk1.8.0_181-amd64
export HBASE_LOG_DIR=/home/hadoop/hbase/log
# Tell HBase whether it should manage it's own instance of Zookeeper or not.
# export HBASE_MANAGES_ZK=true
export HBASE_MANAGES_ZK=false
# Extra Java CLASSPATH elements. Optional.這行代碼是錯的,需要可以修改爲下面的形式
#export HBASE_CLASSPATH=/home/hadoop/hbase/conf
export JAVA_CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
3.3.2 hbase-site.xml
<configuration>
<property>
<name>hbase.master</name>
<value>node1:60000</value>
</property>
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://node1:9000/hbase</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/home/hadoop/hbase/tmp/temp</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</name>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<name>node1,node2,node3</name>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<name>/home/hadoop/hbase/tmp/zookeeper</name>
</property>
</configuration>
3.3.3 regionservers
node2
node3
node4
3.4 發送到其他節點
發送到node2,node3,node4
scp -r /home/hadoop/apps/hbase node2:/home/hadoop/apps
sudo scp /etc/profile node2:/etc
所有節點同時操作 source /etc/profile
3.5 啓動 hbase
start-hbase.sh
瀏覽器訪問 http://node1:16010