java - 如何批量删除hbase中的多行?

标签 java hbase jruby

我在 hbase 表“mytable”中有以下带有这些键的行

user_1
user_2
user_3
...
user_9999999

我想使用 Hbase shell 从以下位置删除行:

user_500 到 user_900

我知道没有办法删除,但有没有办法可以使用“BulkDeleteProcessor”来做到这一点?

我看到这里:

https://github.com/apache/hbase/blob/master/hbase-examples/src/test/java/org/apache/hadoop/hbase/coprocessor/example/TestBulkDeleteProtocol.java

我只想粘贴导入,然后将其粘贴到 shell 中,但不知道该怎么做。有谁知道我如何从 jruby hbase shell 使用这个端点?

   Table ht = TEST_UTIL.getConnection().getTable("my_table");
    long noOfDeletedRows = 0L;
    Batch.Call<BulkDeleteService, BulkDeleteResponse> callable =
      new Batch.Call<BulkDeleteService, BulkDeleteResponse>() {
      ServerRpcController controller = new ServerRpcController();
      BlockingRpcCallback<BulkDeleteResponse> rpcCallback =
        new BlockingRpcCallback<BulkDeleteResponse>();

      public BulkDeleteResponse call(BulkDeleteService service) throws IOException {
        Builder builder = BulkDeleteRequest.newBuilder();
        builder.setScan(ProtobufUtil.toScan(scan));
        builder.setDeleteType(deleteType);
        builder.setRowBatchSize(rowBatchSize);
        if (timeStamp != null) {
          builder.setTimestamp(timeStamp);
        }
        service.delete(controller, builder.build(), rpcCallback);
        return rpcCallback.get();
      }
    };
    Map<byte[], BulkDeleteResponse> result = ht.coprocessorService(BulkDeleteService.class, scan
        .getStartRow(), scan.getStopRow(), callable);
    for (BulkDeleteResponse response : result.values()) {
      noOfDeletedRows += response.getRowsDeleted();
    }
    ht.close();

如果没有办法通过 JRuby、Java 或其他方式快速删除多行也可以。

最佳答案

您是否真的想在 shell 中执行此操作,因为还有其他各种更好的方法。一种方法是使用 native java API

  • 构造一个删除数组列表
  • 将此数组列表传递给 Table.delete 方法

方法一:如果你已经知道键的范围。

public void massDelete(byte[] tableName) throws IOException {
    HTable table=(HTable)hbasePool.getTable(tableName);

    String tablePrefix = "user_";
    int startRange = 500;
    int endRange = 999;

    List<Delete> listOfBatchDelete = new ArrayList<Delete>();

    for(int i=startRange;i<=endRange;i++){
        String key = tablePrefix+i; 
        Delete d=new Delete(Bytes.toBytes(key));
        listOfBatchDelete.add(d);  
    }

    try {
        table.delete(listOfBatchDelete);
    } finally {
        if (hbasePool != null && table != null) {
            hbasePool.putTable(table);
        }
    }
}

方法二:根据扫描结果批量删除。

public bulkDelete(final HTable table) throws IOException {
    Scan s=new Scan();
    List<Delete> listOfBatchDelete = new ArrayList<Delete>();
    //add your filters to the scanner
    s.addFilter();
    ResultScanner scanner=table.getScanner(s);
    for (Result rr : scanner) {
        Delete d=new Delete(rr.getRow());
        listOfBatchDelete.add(d);
    }
    try {
        table.delete(listOfBatchDelete);
    } catch (Exception e) {
        LOGGER.log(e);

    }
}

现在开始使用协处理器。只有一个建议,“不要使用协处理器”,除非您是 HBase 专家。 如果您需要,协处理器有许多内置问题,我可以为您提供详细说明。 其次,当您从 HBase 中删除任何内容时,它永远不会直接从 Hbase 中删除,墓碑标记会附加到该记录,然后在主要压缩期间它会被删除,因此无需使用资源消耗量很大的协处理器。

修改代码以支持批处理操作。

int batchSize = 50;
int batchCounter=0;
for(int i=startRange;i<=endRange;i++){

String key = tablePrefix+i;
Delete d=new Delete(Bytes.toBytes(key));
listOfBatchDelete.add(d);  
batchCounter++;

if(batchCounter==batchSize){
    try {
        table.delete(listOfBatchDelete);
        listOfBatchDelete.clear();
        batchCounter=0;
    }
}}

创建 HBase conf 并获取表实例。

Configuration hConf = HBaseConfiguration.create(conf);
hConf.set("hbase.zookeeper.quorum", "Zookeeper IP");
hConf.set("hbase.zookeeper.property.clientPort", ZookeeperPort);

HTable hTable = new HTable(hConf, tableName);

关于java - 如何批量删除hbase中的多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598003/

相关文章:

java - 为什么 compareTo() 中的参数不接受类名而只接受对象?

java - 改善直方图

java - java中的DateFormat给出了意想不到的结果

java - 具有独立 hbase 的 spring hbase 示例

java - Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

java - 将对象类型强制转换为 java 中用户定义的 POJO

hadoop - 我正在CDH5.4上使用Hbase 1.0.0和Apache phoenix 4.3.0。当我重新启动Hbase regionserver时关闭

Ruby 无符号右移运算符

java - 从 Jruby 中的 Jar 文件访问枚举

java - HBase Java客户端无法访问远程HBase区域服务器