HBase概览

近期准备系统的学习一下HBase的知识,包括构架和原理等方面,以便为后续的开发工作做准备,做到知其然而之所以然的状态,而不再是瞎子摸象般的搞开发
本篇作为开篇,只是对HBase做一个大体的介绍,各个小节没有很大的关联性,很多只是将系统中一些繁杂又有用的东西记录下来,以备日后查阅

学习路线

整理了一下手头上HBase的相关资料,发现特别零散,没有一个系统性的指导,所以特别想入一本《HBase权威指南》
但是手头上的书还没消化完毕,买回来也没时间看,只好自己先整理出一个简要的学习路线来走

1.HBase构架,对其底层存储结构和原理有较为详细的理解
2.HBase高级用法,包括行健设计、辅助索引等用法
3.HBase性能优化,结合各个方面的特性对HBase的优化策略
4.HBase集群管理,HBase的相关运维知识、集群管理和故障处理等
5.客户端API的使用,常用的API操作和MapReduce的集成方式

HBase简介

什么是HBase?

谈到HBase,必有五点:

1.基于Google的BigTable论文实现
2.分布式数据库
3.列式存储
4.nosql型
5.基于HDFS和Zookeeper

为什么要使用HBase?

高效的分布式数据库

高并发写入
随机读转化为顺序读操作
列式存储,没有数据绝不会多占一丝空间
海量数据的存储
易扩展的分布式构架

社区成熟并得到了大范围的应用实践

HBase作为一个开源的分布式数据库,其社区有大量的工程师进行开发、维护和fix bug,是一个非常成熟的产品,针对各种不同的情况提供了各种不同的工具
国内外知名大公司的海量业务都在使用HBase,坑人家都帮你踩好了你为什么不用呢~

基本构架

Zookeeper

zk集群管理着HBase的.ROOT表、Master和RegionServer的信息,协调active状态的Master,并为RegionServer提供容灾操作等

Master

通过zk与RegionServer进行交互,管理table和region信息,响应用户的操作

RegionServer

执行用户的IO请求,将其转化为HDFS的读写操作

HBase表属性

在hbase shell或者通过api创建表的时候会有各种各样的属性设置,了解这些属性的意义有助于之后原理的探索

常见表属性

属性名 含义
READONLY 表是否只读
MEMSTORE_FLUSHSIZE 待探究
MAX_FILESIZE 待探究
DEFERRED_LOG_FLUSH 待探究

常见列属性

属性名 含义 常用值/默认值 备注
DATA_BLOCK_ENCODINF 保存key-value数据块的压缩属性 PREFIX_TREE 当列较少,重复内容较少比较不好用
COMPRESSION 最后存储的文件压缩属性 SNAPPY、LZO 最后存储在HDFS上文件的压缩设置
BLOOMFILTER 查找记录时根据指定值判断记录是否存在文件中 NONE,ROW,ROWCOL 三个选项分别对应无,使用RowKey,使用RowKey+列名进行过滤,粒度越细产生的文件越大,可以避免不必要的读取操作
REPLICATION_SCOPE 配置REPLICATION的目标 0 类似mysql的主从同步
VERSIONS 最多保存多少数据版本 1
TTL Time to leave FOREVER 超过这个设置就会删除最早的版本数据
MIN_VERSIONS 保存的最小的版本数 1
KEEP_DELETE_CELLS 是否保留删除的数据 false 设置为true则可以继续访问到已删除的数据
BLOCKSIZE 保存数据的数据块大小 65536
BLOCKCACHE 列族数据是否使用缓存 true
IN_MEMORY 缓存中是否有较高的优先级 false

配置文件相关属性

有些配置是早期版本的注意对应

hbase-env.sh

属性名 作用
HBASE_JMX_BASE+HBASE_*_OPTS 开启jmx端口用于debug,可以开发基于jmx的监控
HBASE_LOG_DIR 日志目录
HBASE_PID_DIR hbase进程pid文件保存目录
HBASE_MANAGER_ZK true或者false表示是否使用hbase自带的zk
HBASE_HOME hbase安装目录
HBASE_CONF_DIR hbase配置文件目录
HBASE_HEAPSIZE hbase堆大小

hbase-site.xml

属性名 作用
ipc.server.tcpnodelay/hbase.ipc.server.tcpnodelay ture禁用tcp写缓冲,主要影响心跳的请求,因为会把一定量的tcp请求打包之后才发送
hbase.regionserver.handler.count 100,regionserver响应请求的线程数,和cpu核数比值过高之后意义不太大
hbase.regionserver.metahandler.count 50,处理meta表请求的线程数
hfile.block.cache.size 0.2,缓存占用HBASE_HEAPSIZE的比例,对于随机读操作较多的业务应该调高一点
hbase.regionserverReport.timeout 6000slave和master通信的超时时间,regionserver比较多的时候可以调高
hbase.region.server.missed.report.timeout 60000早期版本的心跳超时时间
dfs.support.broken.append true,早期版本的hdfs需要配置启用append操作
hbase.regionserver.enable.serverside.profiling false,早期版本禁用客户端请求的profile(统计信息等)
hbase.regionserver.results.max.size/hbase.client.keyvalue.maxsize 1073741824,早期版本中result最大返回值
zookeeper.znode.parent+hbase.rootdir zk根节点位置和hbase在hdfs上的根目录,可以在同一个hdfs中启动两个hbase集群
hbase.zookeeper.quorum 建议5或者7个zk
*.port 各类端口
hbase.regions.slop 负载均衡的阈值,(每个节点region平均值-实际节点上的region值)/平均值,计算的值超过阈值就开始负载均衡

log4j.properties

属性名 作用
hbase.log.maxfilesize 256MB,日志文件最大大小
habse.log.maxbackupindex 20,最多保存的日志文件数

Scan中的Filter

HBase在取数据的时候提供了丰富的过滤器操作,种类太多,这里仅给出一个参考的列表,各个过滤器的详细使用将会在之后实践中体现出来

名称 作用
CulomnCountGetFilter 取每行的前n个值
ColumnPaginationFilter 每行从列的byte比较,大于等于offset的列开始去取n个值
CollumnPrefixFilter 取每行的满足列命前缀的列的值
ColumnRangeFilter 取每行列名在指定范围内的值
DependentColumnFilter 指定一个列,过滤结果中与其时间戳不同的列,指定列可以不包含在结果中
FamilyFilter 指定列族过滤
FilterList 过滤器组合,可以将多个过滤器组合起来
FirstKeyOnlyFilter 只取每行的第一个值
FirstKeyValueMatchingQualifiersFilter 只取符合指定列名的第一个值
FuzzyRowFilter 对Rowkey进行模糊匹配,参数需要提供一个List>的参数,第一个byte数组是匹配的模式,第二个为0或者1表示该模式要不要匹配
InclusiveStopFilter 扫描到指定行停止
KeyOnlyFilter 只返回key不返回value,如:rowkey,列族,列名,时间戳
MultiColumnPrefixFilter 可以指定多个列名前缀
PageFilter 分页过滤器
PrefixFilter 指定rowkey的前缀
QualifierFilter 根据列名的比较结果确定是否保存返回值
RowFilter 根据rowkey的比较结果确定是否保留值
ValueFilter 根据值的比较结果确定是否保存该值
SingleColumnValueExcludeFilter/SingleColumnValueFilter 根据指定的列值判断是否保留行
RandomRowFilter 随机过滤行
SkipFilter 包装过滤器,遇到符合的过滤整行
WhileMatchFilter 包装的过滤器,当遇到过滤器的条件时停止扫描
TimestampsFilter 只取指定时间戳

不适用HBase的场景

HBase虽然高效,但是也有其短板所在,在某些场合使用HBase反而不能提高效率,例如:
由于HBase是列式存储的数据库所以对join、union、group by等关联查询的支持十分薄弱,如果业务大量使用到关联查询,请谨慎考虑
由于HBase是分布式的数据库所以对事务的支持也十分有限,因为分布式事务很难实现
由于HBase将随机读操作转化为顺序读所以对于一些高并发随机读的场景也不太适合,因为HBase的底层数据结构支持有限

作者:@小黑

你可能感兴趣的:(HBase)