Ответ 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);