首页 > 其他分享 >轻松应对亿级数据,HBase Scan读取速度翻倍

轻松应对亿级数据,HBase Scan读取速度翻倍

时间:2024-09-05 10:05:35浏览次数:13  
标签:缓存 scanner scan Scan 扫描 设置 亿级 HBase

轻松应对亿级数据,HBase Scan读取速度翻倍

HBase是一种基于Hadoop的分布式列存储数据库,它支持大规模结构化数据的存储和随机访问。

在HBase中,扫描(Scan)是一种读取表中数据的方式,它可以返回表中满足条件的一部分或全部数据。本文将介绍HBase中扫描的概念、使用方法和性能优化。

1 扫描的概念

扫描是一种读取表中数据的方式,它可以按照一定的条件过滤出表中符合条件的一部分或全部数据,并返回给用户。HBase中的扫描是基于rowkey的顺序扫描,可以通过设置startRow和stopRow来限制扫描的范围,还可以设置过滤器来进一步过滤数据。

2 扫描的使用

在HBase中,扫描可以通过HBase Shell、Java API和REST API等方式进行操作。下面以Java API为例介绍扫描的使用。

2.1 创建扫描对象

// 创建一个Scan对象用于设置扫描的参数
 Scan scan = new Scan();
  • 1.
  • 2.

2.2 设置扫描的范围

scan.setStartRow(Bytes.toBytes("startRow"));
 scan.setStopRow(Bytes.toBytes("stopRow"));
  • 1.
  • 2.

设置扫描的起始行和结束行,可通过Bytes.toBytes方法将字符串转换为字节数组。

设置过滤器

Filter filter = new SingleColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("col"), CompareOperator.EQUAL, Bytes.toBytes("value"));
 scan.setFilter(filter);
  • 1.
  • 2.

设置过滤器,可以通过SingleColumnValueFilter等过滤器来过滤数据。

执行扫描

ResultScanner scanner = table.getScanner(scan);
 for (Result result : scanner) {
     // 处理扫描结果
 }
 scanner.close();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

执行扫描并遍历结果,可以通过ResultScanner获取扫描结果,并通过for循环遍历结果。最后记得关闭ResultScanner。

3 扫描的性能优化

3.1 设置缓存和批量大小

scan.setCaching(100);
 scan.setBatch(10);
  • 1.
  • 2.

设置扫描的缓存大小和批量大小,可以有效地减少RPC调用次数,提高扫描的性能。

3.2 避免全表扫描

全表扫描是非常消耗资源的,因此应该尽可能避免全表扫描。

可通过设置扫描的范围和过滤器等方式来限制扫描的范围,避免全表扫描。

3.3 使用扫描缓存

scan.setScanMetricsEnabled(true);
  • 1.

设置扫描缓存,可以获取扫描的性能指标,如扫描的时间、扫描的行数等。通过这些指标可以优化扫描的性能,例如调整缓存大小、批量大小等。

使用扫描缓存可以有效地提高扫描的性能,因为它可以减少RPC调用次数,从而降低了网络开销和延迟。在HBase中,扫描缓存是通过设置scan.setCaching()方法来实现的。

设置扫描缓存大小

scan.setCaching(100);
  • 1.

设置扫描缓存大小,可以控制每次RPC调用返回的行数。缓存大小越大,网络开销就越小,但是内存开销就越大。通常情况下,扫描缓存大小的设置应该在100到1000之间,根据具体情况来调整。

3.4 设置批量大小

scan.setBatch(10);
  • 1.

设置批量大小,可以控制每次RPC调用的数据量。批量大小越大,网络开销就越小,但是RPC调用的延迟就越大。通常情况下,批量大小的设置应该在5到10之间,根据具体情况来调整。

3.5 获取扫描指标

scan.setScanMetricsEnabled(true);
  • 1.

设置扫描指标,可以获取扫描的性能指标,如扫描的时间、扫描的行数等。通过这些指标可以优化扫描的性能,例如调整缓存大小、批量大小等。

ScanResultCache resultCache = new ScanResultCache(cacheSize);
 ResultScanner scanner = table.getScanner(scan);
 List<Result> results = resultCache.cache(scanner);
 for (Result result : results) {
     // 处理扫描结果
 }
 scanner.close();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

使用ScanResultCache可以缓存扫描结果,从而减少RPC调用次数,提高扫描的性能。ScanResultCache是一个开源的扫描缓存库,可以在GitHub上找到。

3.6 使用异步扫描

异步扫描可以提高扫描的并发度,从而提高扫描的性能。可以通过使用CompletableFuture等方式来实现异步扫描。

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
     try {
         ResultScanner scanner = table.getScanner(scan);
         for (Result result : scanner) {
             // 处理扫描结果
         }
         scanner.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
 });
 future.join();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

使用CompletableFuture实现异步扫描,可以在主线程中启动异步任务,并在异步任务执行完毕后等待结果。

4 总结

本文介绍了HBase中扫描的概念、使用方法和性能优化。扫描是HBase中常见的数据读取方式,通过设置扫描的参数、过滤器等方式可以实现灵活的数据查询。在实际应用中,我们需要根据数据的特点和查询需求来选择合适的扫描方法,并结合缓存、批量处理、异步等方式来优化扫描的性能。

原文链接:https://blog.51cto.com/JavaEdge/6188017

标签:缓存,scanner,scan,Scan,扫描,设置,亿级,HBase
From: https://www.cnblogs.com/sunny3158/p/18397785

相关文章

  • BufferedMutator hbase
    BufferedMutatorhbase我整理的一些关于【Java】的项目学习资料(附讲解~~)和大家一起分享、学习一下: https://d.51cto.com/f2PFnN如何实现BufferedMutatorhbase介绍在使用HBase进行数据存储时,我们常常需要进行批量写入操作。为了提高写入性能和减少网络开销,HBase提供了Buffe......
  • HBase 源码阅读(三)创建表流程
    前言上两篇介绍了HMaster完整进程的启动,现在开始介绍一下HMaster创建表的流程1.创建表的流程下面这一部分通过ChatGPT来生成在HBase中,通过Java编写创建表的过程涉及多个组件和源码的位置。这里为您详细解析这个过程涉及的主要类和方法。API层级的调用:用户首先......
  • Java性能优化传奇之旅--Java万亿级性能优化之Java 性能优化逆袭:常见错误不再是阻碍
           ......
  • Scanner
    Java用Scanner类接受键盘输入。步骤:导入该类所在的包(要使用一个类的话就必须先导入该类所在的包)创建该类的对象调用里面的功能Scanner有两套系统。第一套系统:nextInt();nextDouble();next();//等等...第二套系统:nextLine();//接收一个字符串程序示......
  • 机器学习:DBSCAN算法(内有精彩动图)
    目录前言一、DBSCAN算法1.动图展示(图片转载自网络)2.步骤详解3.参数配置二、代码实现1.完整代码2.代码详解1.导入数据2.通过循环确定参数最佳值总结前言        DBSCAN(Density-BasedSpatialClusteringofApplicationswithNoise)是一种基于密度的聚类......
  • 携程技术分享:亿级流量的办公IM及开放平台技术实践
    本文由携程技术Jim分享,原题“日访问过亿,办公IM及开放式平台在携程的实践”,下文进行了排版和内容优化。1、引言携程内部的办公IM项目最早在2016年立项,经历了初期简单办公场景下的纯IM服务,到支持简单办公组件的IM应用,又演变为一体化办公集成平台,进而演变为目前集成IM功能的开放......
  • prescan中的Road Segment以及常见路面摩擦系数
    参考文章:轮胎摩擦系数-汽车之家(autohome.com.cn)一、点击Settings->Preferences->RoadSegments进入1、Road Segment参数描述单位Lanewidth车道的默认宽度。[m]Numberoflanes一个路段的默认车道数。[-]Asphalttype默认的沥青类型{标准的沥......
  • HCL AppScan Standard 10.6.0 发布,新增功能概览
    HCLAppScanStandard10.6.0发布,新增功能概览HCLAppScanStandard10.6.0中的新增功能API扫描现在通过高级OpenAPI自动扫描改进了配置功能、增强了覆盖范围并优化了漏洞检测。AppScanConnect:支持AppScan360°:AppScanConnect现在完全支持与AppScan360°......
  • Java的输入 Scanner
    Java的流程控制Scanner对象获取用户的输入java.uril.ScannerScanners=newScanner(System.in);Scanner类的next()和nextLine()方法获得输入的字符串,在读取前可用hasNext()个hasNextLine()判断是否还有输入数据Scannersc=newScanner(System.in);System.out......
  • MySQL 亿级数据平滑迁移实战
    本文介绍了一次MySQL数据迁移的流程,通过方案选型、业务改造、双写迁移最终实现了亿级数据的迁移。一、背景预约业务是vivo游戏中心的重要业务之一。由于历史原因,预约业务数据表与其他业务数据表存储在同一个数据库中。当其他业务出现慢SQL等异常情况时,可能会直接影响......