首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HBase高级特性之计数器

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[45]篇文章,欢迎阅读和收藏】

1基本概念

HBase中的计数器是为了防止多个客户端的资源竞争问题引入的概念,将列当做一个计数器,客户端 API 提供了专门方法进行读取并修改( Read and modify ),保证一次客户端操作的原子性。同时计数器可以方便、快速地进行计数操作,用来做点击统计 , 增长的 id 这类需要每次都保证线程安全的场景。

2术语解释

HBase原子性保证:同一行的变更操作(包括针对一列 / 多列 / 多 column family 的操作),要么完全成功,要么完全失败,不会有其他状态。

可以通过如下一个例子来解释:

A客户端针对 rowkey=10 的行发起操作:dim1:a = 1 dim2:b=1

B 客户端针对 rowkey=10 的行发起操作:dim1:a = 2 dim2:b=2

dim1 、 dim2 为 column family , a 、 b 为 column

A 客户端和 B 客户端同时发起请求,最终 rowkey=10 的行各个列的值可能是 dim1:a = 1 dim2:b=1 ,也可能是 dim1:a = 2 dim2:b=2

但绝对不会是 dim1:a = 1 dim2:b=2

3详细说明

如果没有计数器特性,用户需要对一行数据加锁,然后读取数据,再对当前数据做加法,最后写回 Hbase 并释放该行锁。这样会引起大量的资源竞争,有其是当客户端进程崩溃之后,尚未释放的锁需要等待超时恢复,这会是一个高负载的系统中引起灾难性的后果。。

3.1计数器初始化

用户不用初始化计数器,第一次使用的时候会被自动设置为 0 。

增加计数器使用 incr 命令(可以增加任意值),获取计数器用 get_counter 命令。 计数器的增量可以是正数负数,正数代表加,负数代表减;默认步长是 1 ,也可为 0 不增加。

编写 Java 程序的时候可以用 Put 直接给一个计数器赋值,但是必须使用 Bytes.toBytes(long) 方法来给要设定的值进行编码,否则会得到意想不到的结果。同样可以使用 Get 直接来获取计数器的值,但是必须使用 Bytes.toLong() 来进行解码。

Incr:计数器操作

get :获取 counter 的具体内容(十六进制 非格式化内容)

get_counters :获取 counter 的具体内容 ( 格式化内容 )

3.2计数器分类

HBASE中的计数器可分为单计数器和多计数器两类。

3.2.1单计数器

操作只能操作一个计数器,即一列,需要指定列族和列限定名,以及要增加的值(可以为正数、 0 、负数)。

3.2.2多计数器

用户可以一次更新多个计数器,但是它们都必须属于一行。更多的行的计数器需要使用独立的 API 调用,即多个 RPC 请求。Batch() 方法目前并不支持 Increment 实例。增加一个计数器,实际上就是增加一列,使用addColumn(byte[] family, byte[] qualifier, long amount)方法,设置一个计数器操作。

3.2.3计数器过期设置

Increment实例不同于 Put ,是不能设置版本的,但是可以使用setTimeRange(long minStamp, long maxStamp) 方法来使老的计数器过期,用户限制时间范围,可以用来屏蔽比较老的计数器,使它们看上去不存在。一次增加操作会认为这此较老的计数器不存在,并把它们重置为 1 。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200130A0087X00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券