【HBase】Hbase-2.2.3 真分布式搭建

HBase是一个开源的非关系型分布式数据库,它参考了谷歌的BigTable建模,实现的编程语言为Java。它是Apache软件基金会的Hadoop项目的一部分,运行于HDFS文件系统之上,为Hadoop提供类似于BigTable规模的服务。因此,它可以容错地存储海量稀疏的数据。
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。
更多简介或原理性内容可参考链接:
https://www.jianshu.com/p/b23800d9b227
https://www.jianshu.com/p/53864dc3f7b4
https://www.jianshu.com/p/0a0a151c84d4
https://www.jianshu.com/p/479bc6308381

目录

  • 一、安装环境
  • 二、环境准备
  • 三、hbase分布式搭建步骤
  • 四、hbase基本使用
  • 五、期间遇到的坑
  • 六、参考并致谢

一、安装环境

操作系统: CentOS 7
Hadoop版本: Hadoop-3.2.1
zookeeper版本: zookeeper-3.4.14
Hbase版本: hbase-2.2.3

相关主机:
主机:192.168.111.249 master
从机1:192.168.111.247 node1
从机2:192.168.111.248 node2

二、环境准备

hbase和hadoop和jdk版本之间的关系可参考官网:http://hbase.apache.org/book.html#java

1、JDK、Hadoop安装、主机名修改可参考之前写过的文章:

可参考:https://www.jianshu.com/p/27cbd5bbdf61

2、zookeeper安装可参考之前写过的文章:

可参考:https://www.jianshu.com/p/e811a3fd5235

由于本章节主要内容是Hbase的部署安装,Hbase是基于Hadoop、java和zookeeper,而Hadoop和zookeeper的部署会占一定的篇幅,之前也有过相关文章,加上本次Hbase的部署是在之前写Hadoop和zookeeper的文章的时候所用的机器,因此此处就不多加篇幅去重复相关的步骤了,望谅解。

三、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、配置环境变量
[root@master home]# vim /etc profile 
# 文件中追加以下内容  
export HBASE_HOME=/home/hbase-2.2.3
export PATH=$HBASE_HOME/bin:$PATH

保存退出,然后source /etc/profile刷新以下环境变量

4、修改配置文件

需要修改的配置文件以及文件所在的目录如下

【HBase】Hbase-2.2.3 真分布式搭建_第1张图片

hbase-env.sh

配置java环境变量
注意:第二个参数文档注释写的是JAVA_CLASSPATH,但参数名称却是HBASE_CLASSPATH,据说按照参数名HBASE_CLASSPATH写的话后面启动会有错误报出,因此按照注释写的改为JAVA_CLASSPATH

【HBase】Hbase-2.2.3 真分布式搭建_第2张图片

日志存放路径

关闭自带的zookeeper,hbase自带zookeeper单机版,我们此处搭建的是分布式,因此将此关闭,如需要搭建单机版的话可以保持默认的true

hbase-site.xml

配置文件中configuration标签中间下入以下内容



    hbase.master
    master:60000



    hbase.cluster.distributed
    true



    hbase.rootdir
    hdfs://master:9000/hbase



    hbase.zookeeper.quorum
    master,node1,node2



    hbase.master.maxclockskew
    120000



hbase.unsafe.stream.capability.enforce
false

【HBase】Hbase-2.2.3 真分布式搭建_第3张图片
regionservers文件

删除localhost,将从节点主机名写入

5、远程复制hbase到各个节点中

将master的hbase远程拷贝到从节点上,从节点的环境变量也作相应的修改,与master计器的修改方法相同
scp -r /home/hbase-2.2.3 node1:/home/
scp -r /home/hbase-2.2.3 node2:/home/

6、启动
# 【master节点】启动Hadoop 
[root@master home]# start-all.sh  
# 【各个节点】启动zookeeper  
[root@master home]# zkServer.sh start
# 【master端】启动Hbase 
[root@master home]# start-hbase.sh  
# 【各个节点】使用jps命令查看进程  
[root@master home]# jps

master端

【HBase】Hbase-2.2.3 真分布式搭建_第4张图片

node1端


node2端

浏览器打开以下地址可访问到页面:
http://192.168.111.249:16010/master-status

至此Hbase已搭建完毕

四、hbase基本使用

基本命令总结:

shell命令 命令作用 命令语法
create 创建表 < create ‘表名’, ‘列族名’, ‘列族名2’,‘列族名N’ >
list 查看所有表 < list all >
describe 显示表详细信息 < describe ‘表名’ >
exists 判断表是否存在 < exists ‘表名’ >
enable 使表有效 < enable ‘表名’ >
disable 使表无效 < disable ‘表名’ >
is_enabled 判断是否启动表 < is_enabled ‘表名’ >
is_disabled 判断是否禁用表 < is_disabled ‘表名’ >
count 统计表中行的数量 < count ‘表名’ >
put 添加记录 < put ‘表名’, ‘row key’, ‘列族1 : 列’, ‘值’ >
get 获取记录(row key下所有) < get ‘表名’, ‘row key’>
get 获取记录(某个列族) < get ‘表名’, ‘row key’, ‘列族’>
get 获取记录(某个列) < get ‘表名’,‘row key’,‘列族:列’ >
delete 删除记录 < delete ‘表名’, ‘row key’, ‘列族:列’ >
deleteall 删除一行 < deleteall ‘表名’,‘row key’>
drop 删除表 < drop ‘表名’>
alter 修改列族(column family)
incr 增加指定表,行或列的值
truncate 清空表 逻辑为先删除后创建
scan 通过对表的扫描来获取对用的值
tools 列出hbase所支持的工具
status 返回hbase集群的状态信息
version 返回hbase版本信息
exit 退出hbase shell
shutdown 关闭hbase集群(与exit不同)

Hbase中的结构大致如图:

【HBase】Hbase-2.2.3 真分布式搭建_第5张图片

hbase是一张表:表中有一个唯一键是 row key, 每个row key 对应 N(N >= 1)个列族。每个列族由N个列组成(N>=1)

以下以具体例子展示:

# 登录hbase shell
[root@master ~]# hbase shell
# 创建表catke
> create 'catke','column_family_1', 'column_family_2', 'column_family_3'

# 关闭表
> disable 'catke'

# 开启表
> enable 'catke'

# 删除表
> drop 'catke'

# 查看所有表
> list

# 查看表结构  
> describe 'catke'

# 插入一条数据  
> put 'catke','key_1','column_family_1:column_2','value2'

# 获取一条数据  
> get 'catke','key_1'

# 查看get命令的帮助(其他命令类似)  
> help 'get'

# 查询表的所有数据  
> scan 'catke'

# 查询column_family_1下的数据
> scan 'catke',{COLUMN => 'column_family_1'}
等同于
scan 'catke',{COLUMN => ['column_family_1']}

# 查询column_family_1,column_family_2列族的数据
> scan 'catke',{COLUMN => ['column_family_1', 'column_family_2']}

# 查询column_family_1下column_1列的数据
> scan 'hbase_test',{COLUMN => ['column_family_1:column_1']}

# 查询row key 大于等于某key的数据
 > scan 'catke',{COLUMN => ['column_family_1:column_1','column_family_2:column_3'], STARTROW => 'key_2'}
 
# 查询row key 小于某key的数据
> scan 'catke',{COLUMN => ['column_family_1:column_1','column_family_2:column_3'], STOPROW => 'key_2'}

# 查询大于等于key_2,小于key_5的数据  
> scan 'catke',{COLUMN => ['column_family_1:column_1','column_family_2:column_3'], STARTROW => 'key_2', STOPROW => 'key_5'}

# 限制输出的条数(限制的数量是针对主键row key的,因此可能不止2条)  
> scan 'catke', {LIMIT => 2}

# 反序获取两行数据  
> scan 'catke', {LIMIT => 2, REVERSED => true}
【默认情况下REVERSED => false,当设置REVERSED => true时,数据反向读取2行,自然与之前不一致。可以理解为mysql中select * from dual asc limit 2与select * from dual desc limit 2这样的区别】

# 删除数据(delete这个方法只能删除具体到哪一行中的某个列族下的某一列数据)  
> delete 'catke','key_6','column_family_3:'

# 删除一整行数据  
> deleteall 'catke','key_7'

# 清空表数据  
> truncate 'catke'

# 执行脚本
如将插入语句写到一个文件中,然后执行  
[root@master ~]# hbase shell testshell


五、期间遇到的坑

1、启动时日志出现拒绝连接的错误
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一项没有配置
解决方法:
1、在Hadoop的hdfs-site.xml配置文件中添加以下配置:


  dfs.namenode.rpc-address
  192.168.111.249:9000

其中192.168.111.249是namenode的服务器地址,9000是与core-site.xml文件中的fs.default.name配置中的端口一致
2、重启hadoop
3、重启hbase

2、启动时出现以下错误
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配置文件中增加配置


hbase.unsafe.stream.capability.enforce
false

然后重启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

你可能感兴趣的:(【HBase】Hbase-2.2.3 真分布式搭建)