如何批量删除hbase中的多行?
How to mass delete multiple rows in hbase?
我在 hbase table "mytable"
中有以下带有这些键的行
user_1
user_2
user_3
...
user_9999999
我想使用 Hbase shell 从以下位置删除行:
user_500 到 user_900
我知道没有办法删除,但是有什么方法可以使用 "BulkDeleteProcessor" 来删除吗?
我看到这里:
我只想粘贴导入,然后将其粘贴到 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 中这样做吗,因为还有其他各种更好的方法。一种方法是使用本机 java API
- 构建删除数组列表
- 将此数组列表传递给 Table.delete 方法
方法一:如果你已经知道key的范围
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);
}
}
现在开始使用协处理器。只有一个建议,“不要使用 CoProcessor”,除非你是 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 并获取 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);
如果您已经知道要从 HBase 中删除的记录的行键 table 那么您可以使用以下方法
1.First 使用这些行键创建一个列表对象
for (int rowKey = 1; rowKey <= 10; rowKey++) {
deleteList.add(new Delete(Bytes.toBytes(rowKey + "")));
}
2.Then 使用 HBase Connection
获取 Table 对象
Table table = connection.getTable(TableName.valueOf(tableName));
3.Once 您有 table 对象通过传递列表
调用 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);
我在 hbase table "mytable"
中有以下带有这些键的行user_1
user_2
user_3
...
user_9999999
我想使用 Hbase shell 从以下位置删除行:
user_500 到 user_900
我知道没有办法删除,但是有什么方法可以使用 "BulkDeleteProcessor" 来删除吗?
我看到这里:
我只想粘贴导入,然后将其粘贴到 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 中这样做吗,因为还有其他各种更好的方法。一种方法是使用本机 java API
- 构建删除数组列表
- 将此数组列表传递给 Table.delete 方法
方法一:如果你已经知道key的范围
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);
}
}
现在开始使用协处理器。只有一个建议,“不要使用 CoProcessor”,除非你是 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 并获取 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);
如果您已经知道要从 HBase 中删除的记录的行键 table 那么您可以使用以下方法
1.First 使用这些行键创建一个列表对象
for (int rowKey = 1; rowKey <= 10; rowKey++) {
deleteList.add(new Delete(Bytes.toBytes(rowKey + "")));
}
2.Then 使用 HBase Connection
获取 Table 对象Table table = connection.getTable(TableName.valueOf(tableName));
3.Once 您有 table 对象通过传递列表
调用 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);