Подтвердить что ты не робот

Как массировать несколько строк в hbase?

У меня есть следующие строки с этими ключами в таблице hbase "mytable"

user_1
user_2
user_3
...
user_9999999

Я хочу использовать оболочку Hbase для удаления строк из:

user_500 пользователю_900

Я знаю, что нет способа удалить, но есть ли способ использовать "BulkDeleteProcessor" для этого?

Я вижу здесь:

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

Я хочу просто вставить импорт, а затем вставить его в оболочку, но не знаю, как это сделать. Кто-нибудь знает, как я могу использовать эту конечную точку из оболочки jruby hbase?

   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 или альтернативный способ быстрого удаления нескольких строк в порядке.

4b9b3361

Ответ 1

Вы действительно хотите сделать это в оболочке, потому что есть другие другие способы. Один из способов - использовать собственный API Java

  • Построить список удалений элементов массива
  • передать этот список массивов методу Table.delete

Способ 1: если вы уже знаете диапазон клавиш.

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);
        }
    }
}

Способ 2. Если вы хотите выполнить пакетное удаление на основе результата сканирования.

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);

    }
}

Теперь перейдем к использованию CoProcessor. только один совет: "НЕ ИСПОЛЬЗУЙТЕ CoProcessor", если вы не являетесь экспертом в HBase. У CoProcessors есть много встроенных проблем, если вам нужно, я могу предоставить вам подробное описание. Во-вторых, когда вы удаляете что-либо из 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);

Ответ 2

Если вы уже знаете строки строк записей, которые хотите удалить из таблицы HBase, вы можете использовать следующий подход

1. Сначала создайте объекты List с этими rowkeys

for (int rowKey = 1; rowKey <= 10; rowKey++) {
    deleteList.add(new Delete(Bytes.toBytes(rowKey + "")));
}

2. Затем получите объект Table с помощью HBase Connection

Table table = connection.getTable(TableName.valueOf(tableName));

3. Когда у вас есть вызов объекта таблицы delete(), передав список

table.delete(deleteList);

Полный код будет выглядеть ниже

Configuration config = HBaseConfiguration.create();
config.addResource(new Path("/etc/hbase/conf/hbase-site.xml"));
config.addResource(new Path("/etc/hadoop/conf/core-site.xml"));

String tableName = "users";

Connection connection = ConnectionFactory.createConnection(config);
Table table = connection.getTable(TableName.valueOf(tableName));

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

for (int rowKey = 500; rowKey <= 900; rowKey++) {
    deleteList.add(new Delete(Bytes.toBytes("user_" + rowKey)));
}

table.delete(deleteList);