HBase是一個(gè)開(kāi)源的非關(guān)系型分布式數(shù)據(jù)庫(kù)寝贡,它參考了谷歌的BigTable建模扒披,實(shí)現(xiàn)的編程語(yǔ)言為Java。它是Apache軟件基金會(huì)的Hadoop項(xiàng)目的一部分圃泡,運(yùn)行于HDFS文件系統(tǒng)之上碟案,為Hadoop提供類似于BigTable規(guī)模的服務(wù)颇蜡。因此价说,它可以容錯(cuò)地存儲(chǔ)海量稀疏的數(shù)據(jù)。
HBase是一個(gè)高可靠风秤、高性能鳖目、面向列、可伸縮的分布式數(shù)據(jù)庫(kù)缤弦,是谷歌BigTable的開(kāi)源實(shí)現(xiàn)领迈,主要用來(lái)存儲(chǔ)非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)。HBase的目標(biāo)是處理非常龐大的表碍沐,可以通過(guò)水平擴(kuò)展的方式狸捅,利用廉價(jià)計(jì)算機(jī)集群處理由超過(guò)10億行數(shù)據(jù)和數(shù)百萬(wàn)列元素組成的數(shù)據(jù)表。
更多簡(jiǎn)介或原理性內(nèi)容可參考鏈接:
http://www.reibang.com/p/b23800d9b227
http://www.reibang.com/p/53864dc3f7b4
http://www.reibang.com/p/0a0a151c84d4
http://www.reibang.com/p/479bc6308381
目錄
- 一累提、安裝環(huán)境
- 二尘喝、環(huán)境準(zhǔn)備
- 三、hbase分布式搭建步驟
- 四斋陪、hbase基本使用
- 五朽褪、期間遇到的坑
- 六、參考并致謝
一无虚、安裝環(huán)境
操作系統(tǒng): CentOS 7
Hadoop版本: Hadoop-3.2.1
zookeeper版本: zookeeper-3.4.14
Hbase版本: hbase-2.2.3
相關(guān)主機(jī):
主機(jī):192.168.111.249 master
從機(jī)1:192.168.111.247 node1
從機(jī)2:192.168.111.248 node2
二缔赠、環(huán)境準(zhǔn)備
hbase和hadoop和jdk版本之間的關(guān)系可參考官網(wǎng):http://hbase.apache.org/book.html#java
1、JDK骑科、Hadoop安裝橡淑、主機(jī)名修改可參考之前寫(xiě)過(guò)的文章:
可參考:http://www.reibang.com/p/27cbd5bbdf61
2、zookeeper安裝可參考之前寫(xiě)過(guò)的文章:
可參考:http://www.reibang.com/p/e811a3fd5235
由于本章節(jié)主要內(nèi)容是Hbase的部署安裝咆爽,Hbase是基于Hadoop梁棠、java和zookeeper置森,而Hadoop和zookeeper的部署會(huì)占一定的篇幅,之前也有過(guò)相關(guān)文章符糊,加上本次Hbase的部署是在之前寫(xiě)Hadoop和zookeeper的文章的時(shí)候所用的機(jī)器凫海,因此此處就不多加篇幅去重復(fù)相關(guān)的步驟了,望諒解男娄。
三行贪、hbase分布式搭建步驟
1、下載Hbase
各版本下載地址:http://mirror.bit.edu.cn/apache/hbase/
此處使用的是hbase-2.2.3的版本
[root@master ~]# cd /home/
[root@master home]# wget http://mirror.bit.edu.cn/apache/hbase/2.2.3/hbase-2.2.3-bin.tar.gz
2模闲、解壓
[root@master home]# tar zxvf hbase-2.2.3-bin.tar.gz
3建瘫、配置環(huán)境變量
[root@master home]# vim /etc profile
# 文件中追加以下內(nèi)容
export HBASE_HOME=/home/hbase-2.2.3
export PATH=$HBASE_HOME/bin:$PATH
保存退出,然后source /etc/profile刷新以下環(huán)境變量
4尸折、修改配置文件
需要修改的配置文件以及文件所在的目錄如下
hbase-env.sh
配置java環(huán)境變量
注意:第二個(gè)參數(shù)文檔注釋寫(xiě)的是JAVA_CLASSPATH啰脚,但參數(shù)名稱卻是HBASE_CLASSPATH,據(jù)說(shuō)按照參數(shù)名HBASE_CLASSPATH寫(xiě)的話后面啟動(dòng)會(huì)有錯(cuò)誤報(bào)出实夹,因此按照注釋寫(xiě)的改為JAVA_CLASSPATH
日志存放路徑
關(guān)閉自帶的zookeeper橄浓,hbase自帶zookeeper單機(jī)版,我們此處搭建的是分布式亮航,因此將此關(guān)閉荸实,如需要搭建單機(jī)版的話可以保持默認(rèn)的true
hbase-site.xml
配置文件中configuration標(biāo)簽中間下入以下內(nèi)容
<!-- 配置hbase的主節(jié)點(diǎn) -->
<property>
<name>hbase.master</name>
<value>master:60000</value>
</property>
<!-- 是否為集群模式:true -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- hbase依賴的hdfs存儲(chǔ)的路徑 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<!-- 用的獨(dú)立的zookeeper是那幾臺(tái)服務(wù)器(填寫(xiě)所有集群的所有機(jī)器) -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,node1,node2</value>
</property>
<!-- 配置主從節(jié)點(diǎn)的心跳超時(shí)時(shí)間 -->
<property>
<name>hbase.master.maxclockskew</name>
<value>120000</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
regionservers文件
刪除localhost,將從節(jié)點(diǎn)主機(jī)名寫(xiě)入
5缴淋、遠(yuǎn)程復(fù)制hbase到各個(gè)節(jié)點(diǎn)中
將master的hbase遠(yuǎn)程拷貝到從節(jié)點(diǎn)上准给,從節(jié)點(diǎn)的環(huán)境變量也作相應(yīng)的修改,與master計(jì)器的修改方法相同
scp -r /home/hbase-2.2.3 node1:/home/
scp -r /home/hbase-2.2.3 node2:/home/
6宴猾、啟動(dòng)
# 【master節(jié)點(diǎn)】啟動(dòng)Hadoop
[root@master home]# start-all.sh
# 【各個(gè)節(jié)點(diǎn)】啟動(dòng)zookeeper
[root@master home]# zkServer.sh start
# 【master端】啟動(dòng)Hbase
[root@master home]# start-hbase.sh
# 【各個(gè)節(jié)點(diǎn)】使用jps命令查看進(jìn)程
[root@master home]# jps
master端
node1端
node2端
瀏覽器打開(kāi)以下地址可訪問(wèn)到頁(yè)面:
http://192.168.111.249:16010/master-status
至此Hbase已搭建完畢
四圆存、hbase基本使用
基本命令總結(jié):
shell命令 | 命令作用 | 命令語(yǔ)法 |
---|---|---|
create | 創(chuàng)建表 | < create ‘表名’, ‘列族名’, ‘列族名2’,‘列族名N’ > |
list | 查看所有表 | < list all > |
describe | 顯示表詳細(xì)信息 | < describe ‘表名’ > |
exists | 判斷表是否存在 | < exists ‘表名’ > |
enable | 使表有效 | < enable ‘表名’ > |
disable | 使表無(wú)效 | < disable ‘表名’ > |
is_enabled | 判斷是否啟動(dòng)表 | < is_enabled ‘表名’ > |
is_disabled | 判斷是否禁用表 | < is_disabled ‘表名’ > |
count | 統(tǒng)計(jì)表中行的數(shù)量 | < count ‘表名’ > |
put | 添加記錄 | < put ‘表名’, ‘row key’, ‘列族1 : 列’, ‘值’ > |
get | 獲取記錄(row key下所有) | < get ‘表名’, ‘row key’> |
get | 獲取記錄(某個(gè)列族) | < get ‘表名’, ‘row key’, ‘列族’> |
get | 獲取記錄(某個(gè)列) | < get ‘表名’,‘row key’,‘列族:列’ > |
delete | 刪除記錄 | < delete ‘表名’, ‘row key’, ‘列族:列’ > |
deleteall | 刪除一行 | < deleteall ‘表名’,‘row key’> |
drop | 刪除表 | <disable ‘表名’> < drop ‘表名’> |
alter | 修改列族(column family) | |
incr | 增加指定表,行或列的值 | |
truncate | 清空表 | 邏輯為先刪除后創(chuàng)建 <truncate ‘表明’> |
scan | 通過(guò)對(duì)表的掃描來(lái)獲取對(duì)用的值 | <scan ‘表名’> |
tools | 列出hbase所支持的工具 | |
status | 返回hbase集群的狀態(tài)信息 | |
version | 返回hbase版本信息 | |
exit | 退出hbase shell | |
shutdown | 關(guān)閉hbase集群(與exit不同) |
Hbase中的結(jié)構(gòu)大致如圖:
hbase是一張表:表中有一個(gè)唯一鍵是 row key, 每個(gè)row key 對(duì)應(yīng) N(N >= 1)個(gè)列族仇哆。每個(gè)列族由N個(gè)列組成(N>=1)
以下以具體例子展示:
# 登錄hbase shell
[root@master ~]# hbase shell
# 創(chuàng)建表catke
> create 'catke','column_family_1', 'column_family_2', 'column_family_3'
# 關(guān)閉表
> disable 'catke'
# 開(kāi)啟表
> enable 'catke'
# 刪除表
> drop 'catke'
# 查看所有表
> list
# 查看表結(jié)構(gòu)
> describe 'catke'
# 插入一條數(shù)據(jù)
> put 'catke','key_1','column_family_1:column_2','value2'
# 獲取一條數(shù)據(jù)
> get 'catke','key_1'
# 查看get命令的幫助(其他命令類似)
> help 'get'
# 查詢表的所有數(shù)據(jù)
> scan 'catke'
# 查詢column_family_1下的數(shù)據(jù)
> scan 'catke',{COLUMN => 'column_family_1'}
等同于
scan 'catke',{COLUMN => ['column_family_1']}
# 查詢column_family_1,column_family_2列族的數(shù)據(jù)
> scan 'catke',{COLUMN => ['column_family_1', 'column_family_2']}
# 查詢column_family_1下column_1列的數(shù)據(jù)
> scan 'hbase_test',{COLUMN => ['column_family_1:column_1']}
# 查詢r(jià)ow key 大于等于某key的數(shù)據(jù)
> scan 'catke',{COLUMN => ['column_family_1:column_1','column_family_2:column_3'], STARTROW => 'key_2'}
# 查詢r(jià)ow key 小于某key的數(shù)據(jù)
> scan 'catke',{COLUMN => ['column_family_1:column_1','column_family_2:column_3'], STOPROW => 'key_2'}
# 查詢大于等于key_2,小于key_5的數(shù)據(jù)
> scan 'catke',{COLUMN => ['column_family_1:column_1','column_family_2:column_3'], STARTROW => 'key_2', STOPROW => 'key_5'}
# 限制輸出的條數(shù)(限制的數(shù)量是針對(duì)主鍵row key的沦辙,因此可能不止2條)
> scan 'catke', {LIMIT => 2}
# 反序獲取兩行數(shù)據(jù)
> scan 'catke', {LIMIT => 2, REVERSED => true}
【默認(rèn)情況下REVERSED => false,當(dāng)設(shè)置REVERSED => true時(shí),數(shù)據(jù)反向讀取2行讹剔,自然與之前不一致油讯。可以理解為mysql中select * from dual asc limit 2與select * from dual desc limit 2這樣的區(qū)別】
# 刪除數(shù)據(jù)(delete這個(gè)方法只能刪除具體到哪一行中的某個(gè)列族下的某一列數(shù)據(jù))
> delete 'catke','key_6','column_family_3:'
# 刪除一整行數(shù)據(jù)
> deleteall 'catke','key_7'
# 清空表數(shù)據(jù)
> truncate 'catke'
# 執(zhí)行腳本
如將插入語(yǔ)句寫(xiě)到一個(gè)文件中延欠,然后執(zhí)行
[root@master ~]# hbase shell testshell
五陌兑、期間遇到的坑
1、啟動(dòng)時(shí)日志出現(xiàn)拒絕連接的錯(cuò)誤
Caused by: java.net.ConnectException: 拒絕連接
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:714)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:531)
at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:685)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:788)
at org.apache.hadoop.ipc.Client$Connection.access$3500(Client.java:410)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1550)
at org.apache.hadoop.ipc.Client.call(Client.java:1381)
... 33 more
原因:Hadoop中的dfs.namenode.rpc-address一項(xiàng)沒(méi)有配置
解決方法:
1由捎、在Hadoop的hdfs-site.xml配置文件中添加以下配置:
<property>
<name>dfs.namenode.rpc-address</name>
<value>192.168.111.249:9000</value>
</property>
其中192.168.111.249是namenode的服務(wù)器地址兔综,9000是與core-site.xml文件中的fs.default.name配置中的端口一致
2、重啟hadoop
3、重啟hbase
2软驰、啟動(dòng)時(shí)出現(xiàn)以下錯(cuò)誤
java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for proper operation during component failures, but the underlying filesystem does not support doing so. Please check the config value of 'hbase.procedure.store.wal.use.hsync' to set the desired level of robustness and ensure the config value of 'hbase.wal.dir' points to a FileSystem mount that can provide it.
解決方法:
在hbase-site.xml配置文件中增加配置
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
然后重啟Hbase
六涧窒、參考并致謝
https://www.cnblogs.com/chaofan-/p/9931213.html
https://blog.csdn.net/luqiang81191293/article/details/40428809
https://www.ibm.com/developerworks/cn/downloads/im/biginsightsquick/
https://blog.51cto.com/taotao1240/1735420
https://blog.51cto.com/taotao1240/1734755
https://segmentfault.com/q/1010000005686421/a-1020000005686550
https://segmentfault.com/q/1010000005689441
https://blog.csdn.net/ck3207/article/details/81674557
https://blog.csdn.net/u010416101/article/details/89186320
https://blog.csdn.net/oschina_41140683/article/details/102829597?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task