hive表元数据修复脚本

背景:由于历史问题,之前有些业务使用hive表数据,直接通过脚本将表数据目录整体移走,导致元数据一直存在,随着时间增长,impala每次写入数据后,刷新元数据,随着元数据越来越多,加载catalog的内存就会oom,之前历史任务都是连接在同一台的impala上,连接impala执行刷新分区的连接线程一直closdwait,链接不中断,导致连接数越来越多,不释放,任务资源不释放,集群资源占满,任务都在pending,通过执行drop partition命令会报错分区目录不存在,针对这些历史表,在之前移动完分区后,同时执行下面删除元数据脚本可以避免元数据过大的问题

查看所有表分区总数命令

powershell 复制代码
 select  count(*) sum ,TBL_NAME  FROM PARTITION_PARAMS par_params join 
	 (
	 select 
     par.PART_ID,
	 TBL_NAME
     FROM 
	 TBLS tbl join PARTITIONS par on tbl.tbl_id = par.tbl_id 
	 ) t on par_params.PART_ID=t.PART_ID group by   TBL_NAME order by sum desc 
powershell 复制代码
#!/bin/bash
set -e  # 开启"出错即退出"模式(可选,增强安全性)

# -------------------------- 1. 交互式输入 --------------------------
# 静默输入MySQL密码(安全,不显示在终端)
read -s -p "请输入Hive元数据库(hive)的密码: " MYSQL_PASS
echo  # 换行
 

# 输入要删除的分区day值(如:20231218,对应PART_NAME中的day=20231218)
read -p "请输入要删除的分区day值(会删除PART_NAME包含'day=$DAY'的记录): " DAY
[ -z "$DAY" ] && { echo "错误:DAY不能为空!"; exit 1; }

# 输入目标表名(如:ads.dec_g_cdr )
read -p "请输入要操作的Hive表名(格式:库名.表名): " TABLE_NAME
[ -z "$TABLE_NAME" ] && { echo "错误:TABLE_NAME不能为空!"; exit 1; }

# -------------------------- 2. MySQL基础配置 --------------------------
MYSQL_HOST="localhost"    # Hive元数据库地址(如远程:192.168.1.100)
MYSQL_PORT="3306"         # 端口(默认3306)
MYSQL_USER="root"    # 元数据库用户名(如:hive)
MYSQL_DB="hive"           # 元数据库名(默认hive)

# -------------------------- 3. 创建备份目录(带时间戳) --------------------------
BACKUP_DIR="bak_meta_$(date +%Y%m%d_%H%M%S)"  # 备份目录名(如:bak_meta_20240520_143000)
mkdir -p "$BACKUP_DIR" || { echo "错误:无法创建备份目录!"; exit 1; }
echo "✅ 备份目录创建成功:$BACKUP_DIR"

# -------------------------- 4. 备份相关元数据(关键!) --------------------------
echo "📦 开始备份元数据..."

# 备份PARTITION_PARAMS表(目标表的所有记录)
mysqldump -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASS" \
  "$MYSQL_DB" PARTITION_PARAMS  > "$BACKUP_DIR/PARTITION_PARAMS_backup.sql" || { echo "错误:备份PARTITION_PARAMS失败!"; exit 1; }

# 备份PARTITIONS表(目标表+指定day的分区)
mysqldump -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASS" \
  "$MYSQL_DB" PARTITIONS \
  > "$BACKUP_DIR/PARTITIONS_backup.sql" || { echo "错误:备份PARTITIONS失败!"; exit 1; }

# 备份PARTITION_KEY_VALS表(目标分区关联的存储描述)
mysqldump -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASS" \
  "$MYSQL_DB" PARTITION_KEY_VALS \
  > "$BACKUP_DIR/PART_ID_backup.sql" || { echo "错误:备份SDS失败!"; exit 1; }

echo "✅ 元数据备份完成!"

# -------------------------- 5. 执行删除操作 --------------------------
echo "⚠️ 开始删除元数据(不可逆,请确认备份成功!)..."
 

# 1. 删除PARTITION_PARAMS(子表,先删)
DELETE_PARTITION_PARAMS="DELETE FROM PARTITION_PARAMS WHERE PART_ID IN (SELECT par.PART_ID FROM TBLS tbl JOIN PARTITIONS par ON tbl.tbl_id = par.tbl_id WHERE par.PART_NAME LIKE \"%day=$DAY%\" AND tbl.TBL_NAME = \"$TABLE_NAME\");"
mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASS" "$MYSQL_DB" -e "$DELETE_PARTITION_PARAMS" || { echo "错误:删除PARTITION_PARAMS失败!"; exit 1; }
echo "✅ PARTITION_PARAMS删除成功!"

# 2. 删除PARTITION_KEY_VALS(子表,再删)
DELETE_PARTITION_KEY_VALS="DELETE FROM PARTITION_KEY_VALS WHERE PART_ID IN (SELECT par.PART_ID FROM TBLS tbl JOIN PARTITIONS par ON tbl.tbl_id = par.tbl_id WHERE par.PART_NAME LIKE \"%day=$DAY%\" AND tbl.TBL_NAME = \"$TABLE_NAME\");"
echo "开始执行 ${DELETE_PARTITION_KEY_VALS}"
mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASS" "$MYSQL_DB" -e "$DELETE_PARTITION_KEY_VALS" || { echo "错误:删除PARTITION_KEY_VALS失败!"; exit 1; }
echo "✅ PARTITION_KEY_VALS删除成功!"

# 3. 删除PARTITIONS(父表,最后删)
DELETE_PAR="DELETE FROM PARTITIONS WHERE tbl_id IN (SELECT tbl_id FROM TBLS WHERE TBL_NAME = \"$TABLE_NAME\") AND PART_NAME LIKE \"%day=$DAY%\";"
echo "开始执行 ${DELETE_PAR}"
mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASS" "$MYSQL_DB" -e "$DELETE_PAR" || { echo "错误:删除PARTITIONS失败!"; exit 1; }
echo "✅ PARTITIONS删除成功!"



# -------------------------- 6. 收尾提示 --------------------------
echo "🎉 所有操作完成!"
echo "💾 备份数据保留在:$BACKUP_DIR(如需清理,请手动删除)"
相关推荐
B站计算机毕业设计超人4 天前
计算机毕业设计Django+Vue.js高考推荐系统 高考可视化 大数据毕业设计(源码+LW文档+PPT+详细讲解)
大数据·vue.js·hadoop·django·毕业设计·课程设计·推荐算法
B站计算机毕业设计超人4 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
十月南城4 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
王九思4 天前
Hive Thrift Server 介绍
数据仓库·hive·hadoop
土拨鼠烧电路4 天前
笔记11:数据中台:不是数据仓库,是业务能力复用的引擎
数据仓库·笔记
Asher05095 天前
Hive核心知识:从基础到实战全解析
数据仓库·hive·hadoop
xhaoDream5 天前
Hive3.1.3 配置 Tez 引擎
大数据·hive·tez
yumgpkpm5 天前
AI视频生成:Wan 2.2(阿里通义万相)在华为昇腾下的部署?
人工智能·hadoop·elasticsearch·zookeeper·flink·kafka·cloudera
Asher05095 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式