web-dev-qa-db-fra.com

Comment supprimer plusieurs lignes en masse dans hbase?

J'ai les lignes suivantes avec ces clés dans la table hbase "mytable"

user_1
user_2
user_3
...
user_9999999

Je souhaite utiliser le shell Hbase pour supprimer des lignes de:

user_500 à user_900

Je sais qu'il n'y a aucun moyen de supprimer, mais existe-t-il un moyen d'utiliser le "BulkDeleteProcessor" pour ce faire?

Je vois ici:

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

Je veux simplement coller les importations, puis coller cela dans le shell, mais je n'ai aucune idée de la façon de procéder. Est-ce que quelqu'un sait comment utiliser ce point de terminaison à partir du shell 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();

S'il n'existe aucun moyen de le faire via JRuby, Java ou un autre moyen de supprimer rapidement plusieurs lignes est correct.

24
Rolando

Voulez-vous vraiment le faire dans Shell, car il existe de nombreuses autres méthodes. L’une des méthodes consiste à utiliser l’API native Java

  • Construire une liste de suppressions
  • passer cette liste de tableaux à la méthode Table.delete

Méthode 1: si vous connaissez déjà la plage de clés.

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

Méthode 2: si vous souhaitez effectuer une suppression par lots sur la base d'un résultat d'analyse.

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

    }
}

En ce qui concerne maintenant l'utilisation d'un CoProcessor. un seul conseil, 'N'UTILISEZ PAS CoProcessor' à moins que vous ne soyez un expert en HBase. Les coprocesseurs ont de nombreux problèmes intégrés si vous en avez besoin, je peux vous fournir une description détaillée. Deuxièmement, lorsque vous supprimez quoi que ce soit de HBase, il n'est jamais directement supprimé de Hbase, un marqueur tombstone est attaché à cet enregistrement et plus tard lors d'un compactage majeur, il est supprimé, donc pas besoin d'utiliser un coprocesseur qui est très exhaustif en ressources.

Code modifié pour prendre en charge le fonctionnement par lots.

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

Création de HBase conf et obtention d'une instance de table.

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

Si vous connaissez déjà les clés de ligne des enregistrements que vous souhaitez supprimer de la table HBase, vous pouvez utiliser l'approche suivante

1. Créez d'abord une liste d'objets avec ces touches de ligne

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

2.Obtenez ensuite l'objet Table à l'aide de HBase Connection

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

3.Une fois que vous avez appelé l'objet table supprimer () en passant la liste

table.delete(deleteList);

Le code complet ressemblera à ci-dessous

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);
4
Prasad Khode