目录
Hive备份:
1.main脚本:
#!/bin/bash
#生成昨天的日期,用作备份的文件名
YMD=`date -d yesterday +%Y%m%d`
#日志存储地址
log_dir=/home/hdfs/lyg/bak_hive_sh/logs/backup.logs
#备份文件存储地址
bakFile=/home/hdfs/lyg/bak_hive_sh/bakFile
echo `date` >> $log_dir
#定义一些其他临时文件地址
tempFile=/home/hdfs/lyg/bak_hive_sh/tmp/temp.txt
tableFile=/home/hdfs/lyg/bak_hive_sh/tmp/tables.txt
databaseFile=/home/hdfs/lyg/bak_hive_sh/tmp/databases.txt
function init (){
echo "" > $tableFile
echo "" > $databaseFile
}
init
#拿到所有数据库
hive -e "show databases ;" > $tempFile
#进行数据库过滤,下面是过滤掉了default和tmp以及名称为空格的数据库
grep -Ev "default|tmp|^$" $tempFile > $databaseFile
#拼接show tables in aDatabases;语句,然后再拼接show create table aTable;进临时文件
for k_id in `cat $databaseFile`;do
echo $k_id
#echo $k_id > $tableFile
#hive -e "show tables in $k_id like 'tmp_*'" ; >> $tableFile
hive -e "show tables in $k_id ;" | while read line
do
#echo ${#line}
#if [ ${#line} -eq 36 ];then
#echo "show create table $k_id"."'\`'$line'\`' ;" >> $tableFile
echo "show create table \`$k_id\`"."\`$line\` ;" >> $tableFile
#fi
done
#hive -e "desc $k_id ;" > $
done
#批量执行show create 语句,入备份文档
hive -f $tableFile > $bakFile'/'$YMD
#获得备份文件中的最大文件数量
#total_file_num=`ls -l $bakFile | grep "^-" | wc -l`
#如果文件数量大于6个,将文件按时间排序,然后删除最早的那一个
#if [[ $total_file_num > 6 ]];then
# filename=`ls -ltr $bakFile | grep -v 'total' | grep "^-" | awk '{print $9}' | head -n 1`
# rm -rf $bakFile/$filename
#fi
2.目录结构:
[hdfs@sdc1 bak_hive_sh]$ pwd
/home/hdfs/lyg/bak_hive_sh
[hdfs@sdc1 bak_hive_sh]$ tree
├── bakFile
│ ├── 20211013
│ ├── 20211014
│ ├── 20211015
│ ├── 20211016
│ ├── 20211017
│ └── 20211018
├── logs
│ └── backup.logs
├── main.sh
└── tmp
├── databases.txt
├── tables.txt
└── temp.txt
3.设置crontab:
每天22点49分执行脚本:
49 22 * * * sh /home/hdfs/lyg/bak_hive_sh/main.sh
数据统计:
数据统计是基于Hive那天的表结构的,前提是,你的hive库进行了analysis,不然是不准确的。
1.初处理备份文本:
cat 20210905 | grep -E "CREATE TABLE|numRows|rawDataSize|totalSize" > aa.txt
cat aa.txt | sed 's/[(,`]//g' |sed ":a;N;s/\n//g;ta" | sed 's/CREATE TABLE /\n/g' | sed "s/'//g" | sed 's/\s//g' | sed 's/numRows=/\t/g' | sed 's/rawDataSize=/\t/g' | sed 's/totalSize=/\t/' > res.txt
2.1ETL处理第一步的文件:
文本文件输入:
Excel输出:
2.2附:统计Mysql表信息:
SELECT
CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) as tableName,
CAST(TABLE_ROWS as CHAR) as numRows,
CAST(DATA_LENGTH as CHAR) as rawDataSize ,
CAST(DATA_LENGTH+INDEX_LENGTH as CHAR) as totalSize
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA in ('dzzz','rk')
3.根据具体需求使用Excel做vlookup:
根据具体需求匹配等。