记录一次HBase的scan的分页查询

修改前任bug,Hbase查询过于慢了,以至于都查不出来了,看了代码发现使用的Scan只设置了withStartRow、withEndRow、setCaching扫描,拿到全部数据后存入集合再subList进行分页,但是HBase中存在某些数据有几百万条,根本scan不出来了。

前任设置如下: 其中start 和 end 拼接0和z是因为HBase中RowKey按照字典顺序排序,

String start = rowKey + "0";
String end = rowKey + "z";
Scan scan = new Scan();
scan.withStartRow(start.getBytes());
scan.withStopRow(end.getBytes());
scan.setCaching(1000);
scan.setCacheBlocks(false);

先根据业务逻辑找他的问题,首先没限定时间戳,然后这样分页数据量大就出现问题了。

1.加上时间戳限定范围

时间根据自己的时间来定,我这里是查询前一天的数据,所以就是零点到末尾

try {scan.setTimeRange(getStartOfDay("2021-11-23"), getEndOfDay("2021-11-23"));
} catch (IOException e) {e.printStackTrace();
}

日期代码网上找的,一搜一堆

    // 获取指定日期 的 零点时间戳public static Long getStartOfDay(String date) {if (StringUtils.isEmpty(date)) {date = date2String(new Date(), "yyyy-MM-dd");}DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA);LocalDate parse = LocalDate.parse(date, ofPattern);return parse.atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli();}// 获取指定日期 的 末尾时间戳public static Long getEndOfDay(String date) {if (StringUtils.isEmpty(date)) {date = date2String(new Date(), "yyyy-MM-dd");}DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.CHINA);LocalDate parse = LocalDate.parse(date, ofPattern);return LocalDateTime.of(parse, LocalTime.MAX).toInstant(ZoneOffset.of("+8")).toEpochMilli();}public static String date2String(Date date, String format) {SimpleDateFormat yyyy_MM_dd = new SimpleDateFormat(format);return yyyy_MM_dd.format(date);}//获取前多少小时到现在的时间范围//可以将 cal1.add(11, -(hour + 2))进行修改,我这里是当前时间往前走俩小时,hour是前多少小时public static long[] getHourTimeLimit(int hour) {Calendar cal1 = Calendar.getInstance();Date date = new Date();cal1.setTime(date);cal1.add(11, -(hour + 2));Date d = cal1.getTime();return new long[]{d.getTime(), date.getTime()};}

2.修改分页查询

1.网上找到的实现方式

Hbase有一个PageFilter(x),设置一个数,往后查询多少个
但是有个问题就是需要设置具体的withStartRow,从withStartRow开始往后查询x个,需要先找到startrow,每次根据startrow往后查x,感觉有点冗余就没用,自己想了个思路。
链接贴上:想了解可以看看
https://blog.csdn.net/HANLIPENGHANLIPENG/article/details/53203646

2.自己实现的思路

scan的设置:

public Scan getScan(String rowKey){Scan scan = new Scan();String start = rowKey + "0";scan.withStartRow(start.getBytes());scan.setCaching(6000);scan.setCacheBlocks(false);scan.setMaxResultSize(2 * 1024 * 1024 * 100);try {scan.setTimeRange(getStartOfDay("2021-11-23"), getEndOfDay("2021-11-23"));} catch (IOException e) {e.printStackTrace();}scan.setFilter(new PrefixFilter(rowKey));return scan;
}

大概意思就是:使用scanner.next(pageSize)根据页数来轮询,轮询到当前页就将数据进行解析,结束循环返回。数据量大估计也需要挺长时间,测试了一下每页20条,1000页以内都还挺快的

前提是将scan.setCaching(6000);这个参数调到适合自己的集群,这将决定你多页查询的速度,或者将他设置为一个范围,根据当前页大小来做判断设置不同的大小,页数小就设置小点,页数大就相对大一些,尽量一次缓存能查找到,这样速度就会更快。

 scan.setCaching(pageSize * currentPage > 6000 ? 6000 : pageSize * currentPage);
Scan scan = getScan(rowKey);
//设置上要查询的列
for (int i = 0; i < theHour; i++) {long hour = this.timeUtil.getHour(i);scan.addColumn(Bytes.toBytes("D"), String.format("%02d", new Object[]{Long.valueOf(hour)}).getBytes());
}List<xxxx> alls = new ArrayList<>();
long count = 0L;
String startRow;
try (Table table = this.hbaseConnection.getTable(TableName.valueOf("table"));ResultScanner scanner = table.getScanner(scan)) {Result[] results;int pageCount = 0;while ((results = scanner.next(pageSize)).length != 0) {pageCount++;if (pageCount < currentPage) {continue;}for (Result rs : results) {//在此处解析获取数据alls.add(xxxx)}break;}
} catch (Exception e) {log.error("", e);
}

我查询第600页每页10个,算上解析,用时2278ms,速度还可以吧,只能说相比前任已经是可以查出来了,后面在做优化吧,第一种方法没尝试,感觉上来讲第一种也是一个一个扫描的,不知道速度如何,有时间的时候在做下测试吧。

[root@11 scanHbaseTest]# java -jar scanHbaseTest-1.0-SNAPSHOT.jar xxxxxx 600 10 today
get Results time = 2278ms

Hbase分页查询还真不太好弄,除非能缓存一下每页的第一条数据,这样速度会快很多吧,但是不太现实。

目前也没想到特别好的办法,如果有可以分享给我。

HBase查询优化续集HBase并发查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python需要配置环境变量吗_python需要设置哪些环境变量?我只知道一个PYTHONHOME指向安装目录。(python详细安装教程 path)...

怎么把Python文件夹添加进Path中 “我的电脑”点右键&#xff0c;“属性” “高级”&#xff0c;“环境变量”&#xff0c;“系统变量” 然后&#xff0c;Path添加“c:\python26”之类的。 怎么在Path中添加Python路径 ⒈单击开始&#xff0c;在搜索框输入cmd&#xff0c;然后&…

qt5.3.1+opencv2.4.9编译环境的搭建

到官网下载qt-opensource-windows-x86-mingw482_opengl-5.3.1.exe文件&#xff0c;执行该文件&#xff0c;选择默认安装即可实现QT的安装&#xff08;安装在C盘的根目录下&#xff09;&#xff0c;该文件封装好了Qt libraries、Qt Creator&#xff0c;其中Qt Creator为3.1.2版本…

Spark2内存调优总结 - 内存划分 与 内存计算 与 调参方式

使用的Spark2以上版本所以只考虑UnifiedMemoryManager动态内存管理&#xff0c;如图&#xff1a; 1. 内存划分 与 内存计算 与 调参方式 1.1 三部分&#xff1a;Spark内存、用户内存、预留内存 预留内存&#xff1a;300MB 固定Spark内存和用户内存比例由参数spark.memory.fra…

java 通过id获取html代码_Maven私服安装配置,java通过私服下载代码,并打包后上传到私服(Nexus)...

Maven私服一般安装Nexus。首先&#xff0c;Nexus下载&#xff0c;访问Nexus官方网址https://www.sonatype.com/download-nexus-repo-oss下载完成后是个压缩包第二步 配置&#xff1a;1)将上一步下载的nexus解压2)端口和监听配置application-port&#xff1a;监听端口applicatio…

Qt下OpenCv中cvGetWindowHandle的使用

昨天因为OpenCv自带的 cvNamedWindow 功能不多&#xff0c;所以想修饰一下&#xff0c;添加几个控件上去&#xff0c;结果获取不到句柄或指针。试了半天无效&#xff0c;于是就准备放弃&#xff0c;打算自己写一个对话框&#xff0c;但是感觉有点麻烦&#xff0c;而且心里不爽&…

一些网站github等无法连接服务器的解决办法

1.打开站长工具 http://tool.chinaz.com/speedtest/ 2.搜索github.com/ 3. 点击总耗时-排序 4. 拿到延迟最低的ip地址20.205.243.166 5.修改本地dns windows&#xff1a;C:\Windows\System32\drivers\etc 修改hosts文件&#xff0c;末尾添加 20.205.243.166 github.com Lin…

【转】异步编程系列(Thread、Task、async/await、ajax等)

序 经过一番努力&#xff0c;我写的异步编程系列也算有头有尾&#xff0c;当然不是说这个系列已经更新完毕&#xff0c;这个头尾只是表示新旧知识点都有简单涉及到&#xff0c;接下去我还会丰富这一系列并且有机会整个小应用&#xff08;愿景是弄一个开源组件吧&#xff0c;结合…

linux里qt画直线_Qt与Web混合开发(一)简单使用

前言《Qt与Web混合开发》系列文章&#xff0c;主要讨论Qt与Web混合开发相关技术。这类技术存在适用场景&#xff0c;例如&#xff1a;Qt项目使用Web大量现成的组件/方案做功能扩展&#xff0c;Qt项目中性能无关/频繁更新迭代的页面用html单独实现&#xff0c;Qt项目提供Web形式…

ES curator离线安装与部署

1.版本&#xff1a; es&#xff1a;6.5.1 curator&#xff1a;5.8.4 下载地址&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/curator/current/yum-repository.html#_signing_key_2 2.连接不上网站怎么办&#xff1f; 出现无法访问此网页的话&#xff0…

Qt中qss的使用

Qt支持css样式表&#xff0c;它是网页中用来控制显示的脚本&#xff0c;功能丰富&#xff0c;可以很方便的实现各种显示效果。如果想进一步了解其语法以及使用&#xff0c;可访问www.w3school.com.cn。好在之前在写网站&#xff0c;比较熟悉。 给一个控件添加样式表&#xff0…

【转】1.1异步编程:线程概述及使用

从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个“主题”。即&#xff1a;C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。现在我为最新版本的“异步编程”主题写系列分享&#xff0c;期待你的查看及点评。 传送门&#xff1a;异步编程系列目录……

安装python3.7.0的步骤_python 3.7.0 安装配置方法图文教程

本文记录了python 3.7.0 安装配置方法&#xff0c;供大家参考&#xff0c;具体内容如下 s1登入python官网 s2下载后缀为exe的可执行文件&#xff0c;并根据自己电脑/主机的系统选择32位还是64位。双击选择“python for windows”&#xff08;&#xff09; 出现选择下载页面&…

ES:记录curator+nfs进行索引备份、创建快照的一次实践

1. 安装curator工具 下面是我离线安装的过程 https://blog.csdn.net/weixin_43736084/article/details/121775484?spm1001.2014.3001.5501 2.使用fs建立es存储库 我们使用NFS&#xff0c;下面是官网给出的几种仓库类型 2.1 fs建立存储库的注意事项 注意事项&#xff0c;…

Qt : 记录一个编译错误

是信号和槽的使用出现的问题&#xff1a; undefined reference to vtable for ** 解决办法见 http://jingyan.baidu.com/article/47a29f2453d772c0142399ba.html

【转】1.2异步编程:使用线程池管理线程

从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个“主题”。即&#xff1a;C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。现在我为最新版本的“异步编程”主题写系列分享&#xff0c;期待你的查看及点评。 传送门&#xff1a;异步编程系列目录……

python matplotlib画散点图_python matplotlib库绘制散点图例题解析

假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温&#xff08;分别位于列表a&#xff0c;b&#xff09;&#xff0c;那么此时如何寻找出气温随时间&#xff08;天&#xff09;变化的某种规律&#xff1f; a [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16…

超好的Git学习网站

超好的Git学习网站 Git很强大&#xff0c;但是学起来太困难了。各种名词很容易搞糊涂&#xff0c;让人丧失兴趣。 那么问题来了&#xff0c;有没有好的教程呢&#xff1f; 偶然间发现这几个网站简直是闲得没事干&#xff0c;做出来这么好的入门教程&#xff0c;比起来纯文字…

Hadoop集群HDFS各节点磁盘使用率不平衡,使用balancer做数据平衡

HDFS上各节点磁盘大小不一致&#xff0c;新增节点 数据平衡前&#xff0c;是非常不均衡的&#xff0c;某些节点已经接近90了 集群的数据平衡已经迫在眉睫&#xff0c;必须要搞一搞了。 1.设置传输速率 我这里是万兆网卡&#xff0c;就先设置100M了 在两台master上分别执行&a…

【转】1.3异步编程:线程同步基元对象

开始《异步编程&#xff1a;同步基元对象&#xff08;上&#xff09;》 示例&#xff1a;异步编程&#xff1a;线程同步基元对象.rar 如今的应用程序越来越复杂&#xff0c;我们常常需要多线程技术来提高我们应用程序的响应速度。每个线程都由自己的线程ID&#xff0c;当前指令…

怎么查询共享使用人_企业微信微盘怎么共享使用?企业微信如何设置微盘权限?...

使用企业微信办公时&#xff0c;如果有文件需要共享给员工&#xff0c;我们可以将文件上传到微盘的共享空间中&#xff0c;让员工自行下载并查看。那么在企业微信中&#xff0c;我们该如何创建共享空间呢&#xff1f;1如何创建微盘共享空间企业微信微盘共享空间分为两种&#x…