Loading

HBase

date: 2020-03-31 14:09:00
updated: 2020-06-29 17:14:00

HBase

1. 特性

rowkey 行键(自定义,但是必须有,而且唯一);列族,列族里储存的是 k,v 的形式,并且 v 可以储存多个不同的值,根据时间戳来判断版本,默认返回最近更新的版本;根据 rowkey 的范围来划分不同的 region 区域,然后由不同的 hbase 服务器(region server)来管理不同的 region,这样可以缓解服务器的压力;表在 hdfs 存储时,会按照 region 来创建不同的文件夹,然后再根据列族划分更细的文件夹,最后才是最终文件数据(如果数据量很小的话,会直接保存在 region server 下的一个 memstore 里,另外热数据也会保存在 memstore 里,保证快速查找,缓存空间满了后会写入文件)

region server 会持续向 zookeeper 汇报,如果有其中一个 region server 挂了,会有一个 master 来重启 region server,但是如果master挂了,region server没挂,不影响用户获取数据。一般会设置两个master,一个是active,一个是standby,组成一个解决单点故障的机制 HA:高可用

在 hbase 的系统表里,有一个 hbase:meta,里面保存了所有的用户表的region信息。用户去查询数据的时候,会先去zookeeper(有一个 meta-region-server)找到 meta 表所在的 region server,然后去 region 对应的 server 里查找数据

存储的数据没有数据类型,都是二进制数组 byte[],所以代码进行操作时要做数据转换

2. 命令

create tablename, 列族1, 列族2

put tablename, rowkey, 列族1:key, value

get tablename, rowkey

delete 只能删一个cell,也就是列族下的某一个k,v,deleteall 可以删除一行

3. 列族的布隆过滤器

在构造一个列族定义时,可以设置列族的布隆过滤器类型。
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor("xxx");
hColumnDescriptor.setBloomFilterType(BloomType.ROW);
在对表的列族的某个key进行更新的时候,可能会导致hdfs中/hbase/data/default/tablename/region0/列族/ 目录下有很多文件,通过设置 BloomType 可以在查询时,过滤出不存在查询的key的文件,只从剩余文件里返回最新版本的那个value,从而提高效率

4. 查询某一行到某一行

方法默认范围是左闭右开,如果要右闭的话可以在后面添加一个字节0
Scan scan = new Scan("10".toBytes(), "10000\000".toBytes());

前面的0是阿拉伯符号0,后面\000,添加的是真正的数字0

String a = "000";
String b = "000\0";
byte[] bt1 = a.getBytes[]; // [48, 48, 48] ACSII
byte[] bt2 = b.getBytes[]; // [48, 48, 48, 0]

5. 大批量导入数据 bulk-load

6. mapreduce 分析 hbase

7. 创建二级索引 solr

8. HBase提供了多个客户端参数设置超时

hbase.rpc.timeout
一次RPC请求的超时时间,如果某次RPC时间超过该值,客户端就会主动关闭socket。这个配置超时异常经常发生在大量高并发读写业务或者服务器端发生了比较严重的Full GC等场景下,导致某些请求无法得到及时处理,超过了时间间隔。该值默认大小为60000ms,即1min

hbase.client.operation.timeout
该参数表示HBase客户端发起一次数据操作直至得到响应之间总的超时时间,数据操作类型包括get、append、increment、delete、put等。很显然,hbase.rpc.timeout表示一次RPC的超时时间,而hbase.client.operation.timeout则表示一次操作的超时时间,有可能包含多个RPC请求。举个例子说明,比如一次Put请求,客户端首先会将请求封装为一个caller对象,该对象发送RPC请求到服务器,假如此时因为服务器端正好发生了严重的Full GC,导致这次RPC时间超时引起SocketTimeoutException,对应的就是hbase.rpc.timeout。那假如caller对象发送RPC请求之后刚好发生网络抖动,进而抛出网络异常,HBase客户端就会进行重试,重试多次之后如果总操作时间超时引起SocketTimeoutException,对应的就是hbase.client.operation.timeout。

hbase.client.scanner.timeout.period
默认为60000ms
在scan过程中RegionServer端偶尔抛出leaseException,是怎么回事?
看到leaseException就会想到租约机制,的确,HBase内部在一次完整的scan操作中引入了租约机制。为什么需要租约机制?这和整个scan操作流程有莫大的关系,上文讲到,一次完整的scan通常会被拆分为多个RPC请求,实际实现中,RegionServer接收到第一次RPC请求之后,会为该scan操作生成一个全局唯一的id,称为scanId。除此之外,RegionServer还会进行大量的准备工作,构建整个scan体系,构造需要用到的所有对象,后续的RPC请求只需要携带相同的scanId作为标示就可以直接利用这些已经构建好的资源进行检索。也就是说,在整个scan过程中,客户端其实都占用着服务器端的资源,此时如果此客户端意外宕机,是否就意味着这些资源永远都不能得到释放呢?租约机制就是为了解决这个问题。RegionServer接收到第一次RPC之后,除了生成全局唯一的scanId之外还会生成一个携带有超时时间的lease,超时时间可以通过参数hbase.regionserver.lease.period配置,一旦在超时时间内后续RPC请求没有到来(比如客户端处理太慢),RegionServer就认为客户端出现异常,此时会将该lease销毁并将整个scan所持有的资源全部释放,客户端在处理完成之后再发后续的RPC过来,检查到对应的lease已经不存在

To make sure the timeout period is not too short, you can configure hbase.cells.scanned.per.heartbeat.check to a minimum number of cells that must be scanned before a timeout check occurs. The default value is 10000. A smaller value causes timeout checks to occur more often. 为确保超时时间(hbase.client.scanner.timeout.period)不会太短,可以将hbase.cells.scanned.per.heartbeat.check配置为发生超时检查前必须扫描的最小数量的单元。 默认值为10000.较小的值会导致更频繁地进行超时检查。

Confiuration conf = HBaseConfiguration.create();
conf.setInt("hbase.rpc.timeout",20000);
conf.setInt("hbase.client.operation.timeout”,30000);
conf.setInt("hbase.client.scanner.timeout.period",20000);
HTable table = new HTable(conf,"tableName");

重试机制
客户端参数优化实践

  1. hbase.client.pause:默认为100,可以减少为50
  2. hbase.client.retries.number:默认为31,可以减少为21

[100,200,300,500,1000,2000,4000,10000,10000,10000,10000,20000,20000,…,20000]
默认情况下,客户端将在448s内重试30次,然后放弃连接到集群

[50,100,150,250,500,1000,2000,5000,5000,5000,5000,10000,10000,…,10000]
客户端将会在2min内重试20次,然后放弃连接到集群

在构造线程时,有一个默认关闭的特性:当hbase.client.backpressure.enabled(默认值为false,ServerStatisticTracker:63,AsyncProcess:629)为ture时,客户端会根据服务端压力和客户端配置的策略,生成带延时的Runnable对象,用以动态缓解服务端压力

posted @ 2020-10-22 10:29  猫熊小才天  阅读(150)  评论(0编辑  收藏  举报