最近在做將kafka里面的業務日志寫入到hbase 當中,然后要對hbase 里面的數據進行解析然后插入到數據庫當中。
為了能節約磁盤空間想對hbase里面的數據進行刪除,但是我們設置的rowkey是按照每小時 加日期 然后加hash碼的方式組成的。例子如下:
這個地方我們沒有辦法通過框定一個時間范圍對這個rowkey 進行刪除。所以我想了一個辦法。
(1)我們可以從外面傳入2個參數 一個是起始日期 ,一個是結束日期,然后把里面的每個小時的rowkey通過rowkey 前綴過濾的形式將數據拿出來 然后塞入到一個文件當中
然后最后對這個文件進行批量刪除。我的腳本如下:
#!/bin/bash tablename=$1 startrow=$2 endrow=$3 if [ $# -eq 0 ];then echo "請輸入表名,startRow,endRow,日期的格式如下2017-04-04" exit 0 fi beg_s=`date -d "$startrow" +%s` end_s=`date -d "$endrow" +%s` rowkey="" while [ "$beg_s" -le "$end_s" ];do day=`date -d @$beg_s +"%Y%m%d"`; echo "當前日期:$day" for((i=0;i<24;i++)) do if [ ${#i} -eq 1 ];then rowkey="0"$i"|"$day echo $rowkey echo "scan '${tablename}',{ROWPREFIXFILTER => '${rowkey}'}" |hbase shell|awk -F ' ' '{print $1'\t'}'> ./file.txt #刪除前6行非表中數據 sed -i '1,6d' file.txt #刪除最后一行(空行) sed -i '$d' file.txt #刪除最后一行(總條數) sed -i '$d' file.txt cat ./file.txt|awk '{print $1}'|while read rowvalue do echo -e "deleteall '${tablename}','${rowvalue}'" >> ./deleteRowFile.txt done rm ./file.txt else rowkey=$i"|"$day echo $rowkey echo "scan '${tablename}',{ROWPREFIXFILTER => '${rowkey}'}" |hbase shell|awk -F ' ' '{print $1'\t'}'> ./file.txt #刪除前6行非表中數據 sed -i '1,6d' file.txt #刪除最后一行(空行) sed -i '$d' file.txt #刪除最后一行(總條數) sed -i '$d' file.txt cat ./file.txt|awk '{print $1}'|while read rowvalue do echo -e "deleteall '${tablename}','${rowvalue}'" >> ./deleteRowFile.txt done rm ./file.txt fi done beg_s=$((beg_s+86400)); done echo "exit" >> ./deleteRowFile.txt
#為避免線上執行失誤 ,先檢查deleteRowFile.txt中要刪除的rowkey是否正確,所以以下兩行命令請手動執行
#hbase shell ./deleteRowFile.txt
#rm ./deleteRowFile.txt
這里需要傳入3個參數 分別是hbase 的表名稱,然后起始時間,結束時間就可以將數據塞入到一個文件當中 最后塞入文件的形式如下
為了防止數據刪除錯誤,我們先檢查 一下刪除的是否正確,然后執行
hbase shell ./deleteRowFile.txt
最后將這個文件刪除掉。
借鑒博客:https://blog.csdn.net/nyistzp/article/details/76922512?utm_source=blogkpcl9