分享

hbase数据删除不释放region解决办法

howtodown 2014-7-2 20:05:19 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 15 98649

问题导读:
1.删除hbase数据有几种方法?
2.删除数据,region不释放,你认为该如何解决?






以下是记录公司在删除历史数据的这个过程:
背景:
     公司需要需要一套运营平台,服务器3台(hadoop),怎么安装这里就不在讲解。

删除数据的驱动:
       由于说需要做数据挖掘,不让删除数据,就一直没有删除数据,总共10T产的占用了8-9T了,服务器天天报警,大半夜起来解决问题,真心受不了发火,就算需要做数据挖掘,也不需这样做啊,可以存加工的数据啊,也不会全部把数据存在,还有公司是不允许我们加服务器的抓狂。

删除数据过程:
      hbase删除数据,我也是新手,描述有问题的,希望大神给我指出。
      思路一:采用mapreduce来删除数据
      思路二:采用hbase shell来进行数据删除
      思路三:设置ttl

      不管以上哪种数据删除,最后都需要面临一个问题,那就是hbase region不释放的问题。


思路一:
     思路很简单,就是想采用mapreduce来多采用多个机器删除数据,结果是惨败,我们的有一个表数据很大,差不多3-4T,需要删除指定时间范围的数据,由于服务器的原因,内存不够,直接把服务器搞死了,后果严重啊,简单的代码如下:



  1. package com.mapbar.analyzelog.service.mapreduce;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import org.apache.hadoop.conf.Configuration;  
  8. import org.apache.hadoop.hbase.KeyValue;  
  9. import org.apache.hadoop.hbase.client.Delete;  
  10. import org.apache.hadoop.hbase.client.HTable;  
  11. import org.apache.hadoop.hbase.client.Result;  
  12. import org.apache.hadoop.hbase.client.Scan;  
  13. import org.apache.hadoop.hbase.io.ImmutableBytesWritable;  
  14. import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;  
  15. import org.apache.hadoop.hbase.mapreduce.TableMapper;  
  16. import org.apache.hadoop.hbase.util.Bytes;  
  17. import org.apache.hadoop.io.IntWritable;  
  18. import org.apache.hadoop.io.Text;  
  19. import org.apache.hadoop.mapreduce.Job;  
  20.   
  21. import com.mapbar.analyzelog.service.AbstractMapReduceJob;  
  22. import com.mapbar.analyzelog.service.jdbc.DBCounterReducer;  
  23. import com.mapbar.analyzelog.service.jdbc.JDBCMapReduceUtil;  
  24. /**
  25. *  
  26. *  
  27. * mapreduce删除hbase数据
  28. */  
  29. public class DeleteMapReducer extends AbstractMapReduceJob{  
  30.     /**
  31.      *  
  32.      *  
  33.      * delete的map函数
  34.      */  
  35.     public static class DeleteMapper extends TableMapper<Text, IntWritable>{  
  36.         protected void map(ImmutableBytesWritable row, Result value, Context context) throws IOException, InterruptedException {  
  37.             String tableName = context.getConfiguration().get("tableName");  
  38.             String flag = context.getConfiguration().get("flag");  
  39.             if("1".equals(flag)){  
  40.                 HTable htbl = new HTable(context.getConfiguration(), tableName);  
  41.                 List<Delete> lists = new ArrayList<Delete>();  
  42.                 for (KeyValue kv : value.raw()) {  
  43.                     Delete dlt = new Delete(kv.getRow());  
  44.                     dlt.deleteColumn(kv.getFamily(), kv.getQualifier(), kv.getTimestamp());  
  45.                     lists.add(dlt);  
  46.                     System.out.println("delete--tableL"+tableName+",rowkey:"+Bytes.toString(kv.getRow())+",family:"+Bytes.toString(kv.getFamily())+",qualifier:"+Bytes.toString(kv.getQualifier())+",timestamp:"+kv.getTimestamp());  
  47.                 }  
  48.                 htbl.delete(lists);  
  49.                 htbl.flushCommits();  
  50.                 htbl.close();  
  51.             }else{  
  52.                 System.out.println("delete--tableL"+tableName+"[失败,如果需要删除数据,请设置"flag"]");  
  53.   
  54.             }  
  55.         };  
  56.     }  
  57.   
  58.     /**
  59.      *  
  60.      *  
  61.      * delete的reduce函数(此接口主要是删除,reduce没有任何作用)
  62.      */  
  63.     public static class DeleteReducer extends DBCounterReducer<Text, IntWritable> {  
  64.         protected void reduce( Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {  
  65.         }  
  66.     };  
  67.   
  68.     /**
  69.      * 调用的入口方法
  70.      */  
  71.     public void run(Job job) throws IOException, InterruptedException, ClassNotFoundException {  
  72.         //删除的hbase表名称  
  73.         String tableName = getArguments().getStrTime("-table");  
  74.         //开始时间戳  
  75.         String timeStamp = getArguments().getStrTime("-stime");  
  76.         //结束时间戳  
  77.         String timeEtamp = getArguments().getStrTime("-etime");  
  78.         //是否进行删除的标识(1:删除,0不删除)  
  79.         String flag = getArguments().getStrTime("-flag");  
  80.         //重新设置变量到上下文配置  
  81.         Configuration config = job.getConfiguration();  
  82.         config.set("tableName", tableName);  
  83.         config.set("flag",flag);  
  84.         //查询的条件器  
  85.         Scan scan = new Scan();  
  86.         scan.setCaching(500);         
  87.         //不使用缓存  
  88.         scan.setCacheBlocks(false);   
  89.         scan.setTimeRange(Long.valueOf(timeStamp), Long.valueOf(timeEtamp));  
  90.         TableMapReduceUtil.initTableMapperJob(tableName, scan, DeleteMapper.class, Text.class, IntWritable.class,job);  
  91.         JDBCMapReduceUtil.initTableReducerJob("la_event_edrive_stat_result", new String[] { "date", "clnt","label" },  
  92.                 new String[] { "count" }, DeleteReducer.class, job);  
  93.         job.waitForCompletion(true);  
  94.     }  
  95. }  
复制代码

思路二:
     有mapreduce来进行删除删除数据,一旦任务执行了,发现服务器报警都停不下来,后来采用hbase shell,直接与数据文件打交道,我们的思路是,监控tps,当执行我的删除数据说话,监控tps,发现tps高于某个值,直接暂停进程,不浪费资源。
     大体步骤:
            1:先采用shell 脚本scan数据,将rowkey记录到文件。
            2:然后调用deleteall 删除rowkey
     感受:
           执行还不错,就是删除的太慢,删除的还没有新增的快,这样熬不住啊。就像有一座金山,想一勺子一勺子的去拿走。
           也算失败告终吧!!!

思路三:
就是直接设置ttl,这个就需要disable表,需要丢数据,实在是没有办法了,然后设置了ttl


  1. 1:disable "table"  
  2. 2:alter 'table' , {NAME=>'la',TTL=>'15768000'}   
  3. 3:enable "table"  
复制代码

然后日志就一直刷屏,在合并,更新。删除数据文件。
疑问:执行以上三条命令,时间差不多3分钟,就恢复了,但是后日志一直在合并,我查询了下数据,数据也正常记录,但是查询报错“region not online”,region还在合并呗。就是说影响数据就影响了几分钟,hdfs的数据在慢慢的删除,大概执行了6小时,删除了完毕,服务器恢复正常。



最严重的一个问题:
       hbase不释放region,把数据删除了,region还不释放,那在分析的时候,很消耗内存。
       思路:删除hdfs regionID、删除meta表的region指向.

删除hdfs


  1. #!/bin/sh  
  2. if [ $# -lt 3 ] ; then  
  3.     echo "please input 3 parameter[file_name_path、hadoop_path、input_path]"  
  4.     exit  
  5. else  
  6.     cat $1 | while read row  
  7.     do  
  8.         regionpath=`echo "$row" | awk -F '.' '{print $2}'`  
  9.         table=`echo "$row" | awk -F ',' '{print $1}'`  
  10.         #删除hdfs的region  
  11.         if [ -z $table ] ; then  
  12.            echo "table is null"  
  13.            exit;  
  14.         fi  
  15.   
  16.         if [ -z $regionpath ] ; then  
  17.            echo "regionpath is null"  
  18.            exit;  
  19.         fi  
  20.   
  21.         cd $2  
  22.         ./hadoop fs -rmr  /hbase/$table/$regionpath  
  23.         #删除meta表的region  
  24.         echo "deleteall '.META.','$row'">>$3  
  25.         echo "$regionpath"  
  26.     done  
  27. fi  
复制代码

删除meta

  1. #!/bin/sh  
  2. if [ $# -lt 2 ] ; then  
  3.     echo "please input 2 parameter[hbase_path、file_path]"  
  4.     exit  
  5. else  
  6.     if [ -z $1 ] ; then  
  7.         echo " hbase_path is null!!!"  
  8.         exit  
  9.     fi  
  10.   
  11.     if [ -z $2 ] ; then  
  12.         echo " file_path is null!!!"  
  13.         exit  
  14.     fi  
  15.     cd $1  
  16.     ./hbase shell< $2  
  17. fi  
  18. ~                  
复制代码









已有(15)人评论

跳转到指定楼层
howtodown 发表于 2014-7-2 20:06:28
这里补充一些相关内容:

删除hbase表region块脚本

  1. 文件hua.txt格式:
  2. CHAT_INFO,1318153079100530000314050,1318173760068.991ca04ff164c3f7987a9d93e0f744f5.
  3. CHAT_INFO,1318156265075530000260366,1318173760068.2e9ac5a34869209f95ab46bf72061fd6.
  4. CHAT_INFO,1318158690100530000063285,1318176690151.dfe4ec67087d58daa1d15e014fa3bbf0.
  5. deleteregioninmeta.sh删除hdfs的region以及.META.表中的region信息,内容如下:
  6. !#/bin/bash
  7. while read line
  8. do
  9. #        echo "$line"
  10. regionpath=/hbase/$1/`echo "$line" | awk -F '.' '{print $2}'`
  11. echo "$regionpath"
  12. hadoop fs -mv  $regionpath /hua/chat_info_bak
  13. echo "deleteall '.META.','$line'" | hbase shell
  14. done < $2
  15. 执行命令:sh deleteregioninmeta.sh CHAT_INFO  /home/hadoop/hua/hua.txt
复制代码



回复

使用道具 举报

x5136160 发表于 2014-7-15 20:18:34
很好很好,了解了解。。。
回复

使用道具 举报

ohano_javaee 发表于 2014-10-18 12:08:46
又一次走心~
回复

使用道具 举报

wubaozhou 发表于 2015-1-1 21:40:35
回复

使用道具 举报

cochou 发表于 2015-4-12 21:48:08
回复

使用道具 举报

cochou 发表于 2015-4-12 21:48:57
回复

使用道具 举报

cochou 发表于 2015-4-12 21:54:30
回复

使用道具 举报

cochou 发表于 2015-4-12 22:01:41
回复

使用道具 举报

xiangyuwen 发表于 2015-5-6 11:28:41
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条