删除数据的驱动:
       由于说需要做数据挖掘,不让删除数据,就一直没有删除数据,总共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.  ~


复制代码