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的底层数据结构支持有限