HBase Java API开发:表的扫描与扫描的缓存和批量处理

第1关:批量处理

编程要求

在右侧编辑器begin-end处编写代码补全batchOp(String tablename) 函数,参数:tablename为待操作表的表名,要求实现如下操作:

  • 删除表中行键为row1row2的行;

  • 获取表中行键为row3row10的行;

  • 四个操作需要依照以上先后顺序,即先删除在获取row3,row10

不需要你直接输出,只需要将批量操作的执行结果作为返回值返回即可。


package step1;

import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.client.coprocessor.Batch;
import org.apache.hadoop.hbase.util.Bytes;

public class Task {

	public Object[] batchOp(String tablename) throws Exception {
		/********* Begin *********/
		Configuration conf = HBaseConfiguration.create();
        Connection conn = ConnectionFactory.createConnection(conf);
        Table table = conn.getTable(TableName.valueOf(tablename));
        List<Row> rows = new ArrayList<>();
        //删除操作
        Delete delete = new Delete(Bytes.toBytes("row1"));
        Delete delete2 = new Delete(Bytes.toBytes("row2"));
        rows.add(delete);
        rows.add(delete2);
        //获取操作
        Get get = new Get(Bytes.toBytes("row3"));
        Get get2 = new Get(Bytes.toBytes("row10"));
        rows.add(get);
        rows.add(get2);
        //定义结果数组长度
        Object[] results = new Object[rows.size()];
        table.batch(rows, results);//这是一个同步的操作,批量操作的结果将会在操作之后放在results中
        //delete和put操作的结果为NONE 即没有结果
        return results;
	
		/********* End *********/
	}
}

第2关:扫描表中所有的数据

知识点

1.扫描一张表的步骤:

step1:创建Scan扫描对象;

Scan scan = new Scan();

step2:获取Resultscanner对象

ResultScanner scanner = table.getScanner(scan);

step3:利用ResultScanner对象遍历数据

for(Result result : scanner){
    for (Cell kv : result.rawCells()) {
        String family = Bytes.toString(CellUtil.cloneFamily(kv));
        String qualifire = Bytes.toString(CellUtil.cloneQualifier(kv));
        String value = Bytes.toString(CellUtil.cloneValue(kv));
        values.add(value);
        System.out.println(family + ":" + qualifire + "\t" + value);
    }
}

编程要求

编写代码补全右侧scanTable(String tableName)函数,输出表名为tableName所有行中所有列的值。

package step2;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;

public class Task {

	public void scanTable(String tablename) throws Exception {
		/********* Begin *********/
		Configuration conf=HBaseConfiguration.create();
        Connection conn=ConnectionFactory.createConnection(conf);
        Table table = conn.getTable(TableName.valueOf(tablename));
        Scan scan=new Scan();
        ResultScanner scanner=table.getScanner(scan);
        for(Result result : scanner){
            for (Cell cell : result.rawCells()) {
                System.out.println(new String(CellUtil.cloneValue(cell),"utf-8"));
        }
}
        scanner.close();
   
		/********* End *********/
	}
}

第3关:在扫描中使用缓存和批量参数

编程要求

请补全scanTable(String tablename)函数实现扫描表的功能,参数tablename为表名,完成如下操作:

  • 设置扫描缓存为200

  • 设置扫描值行健在1row199之间;

  • 将扫描到数据的值输出。

package step3;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

public class Task {

	public void scanTable(String tablename) throws Exception {
		/********* Begin *********/
        Configuration conf=HBaseConfiguration.create();
        Connection conn=ConnectionFactory.createConnection(conf);
        Table table = conn.getTable(TableName.valueOf(tablename));
        Scan scan=new Scan();
        scan.setCaching(200);  //设置缓存
        scan.setStartRow(Bytes.toBytes("1"));
        scan.setStopRow(Bytes.toBytes("row199"));
        ResultScanner scanner=table.getScanner(scan);
        for(Result result:scanner){
            for(Cell cell:result.listCells()){
                System.out.println(new String(CellUtil.cloneValue(cell),"utf-8"));
            }
        }
		scanner.close();
		/********* End *********/
	}
}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HBase是一个非关系型数据库,它支持对扫描操作。扫描可以按照行键范围或过滤器条件进行。HBase还支持缓存扫描结果,可以提高查询性能。此外,HBase还支持批量处理,可以同时对多行进行操作,提高处理效率。 ### 回答2: HBase是一种分布式、可扩展的列式存储系统,是基于Hadoop的海量数据存储解决方案之一,使用Java语言编写。HBase扫描扫描缓存批量处理HBase的重点开发难点之一。本文将从这三个方面来探讨HBase开发。 1. HBase扫描 HBase无法像传统关系型数据库那样直接进行SQL查询,它的查询方式是通过扫描中的行来进行。HBase扫描可以采用Scan类来实现,在Scan类中可以指定要扫描的范围、列限定器等。扫描时会返回Scanner类,通过Scanner逐行扫描中的数据并将扫描结果以一定的格式返回。在扫描时,可以指定不同的过滤器来帮助筛选需要的数据。如果需要查询中所有数据,则可以省略Scan类中的startRow和stopRow参数。 2. 扫描缓存HBase中,扫描的结果是比较大的,而且数据分散存储在多个节点上,因此需要采用缓存机制来进行优化。在HBase中,使用了一种叫做BlockCache的缓存机制。BlockCache是一个缓存组件,它缓存了HFile中的块(Block),并为读取请求提供服务。使用BlockCache可以有效地减少IO操作,提高HBase的查询性能。 3. 批量处理 在处理大规模数据时,HBase常常需要进行批量处理,以提高处理效率。HBase支持两种批量处理机制:一种是批量Get操作,另一种是批量Put和Delete操作。批量Get操作可以通过get(List<Get> gets)方法来实现,批量Put和Delete操作可以通过put(List<Put> puts)和delete(List<Delete> deletes)方法来实现。这些方法可以将多个操作同时提交到HBase中,以减少网络通信次数和IO操作,提高数据访问速度和性能。 综上所述,HBase扫描扫描缓存批量处理HBase开发中的重点难点之一。了解和掌握这些知识,可以帮助HBase开发人员更好地优化HBase的性能和提高数据处理效率。 ### 回答3: HBase是一个分布式的列式存储系统,它是建立在Hadoop上的,它的数据是按行存储的,同一行的数据存储在同一列族中,而且HBase还提供了扫描扫描缓存批量处理功能,可以更好地应对大规模数据的存储和查询。 首先,要讨论扫描功能。扫描是指在HBase中通过对一张进行遍历,扫描所需要的所有行数据信息。通过HBase提供的Scan API,可以实现对指定扫描,可以设置扫描的起始行、结束行、扫描列、过滤器等。Scan的过程就是在Region Server上进行的,当然一个region server可以同时扫描多个region。Scan操作返回一个ResultScanner对象,该对象可以迭代返回扫描到的每一行数据,这个扫描结果可以用来进行数据处理、数据统计等。 其次,说一下扫描缓存扫描缓存是指在HBase的Region Server上,扫描结果一般是一个KV数据对(Key-Value数据对,即键值对),这些扫描结果会被Region Server缓存在内存中,以便后续操作使用。而HBase中提供了一种扫描缓存设置,可以有效地控制Region Server上的缓存大小,避免内存占用过高,对性能有影响。HBase提供了两种类型的扫描缓存,分别是Client和Server端缓存。Client端缓存是通过设置Scan的 setCaching() 方法来控制,它是在客户端扫描时就在内存中缓存好的数据,在迭代扫描结果时,可以减少客户端向Region Server发送请求的次数,有效提高客户端的性能。而Server端缓存是通过设置Region Server的 Scanner 子模块中的 CacheBlocks 参数来控制,这个参数是示对HFile进行扫描时,是否在HFile中缓存数据块,也就是在RegionServer上缓存了KV数据对。 最后,要说一下批量处理批量处理是指在HBase中一次性处理多行数据的操作,可以在Region Server上执行。这个操作通过HBase提供的Batch API来实现,可以一次性操作多行数据。使用Batch API时,首先需要创建一个操作列,将所有需要修改的行键和对应的操作(如Put、Delete等)添加到列中,然后将列传递给Batch API进行处理。Batch API会将所有的操作封装成一次批处理,一次性向Region Server发送,达到批量处理的效果。批量处理可以大大提高数据处理的效率,尤其是在需要对大数据量进行修改时,可以减少网络带宽和IO资源的使用,提高系统吞吐量。 总之,HBase扫描扫描缓存以及批量处理功能,是对大规模数据存储和查询的重要支撑。通过使用这些功能,可以减少网络带宽和IO资源的使用,大大提高系统的性能,为企业的数据管理提供了便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值