hbaseテーブルの内容の削除について
2870 ワード
hbaseという機能は憂鬱で、与えられたAPIを使ってテーブルのいくつかの内容を削除します.
実行しても成功したが、hbaseの下の.META.テーブルを見ていると、削除されたデータ情報が記録された新しいhistorianファイルが見つかり、HDFSのデータを見ても削除されていないことが分かった.ただし、hbaseを使用してrowkeyをクエリーする場合、クエリーはできません.APIを表示すると、delete操作はhbaseのこれらのデータの記録を削除しただけで、hdfs上のファイルは削除されませんでした.どのように徹底的に削除するかについて、私は研究しています.何か資料があれば、私に共有してください.感謝に堪えません.
問題が解決しました
hbaseの削除操作は、直ちに実際のデータを削除するのではなく、compactionが発生したときに実際にデータを削除します.getやscan操作を実行するとき、hbaseは実際にデータを取り出してrowに削除操作があるかどうかを見て、これらの操作を統合した後、削除されたデータは、HDFS上にはまだ存在しますが、実際にはgetできません.compactionの後、これらのデータは完全に消えます.
public class testDelete extends TestCase {
public static void main(String[] args){
testDelete test = new testDelete();
try {
test.delete();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void delete() throws Exception {
ResultScanner rs = this.QueryMailByCaseNum("1303002");
if (rs != null) {
DeleteData delete = new DeleteData();
delete.delete("mail_tab", rs);
}
}
public ResultScanner QueryMailByCaseNum(String casenum) throws Exception {
Query _query = new Query();
// logger.info("query emails:"+casenum);
List<EMail> list = new ArrayList<EMail>();
ResultScanner rs = null;
List<Filter> filters = new ArrayList<Filter>();
filters.add(new PrefixFilter(Bytes.toBytes(casenum)));
Filter filter = new FilterList(FilterList.Operator.MUST_PASS_ALL,
filters);
//
List<String> familys = new ArrayList<String>();
familys.add("property");
rs = _query.getByFilter("mail_tab", filter, familys);
if (rs == null) {
return null;
}
return rs;
/**
*
* @param tablename
* @param scanner
* @return
* @throws Exception
*/
public boolean delete(String tablename,ResultScanner scanner) throws Exception
{
boolean r = true;
HTable table = new HTable(HBaseConnection.connection,tablename);
Iterator<Result> it = scanner.iterator();
try
{
while (it.hasNext()) {
Result result = it.next();
Delete delete = new Delete(result.getRow());
table.delete(delete);
table.flushCommits();
}
}
catch(Exception ex)
{
r = false;
_error = ex.getMessage();
}
finally
{
table.close();
}
return r;
} }
実行しても成功したが、hbaseの下の.META.テーブルを見ていると、削除されたデータ情報が記録された新しいhistorianファイルが見つかり、HDFSのデータを見ても削除されていないことが分かった.ただし、hbaseを使用してrowkeyをクエリーする場合、クエリーはできません.APIを表示すると、delete操作はhbaseのこれらのデータの記録を削除しただけで、hdfs上のファイルは削除されませんでした.どのように徹底的に削除するかについて、私は研究しています.何か資料があれば、私に共有してください.感謝に堪えません.
問題が解決しました
hbaseの削除操作は、直ちに実際のデータを削除するのではなく、compactionが発生したときに実際にデータを削除します.getやscan操作を実行するとき、hbaseは実際にデータを取り出してrowに削除操作があるかどうかを見て、これらの操作を統合した後、削除されたデータは、HDFS上にはまだ存在しますが、実際にはgetできません.compactionの後、これらのデータは完全に消えます.