分布式数据库HBase以及HBase的单机模式,伪分布式模式和完全分布式模式

HBase简介

HBase是一个分布式的,面向列,可扩展的大数据存储的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文《Bigtable:一个结构化数据的分布式存储系统》。就像Bigtable利用了Google文件系统所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。
HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系型数据库,是一个开源的,分布式的,版本化的非关系型数据库。Hbase是Hadoop生态系统的一部分,Hbase数据最终是存储到HDFS文件系统当中。HBase基于列的而不是基于行。

HBase的特点:

1、大容量:支持百亿行,百万列
2、面向列:动态增加列存储
3、多版本:每列数据存储可有多个version
4、稀疏性:空列不占用空间
5、扩展性:线性和模块化,底层依赖于HDFS(Hadoop分布式文件系统),表的自动和可配置分片
6、高可靠性:自动故障转移支持与HDFS备份
7、易于使用的Java API,用于客户端访问
8、随即读取性:region切分、主键索引和缓存机制,严格一致的读写操作
9、Thrift网关和REST-ful Web服务,支持XML,Protobuf和二进制数据编码选项
10、支持通过Hadoop指标子系统将指标导出到文件或Ganglia(分布式监控); 或通过JMX

Github地址:https://github.com/apache/hbase
官方网站:https://hbase.apache.org/
官方文档:https://hbase.apache.org/book.html
中文文档:http://abloz.com/hbase/book.html
中文社区:http://hbase.group/

在window中搭建HBase

由于Hbase是Hadoop生态系统的一部分,所以必须要先安装配置好Hadoop,
可以参考我上一篇文章:分布式计算平台Hadoop

重点:看下官方提供的版本支持

搭建需要:hadoop3.1.1以上都可以
来源:https://hbase.apache.org/book.html#hadoop

image.png

官方最新推荐版本为Hadoop3.1.1+和HBase2.1+

HBase下载

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/
选择最新的2.1.5版本,官方建议下载稳定版本1.4.9

image.png

选择下载bin.tar.gz

image.png

下载完后直接解压,目录如下,相关的配置文件存放在conf目录下

image.png

单机模式

HBase内置有zookeeper,HBase启动默认使用内置zookeeper

1.配置hbase-site.xml配置文件

    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://localhost:9000/hbase</value>
    </property>

这里需要注意

hbase.rootdirhbase持久化的目录,被所有regionserver共享,一般设置为hdfs://namenode.example.org:9000/hbasehdfs://localhost:9000要和hadoop配置文件core-site.xmlfs.defaultFS属性的值一样

建议加入的设置

需要先手动创建文件夹
hbase.tmp.dir:本地文件系统的临时目录
hbase.zookeeper.property.dataDirzookeeper的配置,snapshot存放的目录,默认是${hbase.tmp.dir}/zookeeper

拓展:
hbase.zookeeper.quorum:重要的也是必须设置的,启动zookeeper的服务器列表,逗号分隔,cluster(集群)模式下必须设置,默认是localhost,hbase客户端也需要设置这个值去访问zookeeper
hbase.zookeeper.property.clientPortzookeeper端口的配置,clientzookeeper的端口,默认2181

    <property>
        <name>hbase.tmp.dir</name>
        <value>E:/hbase/hbase-2.1.2/tmp</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>E:/hbase/hbase-2.1.2/zoo</value>
    </property>

HBase官方配置项说明:https://hbase.apache.org/book.html#config.files

启动中可能遇到的报错

java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
java.lang.RuntimeException: Failed construction of Master: 
class org.apache.hadoop.hbase.master.HMasterCommandLine$LocalHMasterorg.apache.htrace.SamplerBuilder

原因:jar包缺失
解决方法:把lib\client-facing-thirdparty包中的htrace-core-3.1.0-incubating.jar复制一个到lib包下即可

image.png

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.

[main-SendThread(127.0.0.1:2181)] zookeeper.ClientCnxn: 
Session 0x168ea1e6d980001 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused: no further information

原因:单机模式直接使用本地磁盘,而本地磁盘不支持hsync

解决方法:

禁用hsync,在hbase-site.xml中加入

    <property>
        <name>hbase.procedure.store.wal.use.hsync</name>
        <value>false</value>
    </property>

但是还是会报错,hbase.procedure.store.wal.use.hsync如果为true,则使用hsync,如果为false,则使用hflush,两种都会报错
需要设置hbase.unsafe.stream.capability.enforce,在hbase-site.xml中再加入

    <property>
        <name>hbase.unsafe.stream.capability.enforce</name>
        <value>false</value>
    </property>

2.启动HBase

运行bin/start-hbase.cmd,前提:先启动hadoop

image.png

没发现有报错信息就是启动成功

Hadoop Namenode控制台
image.png
Hadoop Datanode控制台
image.png
还可能存在的问题是

1.启动不久后发现HBase自动挂了

java.lang.RuntimeException: Master not initialized after 200000ms
        at org.apache.hadoop.hbase.util.JVMClusterUtil.waitForEvent(JVMClusterUtil.java:229)
        at org.apache.hadoop.hbase.util.JVMClusterUtil.startup(JVMClusterUtil.java:197)
        at org.apache.hadoop.hbase.LocalHBaseCluster.startup(LocalHBaseCluster.java:413)
        at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:232)
        at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:140)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
        at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:3103)

原因:Hadoop处于安全模式

解决方法:

前提:要确保已经设置好hbase.procedure.store.wal.use.hsynchbase.unsafe.stream.capability.enforce
在Hadoop的hdfs-site.xml配置文件中加入

    <property> 
        <name>dfs.safemode.threshold.pct</name> 
        <value>0</value> 
    </property>

注:如果还是解决不了问题重新启动hadoop和hbase,请干净进程
dfs.safemode.threshold.pct(阈值比例):指定应有多少比例的数据块满足最小副本数要求。小于等于0意味不进入安全模式,大于1意味一直处于安全模式。

工作原理:

NameNode在启动的时候首先进入安全模式,如果DataNode丢失的block达到一定的比例1-dfs.safemode.threshold.pct,则系统一直处于安全模式状态,即只读状态。
dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设置为1,则HDFS一直处于安全模式。

2.Caused by: java.io.IOException: Filesystem closed
原因:多个datanodegetFileSystem过程中,由于Configuration一样,会得到同一个FileSystem。如果有一个datanode在使用完关闭连接,其它的datanode在访问就会出现上述异常
解決方法:
在hadoop的配置文件hdfs core-site.xml里把fs.hdfs.impl.disable.cache设置为true

    <property>
        <name>fs.hdfs.impl.disable.cache</name>
        <value>true</value>
    </property> 

3.java.lang.NoClassDefFoundError: Could not initialize class org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper
解决方法:在hdfs-site.xml中加入

    <property> 
        <name>hbase.wal.provider</name> 
        <value>multiwal</value> 
    </property>

在HBase1.0开始支持多个WALHBASE-5699,这样可以提高写入的吞吐量。配置参数为hbase.wal.provider=multiwal,支持的值还有defaultProviderfilesystem(这2个是同样的实现)

具体的HBase WAL 解析可以参考:https://blog.csdn.net/u010039929/article/details/74330722

Hbase master的管理界面

默认端口为16010,可以在hbase-site.xml配置hbase.master.info.port去修改默认端口
http://localhost:16010 也就是IP:端口号

image.png

Hbase master内置zookeeper的管理界面

http://localhost:16010/zk.jsp
内置zookeeper的相关信息都是显示出来

image.png

Hbase单机搭建可以参考官方文档:https://hbase.apache.org/book.html#standalone_dist

伪分布式模式和完全分布式模式(只能在Linux环境下)

简单来说就是需要使用外部zookeeper
伪分布式:所有守护进程都在单个节点上运行,针对本地文件系统运行,也可以针对Hadoop分布式文件系统(HDFS)的实例运行,简单来说就是单个主机上运行的完全分布式模式
完全分布式模式:守护进程分布在集群中的所有节点上,只能在HDFS上运行

1.编辑hbase-env.cmd

在最后加上set HBASE_MANAGES_ZK=false
默认是truetrue的意思是使用hbase自带的zookeeper,false则是使用外部zookeeper(推荐)

image.png

2.配置hbase-site.xml
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>

hbase.cluster.distributed: hbase集群模式运作与否的标志,默认是false,启用分布式集群,开启需要设置为truefalse时启动hbase会在一个jvm中运行hbasezookeeper

注:分布式集群必须配置hbase.zookeeper.quorumhbase.zookeeper.property.clientPort

3.启动HBase

建议用cmd启动,可以看到返回信息,不然就是闪退

image.png

在windows环境启动时会提示:This is not implemented yet. Stay tuned.(这还没有实现。敬请关注。)

Linux环境下Hbase伪分布式搭建可以参考官方文档:https://hbase.apache.org/book.html#quickstart_pseudo

Linux环境下Hbase完全分布式搭建可以参考官方文档:https://hbase.apache.org/book.html#quickstart_fully_distributed

推荐阅读更多精彩内容