安装常见问题
1、Hbase出现ERROR: Can’t get master address from ZooKeeper; znode data == null解决办法:
https://www.cnblogs.com/zlslch/p/6556870.html
2、启动hbase报java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder:
https://blog.csdn.net/woloqun/article/details/81350323
3、hbase shell命令使用正常,无法打开60010页面的解决办法
https://blog.csdn.net/x_singing/article/details/71106907
HBASE核心知识点
存储结构
LSM - Log Structured Merge Tree
底层存储采用日志结构合并树:
顺序存储、内存中flush到磁盘
读写独立、保证一致的写效率
对region的寻址采用了B+树的数据结构
HBase工作流程
新的客户端查找某个特定的行键:
-
首先要连接ZooKeeperQurom。
-
从ZooKeeper检索持有-ROOT-Region的服务器名,获得拥有-ROOT-Region的RegionServer,得到持有对应行键的.META.表Region的服务器名,操作结果都会被缓存下来。
-
查询.META.服务器,检索包含给定行键的Region所在的服务器。 在启动Hbase时,HMaster负责把Region
分配给每个HRegionServer,包括-ROOT-和.META.表
Region切分
-
当一个Region内的存储文件大于hbase.hregion.max.filesize时,该Region就需要split(切分)为两个,每个只持有原始Region一半的内容。
-
RegionServer通过在父Region内创建切分目录来完成,之后,它会关闭该Region,此Region就不再接受任何请求。
-
.META.表会进行更新,指明该Region已经被切分,以及子Region分别的的名称和位置信息。
-
原始Region最终会被清除,会从.META.表中删除它。 Region切分条件的设置默认大小为10GB,根据实际情况可调整。
合并(compaction)
- MemStore的flush操作会逐步增加磁盘上的文件数目
- 当数目足够多的时候,合并进程会将它们合并成规模更少但是更大的文件,当这些文件中最大的那个超过设置的最大存储文件大小,这时会触发一个Region切分过程。
小合并(minor compaction)
小合并负责将一些小文件合并成更大的文件。
合并文件数 hbase.hstore.compaction.min 默认值为3 && >=2
一个小合并所包含的最大文件数为10 hbase.hstore.compaction.max
设置hbase.hstore.compaction.min.size (设定为该Region的对应的MemStore的flush容量大小)和hbase.hstore.compaction.max.size(默认是Long.MAX_VALUE)来减少需要进行小合并的文件列表。
任何大于最大的compaction值的文件都会被排除在外。最小的compaction值是作为一个阈值而不是一个限制,达到单次compaction允许的文件数上限之前,那些小于该阈值的文件都会被包含在内
大合并(major compaction)
它会将所有文件合并成一个
该过程的运行是通过执行合并检查自动确定的。
当MemStore被flush到磁盘,执行了compact或者major_compact命令或产生了相关API调用,或运行后台线程,就会触发该检查,RegionServer会通过CompactionChecker类实现来运行该线程
如果用户调用major_compact命令或者majorCompact()API调用都会强制大合并运行。
服务器通过查看距离上次大合并运行是否满足一定时间,默认是24小时,进而自动执行大合并操作。
底层持久化
HFile(HBase File) 是HBase使用的一种文件存储格式的抽象。是一种附带索引的数据格式。
HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。
Trailer中有指针指向其他数据块的起始点
File Info中记录了文件的一些Meta信息
Data Index和Meta Index块记录了每个Data块和Meta块的起始点。
每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成
Magic内容就是一些随机数字,目的是防止数据损坏。
HFile里面的每个KeyValue对就是一个简单的byte数组。但是这个byte数组里面包含了很多项,并且有固定的结构。
HBase高级特性
优化
- Read hfile.block.cache.size
- Write hbase-site.xml Handler rpc的并发数 默认是10, x86
服务器要调节到100以上,CPU要至少是2路四核,或八核或12核 - JVM OPTS 版本 1.7以上 堆内存 一般设置为物理主机的二分之一 Gc 自动垃圾回收CMS 默认占比98% 设置为70%
- split & compact
key design
根据业务需求定义
uid
uid_ts
ts
…
过滤器
BloomFilter的基本思想
有一种叫做散列表(Hash表)的数据结构,它可以通过一个hash函数将一个元素映射成一个位阵中的一个点,这样要看看这个点是不是1就可以知道集合中有没有它了,这就是布隆过滤器的基本思想。
布隆过滤器是1970年由布隆提出,是一个很长的二进制向量和一系列随机映射函数,可以用于检索一个元素是否在一个集合中。
优点:空间效率和查询时间远远超过一般算法
布隆过滤器可以每列族单独启用(NONE|ROW|ROWCOL),:
NONE:没有过滤器
ROW:行键的哈希在每次插入行时将被添加到布隆
ROWCOL:行键+列族+列族修饰的哈希将在每次插入行时添加到布隆
BloomFilter 布隆过滤器的原理
describe ‘test’
NAME => ‘info’, DATA_BLOCK_ENCODING => ‘NONE’, BLOOMFILTER => ‘ROW’, REPLICATION_SCOPE => ‘0’, VERSIONS => ‘1’, COMPRESSION => ‘NONE’, MIN_VERSIONS => ‘0’, TTL => ‘FOREVER’, KEEP_DELETED_CELLS => ‘FALSE’, B
LOCKSIZE => ‘65536’, IN_MEMORY => ‘false’, BLOCKCACHE => ‘true’}
Disable ‘test’
alter ‘test’, {NAME=>‘info’, BLOOMFILTER=>‘ROWCOL’}
HBase不仅提供了简单的增、删、查、改,而且提供了更高级的过滤器(Filter)来查询。
带有过滤器条件的RPC查询请求会把过滤器分发到各个RegionServer(服务器端的过滤器)可以降低网络传输的压力。
过滤器的两类参数:
一类是抽象的操作符
LESS, LESS_OR_EQUAL,EQUAL,NOT_EQUAL,GREATER_OR,EQUAL,GREATER,NO_OP
另一类是比较器Comparator,代表具体的比较逻辑。
比较器:
比较器作为过滤器的核心组件之一,用于处理具体的比较逻辑,如字节级的比较、字符串级的比较。
- RegexStringComparator支持正则表达式的值比较
RegexStringComparator comp = new RegexStringComparator(“my.”); //以my开头的字符串
SingleColumnValueFilter filter = new SingleColumnValueFilter(cf,column,CompareOp.EQUAL,comp)
scan.setFilter(filter) - SubstringComparator用于检测一个子串是否存在于值中,不区分大小写
SubstringComparator comp = new SubstringComparator(childStr);
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(qualifier), CompareOp.EQUAL, comp); - BinaryPrefixComparator是前缀二进制比较器
BinaryPrefixComparator comp = new BinaryPrefixComparator(Bytes.toBytes(“zha”));
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(qualifier), CompareOp.EQUAL, comp); - BinaryComparator是二进制比较器,用于按照字典顺序比较Byte数据值
BinaryComparator comp = new BinaryComparator(Bytes.toBytes(str));
Filter filter = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL, comp);
过滤器:
- 列值过滤器
SingleColumnValueFilter 用于测试列值相等(CompareOp.EQUAL)、不等(CompareOp.NOT_EQUAL)、范围(e.g,CompareOp.GREATER)等情况
SingleColumnValueExcludeFilter用于单列值过滤,但并不查询出该列的值。 - 键值元数据过滤器
FamilyFilter 用于过滤列族
QualifierFilter 用于列名过滤 - ColumPrefixFilter用于列名前缀过滤
- 行键过滤器
RowFilter 行过滤器