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
官方最新推荐版本为Hadoop3.1.1+和HBase2.1+
HBase下载
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/
选择最新的2.1.5版本,官方建议下载稳定版本1.4.9
选择下载bin.tar.gz
下载完后直接解压,目录如下,相关的配置文件存放在conf目录下
单机模式
HBase内置有zookeeper,HBase启动默认使用内置zookeeper
1.配置hbase-site.xml
配置文件
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
这里需要注意
hbase.rootdir
为hbase
持久化的目录,被所有regionserver
共享,一般设置为hdfs://namenode.example.org:9000/hbase
,hdfs://localhost:9000
要和hadoop配置文件core-site.xml
中fs.defaultFS
属性的值一样
建议加入的设置
需要先手动创建文件夹
hbase.tmp.dir
:本地文件系统的临时目录
hbase.zookeeper.property.dataDir
:zookeeper
的配置,snapshot
存放的目录,默认是${hbase.tmp.dir}/zookeeper
拓展:
hbase.zookeeper.quorum
:重要的也是必须设置的,启动zookeeper
的服务器列表,逗号分隔,cluster
(集群)模式下必须设置,默认是localhost
,hbase客户端也需要设置这个值去访问zookeeper
hbase.zookeeper.property.clientPort
:zookeeper
端口的配置,client
连zookeeper
的端口,默认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
包下即可
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
没发现有报错信息就是启动成功
Hadoop Namenode控制台
Hadoop Datanode控制台
还可能存在的问题是
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.hsync
和hbase.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
原因:多个datanode
在getFileSystem
过程中,由于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
,支持的值还有defaultProvider
和filesystem
(这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:端口号
Hbase master内置zookeeper的管理界面
http://localhost:16010/zk.jsp
内置zookeeper的相关信息都是显示出来
Hbase单机搭建可以参考官方文档:https://hbase.apache.org/book.html#standalone_dist
伪分布式模式和完全分布式模式(只能在Linux环境下)
简单来说就是需要使用外部zookeeper
伪分布式:所有守护进程都在单个节点上运行,针对本地文件系统运行,也可以针对Hadoop分布式文件系统(HDFS)的实例运行,简单来说就是单个主机上运行的完全分布式模式
完全分布式模式:守护进程分布在集群中的所有节点上,只能在HDFS上运行
1.编辑hbase-env.cmd
在最后加上set HBASE_MANAGES_ZK=false
默认是true
,true
的意思是使用hbase自带的zookeeper,false
则是使用外部zookeeper(推荐)
2.配置hbase-site.xml
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
hbase.cluster.distributed
: hbase集群模式运作与否的标志,默认是false
,启用分布式集群,开启需要设置为true
,false
时启动hbase
会在一个jvm
中运行hbase
和zookeeper
注:分布式集群必须配置hbase.zookeeper.quorum
和hbase.zookeeper.property.clientPort
3.启动HBase
建议用cmd启动,可以看到返回信息,不然就是闪退
在windows环境启动时会提示:This is not implemented yet. Stay tuned.
(这还没有实现。敬请关注。)