基本操作
- 首先確保已經安裝Java。通過
java -version
命令查看,要求版本1.7以上。 - 下載hbase: http://www.apache.org/dyn/closer.cgi/hbase/
- 將下載來的壓縮包解壓
配上數據儲存目錄,編輯文件conf/hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/yourusername/hbase/data</value>
</property>
</configuration>
啓動HBase。命令爲:bin/start-hbase.sh
。命令執行後HBase將在後臺運行。
進入操作終端。bin/hbase shell
,通過status
命令可以查看服務狀態。
創建表:create 'hello_table','hello_family'
,得到的結果爲0 row(s) in 1.2280 seconds
添加數據:
put 'hello_table','id-1','hello_family:name','Alice'
put 'hello_table','id-1','hello_family:age','23'
put 'hello_table','id-2','hello_family:name','Bob'
put 'hello_table','id-2','hello_family:age','24'
以上命令創建了這樣的表:
id | name | age |
---|---|---|
id-1 | Alice | 23 |
id-2 | Bob | 24 |
掃描數據:scan 'hello_table'
,得到的結果如下:
ROW COLUMN+CELL
id-1 column=hello_family:age, timestamp=1496115723729, value=23
id-1 column=hello_family:name, timestamp=1496115723692, value=Alice
id-2 column=hello_family:age, timestamp=1496115723990, value=24
id-2 column=hello_family:name, timestamp=1496115723750, value=Bob
2 row(s) in 0.0170 seconds
取數據:get 'hello_table','id-1'
,得到的結果如下:
COLUMN CELL
hello_family:age timestamp=1496115723729, value=23
hello_family:name timestamp=1496115723692, value=Alice
2 row(s) in 0.0050 seconds
刪除數據:delete 'hello_table','id-1','name'
,這樣刪掉了name
這一格,age
還在。通過scan
查看得到結果爲:
ROW COLUMN+CELL
id-1 column=hello_family:age, timestamp=1496115723729, value=23
id-2 column=hello_family:age, timestamp=1496115723990, value=24
id-2 column=hello_family:name, timestamp=1496115723750, value=Bob
2 row(s) in 0.0130 seconds
刪除表:
disable 'hello_table'
drop 'hello_table'
退出終端:exit
停止HBase服務:bin/stop-hbase.sh
。
硬件配置
CPU要求多核,最好每個硬盤對應有個核。
JVM內存不宜超過16G,避免GC停頓時間過長。
master節點推薦24G、region節點推薦24G以上。
網絡推薦兩個千兆網卡做bond。如有萬兆、或者InfiniBand更好。
服務器推薦用1U的。
網絡,推薦一個機架放兩個交換機,然後核心交換機將機架上的交換機連起來。
軟件
操作系統需要選擇,通常用Linux中的CentOS和RHEL比較好。
文件系統有以下幾種選擇:
- ext3,推薦禁用訪問時間的記錄,因爲HBase不需要記錄訪問時間,這樣節省內核的管理開銷
- ext4,推薦關閉延遲分配策略,延遲分配是指將寫入的數據臨時存放在內存裏,等到flush時再落盤。關掉之後減少數據斷電導致數據丟失的概率
- XFS,優點是格盤很快,缺點是大量刪除文件會涉及元數據的變更,不過HBase一般是大文件存儲,不會出現這個問題。
- ZFS,內置壓縮,支持ZB級別的儲存空間
Java,版本至少1.7以上,比最新版稍舊一些的版本,避免重大BUG。
Hadoop版本,需要支持sync功能,避免數據丟失。HBase中使用的hadoop版本需要與底層hadoop版本一致,需要將底層運行的hadoop的jar包複製到hbase中再啓動。
SSH。建議使用ssh-agent,只需輸入一次密碼即可批量操作。
域名服務。HBase通過本地域名彙報IP地址,因此需要DNS的正向解析和反向解析都能夠正常工作。
同步時間。時間需要保證同步。相差1分鐘以上就會出現奇怪的行爲。比如發生ClockOutOfSyncException
。
文件數量限制和進程限制。文件數量限制默認1024是不夠用的,至少要10000。進程數量nproc
也需要設置。修改之後需要重新登錄才能生效。
DataNode處理線程數。在hdfs-site.xml
配置文件中需要設置dfs.datanode.max.xcievers
至少設置爲4096。配置完之後需要重啓HDFS集羣。此配置相當於最大文件句柄數。如果太小可能會出現:No live nodes contain current block. Will get new block locations from namenode and retry.
交換分區。必須關掉,否則可能卡死一個region節點。
Windows。HBase不建議在Windows環境運行。
HBase使用的文件系統
HBase常見使用HDFS文件系統。也可以支持別的文件系統,甚至自己實現一種。HBase自身沒有做副本,所以底層的文件系統必須提供副本、容錯、擴展的功能。事實上HBase支持所有實現了Hadoop接口的文件系統,包括HDFS、Amazon S3、Google Cloud、本地文件系統。KFS也是一種高性能文件系統。
- HDFS的URI格式爲:
hdfs://<namenode>:<port>/<path>
- S3的URL格式爲:
s3://<bucket-name>
或者s3n://<bucket-name>
- KFS的URI格式爲:
kfs:///<path>
運行模式
分爲單機模式和分佈式模式。一般調試用單機模式或者僞分佈式模式。生產環境用分佈式模式。分佈式模式需要加上如下配置:
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
完全分佈式模式需要增加如下配置:
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
還需要修改conf/regionservers
,列出所有region-server
節點IP。每個文件獨立一行文件。
Zookeeper安裝。HBase自帶Zookeeper,因此可以跟隨hbase啓動,共用JVM,也可以單獨啓動zookeeper和hbase。(筆者:推薦hbase和zookeeper分別獨立啓動,避免相互影響)
配置
主要的配置有以下幾個:
hbase-env.sh
,用於設置環境變量。包括JVM堆設置,GC設置等。修改後重啓生效。hbase-site.xml
,集羣特有的配置。hbase-default.xml
,默認配置,此文件在hbase程序包中。如果配置項在hbase-default.xml
和hbase-site.xml
,會優先使用hbase-site.xml
中的配置。regionserver
,region節點的列表log4j.properties
,打印日誌的選項
配置完成後需要需要將conf
文件夾中的文件都同步到所有節點上。如果配置不一致則會導致問題。
部署
可以通過腳本批量部署hbase,也可以通過Apache Whirr批量部署,也可以用Puppet、Chef批量部署。
操作集羣
web ui,訪問master節點的60010端口可以得到圖形界面。(筆者:新版本端口改成16010了)