内容简介

  • 一、计数器的基本概念
  • 二、在Shell中创建并操作计数器
  • 三、单计数器
  • 四、多计数器
  • 五、总结

一、计数器的基本概念

  • 我在前两篇文章中详细介绍了HBase的过滤器,这是HBase的高级特性之一,除了过滤器,HBase还有其他的高级特性,计数器便是其中一个。计数器(Counter),常见于各种的收集信息统计系统的点击流统计,比如何种APP的热搜,或者在线广告意见,这些应用需要收集到日志文件中用于后续的分析,用户可以使用计数器做实时统计,而放弃高延时的批处理操作。
  • 在HBase中,计数器机制是一种原子操作,需要注意的是,计数器是面向列的操作,即每次对特定计数器的操作只会锁住一列而不是一行,然后读取数据,再对当前数据做加法操作,最后再写入HBase中并释放该列的锁,在操作的过程中用户是可以访问这一行的其他数据的,否则如果用户对一整行的数据加锁然后读取数据,会造成大量的资源抢占问题,这在一个高负载的系统中是致命的。

二、在Shell中创建并操作计数器

  • 通过上面介绍可知,计数器在HBase中存储值得本质即是某一列,而列则是在做具体的值操作时才会显式出现,而在创建表的时候不会出现,因而在创建计数器时指定表名与列族即可,比如我创建的表名为counters,列族分别是daily、weekly、monthly的表:

    然后像操作普通列一样,在操作计数器时,有着专门的命令:
    incre 'table' 'rowKey' 'column' 'increment-value'
    比如现在我想在daily这个列族上操作hits计数器,使它的值在原来基础上加1(初始默认为0):

    使用如下命令可以查看一个计数器的值:
    get_counter 'table' 'rowKey' 'column'
    比如我想读取 ‘daily:hits’ 计数器的值:
  • 值得注意的是,在操作计数器的时候只有一种操作,那就是加法操作,如果你想让一个计数器的值减1,则 ‘increment-value’ 这个参数为-1即可,具体规则如下:
    作用
    比零大的值 按给定的值增加计数器的值
    得到计数器当前的值,不增也不减
    比零小的值 按给定的值减少计数器的值

三、单计数器

  • 在使用计数器时,绝大多数情况下是通过Java API来使用,现来介绍单计数器。单计数器顾名思义就是一次操作只能操作一个计数器,用户需要自己设置列,方法由HTable类提供,方法签名如下:
    long incrementColumnValue(byte[] row,byte[] family,byte[] qualifier,long acount) throws IOException
    long incrementColumnValue(byte[] row,byte[] family,byte[] qualifier,long acount,boolean writeToWAL) throws IOException
    这两个方法都需要列的坐标参数和增加值,除此之外两个方法只在是否有writeToWAL这个参数上的区别,writeToWAL这个参数可以设置是否打开预写日志,默认是打开的。
    比如我在上面创建的表中,使用单计数器对计数器’daily:hits’进行操作:

    // 创建HBase的配置类
    Configuration conf = HBaseConfiguration.create();
    // 创建表实例
    HTable table = new HTable(conf,"counters");
    // 对计数器进行加3操作
    long cnt1 = table.incrementColumnValue(Bytes.toBytes("xiao-ban-zhu"),Bytes.toBytes("daily"),Bytes.toBytes("hits"),3);
    // 对计数器进行减1操作
    long cnt2 = table.incrementColumnValue(Bytes.toBytes("xiao-ban-zhu"),Bytes.toBytes("daily"),Bytes.toBytes("hits"),-1);
    // 得到当前计数器的值,不做增减操作
    long current = table.incrementColumnValue(Bytes.toBytes("xiao-ban-zhu"),Bytes.toBytes("daily"),Bytes.toBytes("hits"),0);
    

    与在shell中操作计数器一样,API也有相同的参数和相同的作用:使用正值则在原计数器的基础上增加相应的值,使用负值则在原计数器的基础上减去相应的值,如果使用0则获得当前计数器的值。

四、多计数器

  • 单计数器每一次只允许操作一个计数器,如果一行中多个列都是计数器则需要将代码重复编写,因此HBase的HTable类提供了另外一个方法,可以一次操作同一行的多个计数器,方法签名如下:
    Result increment(Increment increment) throws IOException
    要使用该方法必须先创建Increment实例,同时往该实例填充必要的计数器信息,构造方法如下:
    Increment(byte[] row)
    Increment(byte[] row,RowLock rowLock)
    创建Increment实例时需要传入一个行健,唯一标识操作这一行的一个或多个计数器。RowLock 实例则是创建用户自定义的锁实例,可以使得本次对所有计数器的操作全部在用户的控制下完成。
    当创建完Increment实例后需要往该实例中填充必要的计数器信息:列族、列名、值,它提供的方法如下:
    addColumn(byte[] family,byte[] qualifier,long acount)
    在上述例子中我们创建了三个列族,现在可以通过往Increment实例中填充信息,同时操作多个计数器:

    // 创建HBase的配置类
    Configuration conf = HBaseConfiguration.create();
    // 创建表实例
    HTable table = new HTable(conf,"counters");
    // 创建Increment实例
    Increment increment = new Increment(Bytes.toBytes("xiao-bang-zhu"));
    // 在"daily:hits"计数器上增加1
    increment.addColumn(Bytes.toBytes("daily"),Bytes.toBytes("hits"),1);
    // 在"weekly:hits"计数器上增加5
    increment.addColumn(Bytes.toBytes("weekly"),Bytes.toBytes("hits"),5);
    // 在"monthly:hits"计数器上减少10
    increment.addColumn(Bytes.toBytes("monthly"),Bytes.toBytes("hits"),-10);
    // 操作计数器
    Result result = tableincrement(increment);
    // 打印操作结果
    for(KeyValue kv:result.raw()){System.out.println("Value: " + Bytes.toLong(ky.getValue()));
    }
    

五、总结

  • 计数器是HBase非常简单实用的高级特性之一,经常用于各种实时统计的数据写入场景,比如实时的热词统计等。到目前为止,已经介绍了两种HBase的高级特性:过滤器和计数器,往后将继续介绍HBase较为复杂的高级特性-----协处理器。感谢你的阅读,如有错误请不吝赐教!
  • 更多内容请查阅 萧邦主的技术博客导航

HBase学习之路(七):理解计数器的基本概念及计数器的使用相关推荐

  1. HBase学习之路 (六)过滤器

    过滤器(Filter) 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filter可以根据簇.列.版本等更多的条件来对数据进行过滤,基于Hb ...

  2. HBase学习之路 (九)HBase phoenix的使用

    HBase phoenix的下载 下载地址http://mirror.bit.edu.cn/apache/phoenix/ 选择对应的hbase版本进行下载,测试使用的是hbase-1.2.6版本

  3. HBase学习之路(二):Java客户端的CRUD操作详讲

    内容简介 一.概述 二.操作前的准备 三.put操作 1.单行put方法 2.使用Put列表 四.get操作 1.单行get方法 2.使用Get列表 五.delete操作 1.单行delete方法 2 ...

  4. 【python3的学习之路七】函数

    返回多个值 import mathdef move(x, y, step, angle=0):nx = x + step * math.cos(angle)ny = y - step * math.s ...

  5. Java学习之路(七):泛型

    泛型的概述和基本使用 作用:把类型明确的工作推前到创建对象或者调用方法的时候 泛型是一种参数化类型,把类型当做参数一样传递来明确集合的元素类型 泛型的好处 提高安全性 省去强转的麻烦 泛型的基本使用 ...

  6. IOS学习之路七(使用 Operation 异步运行任务)

    在 application delegate 头文件(.h)中声明一个 operation 队列和两个 invocation operations: #import <UIKit/UIKit.h ...

  7. 【强化学习】你应该理解的一些关键概念

    文章目录 1.术语 1.1状态和观察(States and Observations) 1.2 动作空间(action space) 1.3 策略(Policies) 1.3.1 确定性策略(Dete ...

  8. hbase scan超时设置_HBase学习之路 (六)过滤器

    点击上方蓝字  关注我们 HBase学习之路 (六)过滤器 过滤器(Filter) 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filte ...

  9. HBase学习(7)-HBase原理

    原文来自:扎心了,老铁的<HBase学习之路 (七)HBase 原理>

最新文章

  1. mysql 0x80004005 unable to connect to any of the specified mysql hosts
  2. 后台服务器经典面试题
  3. 改变TabNavigator控件第一个tab标签的偏移量.
  4. java io复用_学习Java编程-IO复用
  5. SpringBoot_web开发-扩展与全面接管SpringMVC
  6. LeetCode Shortest Distance from All Buildings
  7. Ubuntu 10怎样在VMware中按装Vmware tool及如何全屏(转)
  8. macOS中安装secoclient
  9. h5 打包后效果失效
  10. CF55D: Beautiful Number
  11. android模拟机型,(安卓)牛X分身 — 支持位置模拟机型修改
  12. 史上最详细解释接口自动化测试中cookie、session和token的区别【多测师_王sir】
  13. 在VS中生成汇编语言程序(.asm文件)的方法
  14. spss常态检验_利用SPSS检验数据是否符合正态分布
  15. pandas 保存Excel 解决科学计数法问题
  16. 如何让html 兼容IE和chrome,chrome兼容模式如何切换成IE兼容模式_chrome兼容模式切换成IE兼容模式的方法-系统城...
  17. asp毕业设计——基于asp+sqlserver的人力资源管理系统设计与实现(毕业论文+程序源码)——人力资源管理系统
  18. ISO8583报文128个域说明
  19. 华为、苹果,为何“盯”上二手机?
  20. 火狐浏览器超好用的网页翻译插件

热门文章

  1. 通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)
  2. 《3 idiots 》主题曲Behti Hawa Sa Tha Woh的歌词和mp3下载链接
  3. 提高情商的10种方法
  4. python 一段if语句简单判断bmi指数的代码
  5. html桌面倒计时代码,超详细!使用HTML、CSS、JavaScript实现倒计时。附加功能——点击页面出现小心心...
  6. 特岗多少分入围_环球游戏开发挑战赛决赛入围者:查看六个获奖作品!
  7. python怎么读取pdf为文本_轻松用Python批量提取PDF文本内容,这个小技巧告诉你!...
  8. 【​观察】激活“文化基因”,中兴化被动为主动
  9. 大学生1500元够用吗?
  10. 4、输入一元二次方程的三个系数,求根。