HBase常见问题及核心知识点

安装常见问题

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,代表具体的比较逻辑。

比较器:
比较器作为过滤器的核心组件之一,用于处理具体的比较逻辑,如字节级的比较、字符串级的比较。

  1. RegexStringComparator支持正则表达式的值比较
    RegexStringComparator comp = new RegexStringComparator(“my.”); //以my开头的字符串
    SingleColumnValueFilter filter = new SingleColumnValueFilter(cf,column,CompareOp.EQUAL,comp)
    scan.setFilter(filter)
  2. SubstringComparator用于检测一个子串是否存在于值中,不区分大小写
    SubstringComparator comp = new SubstringComparator(childStr);
    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(qualifier), CompareOp.EQUAL, comp);
  3. BinaryPrefixComparator是前缀二进制比较器
    BinaryPrefixComparator comp = new BinaryPrefixComparator(Bytes.toBytes(“zha”));
    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(qualifier), CompareOp.EQUAL, comp);
  4. BinaryComparator是二进制比较器,用于按照字典顺序比较Byte数据值
    BinaryComparator comp = new BinaryComparator(Bytes.toBytes(str));
    Filter filter = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL, comp);

过滤器:

  1. 列值过滤器
    SingleColumnValueFilter 用于测试列值相等(CompareOp.EQUAL)、不等(CompareOp.NOT_EQUAL)、范围(e.g,CompareOp.GREATER)等情况
    SingleColumnValueExcludeFilter用于单列值过滤,但并不查询出该列的值。
  2. 键值元数据过滤器
    FamilyFilter 用于过滤列族
    QualifierFilter 用于列名过滤
  3. ColumPrefixFilter用于列名前缀过滤
  4. 行键过滤器
    RowFilter 行过滤器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值