2015-09-16 3 views
21

У меня есть следующие строки с этими ключами в Hbase таблице «туЬаЫе»Как массировать несколько строк в hbase?

user_1 
user_2 
user_3 
... 
user_9999999 

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

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

Я хочу, чтобы просто вставить импорта, а затем вставьте его в оболочку, но не имеют ни малейшего представления, как идти об этом. Кто-нибудь знает, как я могу использовать эту конечную точку из оболочки 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 или альтернативный способ для быстрого удаления нескольких строк хорошо.

+2

Просто любопытно, как это рубин, как отмечено? – lcguida

+1

Удалённый флаг, это больше jruby. – Rolando

ответ

15

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

  • Построить список массива из удалений
  • пасса этого списка массива метода 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); 
+0

Для обоих решений, если у вас очень большое количество строк для удаления, вы должны учитывать размер кучи, так как у нас может быть много объектов Delete. (возможно, выполнение удалений пакетами) –

+0

Да, конечно, это можно сделать очень просто, просто нужно еще один цикл для создания пакета и удаления огня. –

+0

Да, это можно сделать очень легко с помощью еще одного цикла для создания пакетов требуемого размера. Если вы предлагаете использовать метод вызова HBase (List ), это будет немного быстрее, но это не поможет в минимизации или превышении использования кучи. Для этого вам нужно создать еще один цикл для цикла –

4

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

1.First создать список объектов с этими rowkeys

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

2.Тогда получите объект таблицы с помощью Hbase Connection

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

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

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); 
Смежные вопросы