HBase_HBase2.0 Java API 操作指南 (五) 计数器

2024-05-03 05:58

本文主要是介绍HBase_HBase2.0 Java API 操作指南 (五) 计数器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HBase 的计数器在 点击流和广告统计中非常常用。本篇文章我们将从 shell 和 java API 两个方面去探索 Hbase 的计数器的使用。

 

1.shell 操作

2.JavaApi

   i.单计数器

  ii.多计数器

 

0.计数器介绍

在Hase 中,计数器机制是一种原子操作,需要注意的是,计数器是面向列的操作。即每次对特定计数器的操作只会锁住一列,而不是一行。然后读取数据,在对当前数据进行加法操作,最后再写入Hbase并释放该列的锁。在操作的过程中用户是可以访问这一行的其他数据的,否则如果用户对一整行的数据加锁然后读取数据,会造成大量资源抢占问题,这在一个高负载的系统中是致命的。

 

 

1.shell 操作

 

 创建一张测试表 表名 hits, 拥有 pu, uv 两个列族

create 'hits','pv','uv'

 

创建并修改计数器

NOTE : 没有计数器初始化单独的指令,初始化和操作指令相同

incr 'hits','20200424','pv:1',1
incr 'hits','20200424','uv:1',2

 

获取计数器的值

 get_counter 'hits','20200424','uv:1'

输出:

hbase(main):002:0> get_counter 'hits','20200424','uv:1'
COUNTER VALUE = 2
Took 0.8213 seconds   

 

扫描表

scan 'hits'

ROW                         COLUMN+CELL                                                                  20200423                   column=uv:1, timestamp=1587662324121, value=\x00\x00\x00\x00\x00\x00\x00\x04 20200424                   column=pv:1, timestamp=1587661726573, value=\x00\x00\x00\x00\x00\x00\x00\x01 20200424                   column=uv:1, timestamp=1587661734932, value=\x00\x00\x00\x00\x00\x00\x00\x02 
2 row(s)
Took 0.0296 seconds  

注意:在表中存储的数据实际是 bytes 字节数组,所以会看到数据实际上是不可直接读的。

 

 

操作计数器的指令

incr 'table' 'rowKey' 'columnFamily:column' 'increment-value'

'increment-value' 不同的值对计数器产生的影响

比零大的值                 按给定值增加计数器中的数值
零                               得到计数器当前值,与Shell命令get_counter的返回值相同
比零大的值                减少计数器的当前值

 

=========================================

 

2.JavaAPI

   i.单计数器

单计数器的相关Java API

  /*** See {@link #incrementColumnValue(byte[], byte[], byte[], long, Durability)}* <p>* The {@link Durability} is defaulted to {@link Durability#SYNC_WAL}.* @param row The row that contains the cell to increment.* @param family The column family of the cell to increment.* @param qualifier The column qualifier of the cell to increment.* @param amount The amount to increment the cell with (or decrement, if the* amount is negative).* @return The new value, post increment.* @throws IOException if a remote or network exception occurs.*/long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier,long amount) throws IOException;/*** Atomically increments a column value. If the column value already exists* and is not a big-endian long, this could throw an exception. If the column* value does not yet exist it is initialized to <code>amount</code> and* written to the specified column.** <p>Setting durability to {@link Durability#SKIP_WAL} means that in a fail* scenario you will lose any increments that have not been flushed.* @param row The row that contains the cell to increment.* @param family The column family of the cell to increment.* @param qualifier The column qualifier of the cell to increment.* @param amount The amount to increment the cell with (or decrement, if the* amount is negative).* @param durability The persistence guarantee for this increment.* @return The new value, post increment.* @throws IOException if a remote or network exception occurs.*/long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier,long amount, Durability durability) throws IOException;

注意 Java API 中也不存在对计数器初始化的api

如果想初始化一个计数器,可以像下面这样操作

long value2 = table.incrementColumnValue(Bytes.toBytes("20200423"),Bytes.toBytes("uv"),Bytes.toBytes("2"),0);
System.out.println(value2);

其中函数的返回值会返回计数器在修改过后的值

 

 

 

  ii.多计数器

另一个增加计数器的途径,是 table 的 increment() 方法。该方法可以操作多列数据。

首先我们需要创建一个Increment 对象,并把需要操作的装载进去。

Increment multiIncrement = new Increment(Bytes.toBytes("20200224"));
multiIncrement.addColumn(Bytes.toBytes("pv"),Bytes.toBytes("1"),-1);
multiIncrement.addColumn(Bytes.toBytes("uv"),Bytes.toBytes("1"),1);
multiIncrement.addColumn(Bytes.toBytes("pv"),Bytes.toBytes("2"),1);
multiIncrement.addColumn(Bytes.toBytes("uv"),Bytes.toBytes("2"),4);
Result result = table.increment(multiIncrement);

 

 

单计数器 与 多计数器 API操作示例

package hbase_2.counter;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;/*** Created by szh on 2020/4/24.* @author szh*/
public class Hbase_Counter {public static void main(String[] args) throws Exception {Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum", "cdh-manager,cdh-node1,cdh-node2");conf.set("hbase.zookeeper.property.clientPort", "2181");Connection conn = ConnectionFactory.createConnection(conf);TableName tableName = TableName.valueOf("hits");Table table = conn.getTable(tableName);//设置客户端缓存大小long value = table.incrementColumnValue(Bytes.toBytes("20200423"),Bytes.toBytes("uv"),Bytes.toBytes("1"),4);System.out.println(value);long value2 = table.incrementColumnValue(Bytes.toBytes("20200423"),Bytes.toBytes("uv"),Bytes.toBytes("2"),0);System.out.println(value2);Increment multiIncrement = new Increment(Bytes.toBytes("20200224"));multiIncrement.addColumn(Bytes.toBytes("pv"),Bytes.toBytes("1"),-1);multiIncrement.addColumn(Bytes.toBytes("uv"),Bytes.toBytes("1"),1);multiIncrement.addColumn(Bytes.toBytes("pv"),Bytes.toBytes("2"),1);multiIncrement.addColumn(Bytes.toBytes("uv"),Bytes.toBytes("2"),4);Result result = table.increment(multiIncrement);for(Cell cell : result.rawCells()){System.out.println(cell);}table.close();}
}

 

 

 

 

 

 

这篇关于HBase_HBase2.0 Java API 操作指南 (五) 计数器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955972

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。