Hive-定时清理无用的临时表

背景:

有一个临时库,大家平时开发过程中比较常用,这个库的表的生命周期没有得到很好的管理,日积月累导致无用表增多,所以跟运维提了个方案,定期清理。提出了一个比较简单的方案。

解决方案:

show u the code

表规范如下

表名称:temp_xxxx(邮箱前缀)_xxxxx(自由发挥,不建议太长)_expyyyyMMdd(过期日期20241126)

清理规则如下

  1. 不符合上述规范的表直接清理或者rename
  2. 超过表的过期时间的清理或者rename

实现方案:

方案一:

这个版本的属于最常规的思路,如果清理的无用表较多的时候可能性能会稍微低些。

bash 复制代码
#!/bin/bash

# Hive 配置
HIVE_DB="cusc_tmp_tmp_test_bd"
BEELINE_CMD="beeline"
BEELINE_URL="jdbc:hive2://<hive_server_host>:<hive_server_port>"
BEELINE_USER="<your_username>"
BEELINE_PASSWORD="<your_password>"

# 获取当前日期
CURRENT_DATE=$(date +%Y%m%d)

# 获取所有表名
TABLES=$($BEELINE_CMD -u "${BEELINE_URL}" -n "${BEELINE_USER}" -p "${BEELINE_PASSWORD}" --silent=true --showHeader=false -e "SHOW TABLES IN ${HIVE_DB};")

# 正则表达式匹配表名格式
VALID_PATTERN="^temp_[^_]+_[^_]+_exp([0-9]{8})$"

# 遍历所有表
for TABLE in $TABLES; do
    if [[ $TABLE =~ $VALID_PATTERN ]]; then
        # 提取过期日期
        EXP_DATE=${BASH_REMATCH[1]}
        
        # 检查是否过期
        if [[ $CURRENT_DATE -gt $EXP_DATE ]]; then
            echo "Deleting expired table: ${TABLE}"
            $BEELINE_CMD -u "${BEELINE_URL}" -n "${BEELINE_USER}" -p "${BEELINE_PASSWORD}" --silent=true --showHeader=false -e "DROP TABLE IF EXISTS ${HIVE_DB}.${TABLE};"
        fi
    else
        # 删除不符合规范的表
        echo "Deleting invalid table: ${TABLE}"
        $BEELINE_CMD -u "${BEELINE_URL}" -n "${BEELINE_USER}" -p "${BEELINE_PASSWORD}" --silent=true --showHeader=false -e "DROP TABLE IF EXISTS ${HIVE_DB}.${TABLE};"
    fi
done

echo " cleanup completed."

ps:上面的方案我是用的是beeline是因为集群直接使用hive -e 出来的表名很不规整。条件允许的可以直接用hive -e

对性能有要求的同学可能发现了,每次都要起一次beeline 客户端。效率堪忧。所以给出一个优化的方案。

方案二:

bash 复制代码
#!/bin/bash

# Hive 配置
HIVE_DB="cusc_tmp_tmp_test_bd"
BEELINE_CMD="beeline"
BEELINE_URL="jdbc:hive2://<hive_server_host>:<hive_server_port>"
BEELINE_USER="<your_username>"
BEELINE_PASSWORD="<your_password>"

# 获取当前日期
CURRENT_DATE=$(date +%Y%m%d)

# 准备SQL脚本
SQL_SCRIPT="/tmp/cleanup_tables.sql"

# 初始化SQL脚本
echo "USE ${HIVE_DB};" > "${SQL_SCRIPT}"

# 获取所有表名
TABLES=$($BEELINE_CMD -u "${BEELINE_URL}" -n "${BEELINE_USER}" -p "${BEELINE_PASSWORD}" --silent=true --showHeader=false -e "SHOW TABLES IN ${HIVE_DB};")

# 正则表达式匹配表名格式
VALID_PATTERN="^temp_[^_]+_[^_]+_exp([0-9]{8})$"

# 遍历所有表
for TABLE in $TABLES; do
    if [[ $TABLE =~ $VALID_PATTERN ]]; then
        # 提取过期日期
        EXP_DATE=${BASH_REMATCH[1]}
        
        # 检查是否过期
        if [[ $CURRENT_DATE -gt $EXP_DATE ]]; then
            echo "DROP TABLE IF EXISTS ${TABLE};" >> "${SQL_SCRIPT}"
            echo "Marked for deletion: ${TABLE}"
        fi
    else
        # 删除不符合规范的表
        echo "DROP TABLE IF EXISTS ${TABLE};" >> "${SQL_SCRIPT}"
        echo "Marked for deletion (invalid name): ${TABLE}"
    fi
done

# 执行SQL脚本
$BEELINE_CMD -u "${BEELINE_URL}" -n "${BEELINE_USER}" -p "${BEELINE_PASSWORD}" --silent=true --showHeader=false -f "${SQL_SCRIPT}"

# 清理临时SQL文件
rm -f "${SQL_SCRIPT}"

echo "cleanup completed."
  1. 方案二把需要清理的表放到了一个文件里,然后直接一次性执行一个清理语句。减少了交互,提升了效率

总结:

方案比较简单粗暴,如果想要友好一些的,可以做rename处理,比如把表名加上trash,或者把每日待删除的表先发一个邮件给到开发的小伙伴,确认无误之后再最物理删除。具体情况根据团队的实际情况来定即可。

相关推荐
B站计算机毕业设计超人1 小时前
计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+LW文档+PPT+讲解)
大数据·hadoop·爬虫·机器学习·课程设计·数据可视化·推荐算法
不剪发的Tony老师5 小时前
Apache Hop:开源版本的Kettle
数据仓库·etl
知初~10 小时前
出行项目案例
hive·hadoop·redis·sql·mysql·spark·database
m0_7482359513 小时前
Python大数据可视化:基于Python的王者荣耀战队的数据分析系统设计与实现_flask+hadoop+spider
hadoop·python·flask
B站计算机毕业设计超人1 天前
计算机毕业设计hadoop+spark旅游景点推荐 旅游推荐系统 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计
大数据·hadoop·爬虫·深度学习·机器学习·数据可视化·推荐算法
专注API从业者2 天前
分布式电商系统中的API网关架构设计
大数据·数据仓库·分布式·架构
我要用代码向我喜欢的女孩表白2 天前
hive迁移补数脚本细粒度 表名-分区唯一键
数据仓库·hive·hadoop
隔壁老登2 天前
查询hive指定数据库下所有表的建表语句并生成数据字典
数据库·hive·hadoop
m0_748233643 天前
【分布式】Hadoop完全分布式的搭建(零基础)
大数据·hadoop·分布式
薇晶晶3 天前
如何安装Hadoop
大数据·hadoop·分布式