当前位置: 首页 > news >正文

hive(hdfs)补数脚本

pb级别迁移通常要持续1个月以上。一般的过程是,全量迁移,追平数据,增量同步,校验,补数。

这里的指定补数脚本:

输入需要补数的表,如Input.txt,如果有分区则加补此分区,没有分区,则重迁移此表。

input.txt

ods_xxx dt=202403

dwd_xxx 

dwd_xxxd temp

则补数脚本应该满足,迁移ods_xxx/dt=202403分区的数据,迁移dwd_xxx的数据,迁移dwd_xxxd/temp的数据。


input.txt格式

ods_xxr dt=20250214

ods_xi_202402_monitor dt=20250214

代码

#!/bin/bash
#场景:数据在同一库下,并且hive是内部表(前缀的hdfs地址是相同的)

#1.读取一个文件,获取表名



con_address=hdfs://xx.xx.xx.104:4007

#数组,这个值是存在的  表名/分区名或者文件名
fenqu_allow_list=()

#检测即将迁移的数据量
total_size=0
while IFS=' ' read -r table_name fenqu_name
do



    hdfs dfs -count $con_address/apps/hive/warehouse/bigdata.db/$table_name/$fenqu_name

    if [ -z "$fenqu_name" ]; then
        echo "没有分区,迁移表,检测表大小"
    else
        echo "有分区或文件,检测分区大小或者文件大小"
    fi

    #文件大小,字节
    fenqu_size=$(hdfs dfs -count $con_address/apps/hive/warehouse/bigdata.db/$table_name/$fenqu_name | awk -F ' ' '{print $3}')

    if [[ "$fenqu_size" =~ ^[0-9]+$ ]]; then
          #变成GB
     fenqu_gb=$(echo "scale=2; $fenqu_size / 1073741824" | bc)

     total_size=$(echo "scale=2;$total_size + $fenqu_gb"| bc)

     fenqu_allow_list+=("$table_name/$fenqu_name")
    else
     echo "无值$table_name/$fenqu_name" >> fail.txt
    fi
done < "$1"


echo "此批迁移的总大小是$total_size GB"

read -p "是否继续? (y/n): " user_input

# 判断用户输入
if [[ "$user_input" == "y" || "$user_input" == "Y" ]]; then
    echo "即将执行脚本"
elif [[ "$user_input" == "n" || "$user_input" == "N" ]]; then
    echo "退出脚本..."
    exit 0
else
    echo "无效输入,退出脚本..."
    exit 1
fi


declare -A repair_map
#迁移指定分区或者文件
for element in "${fenqu_allow_list[@]}"; do
    table_name=$(echo "$element" | awk -F'/' '{print $1}')
    echo "表名是$table_name"
    #删除对应的内容
    echo "执行命令 hdfs dfs -rm -r $con_address/apps/hive/warehouse/bigdata.db/$element"
    hdfs dfs -rm -r $con_address/apps/hive/warehouse/bigdata.db/$element

    #迁移
    source_path=hdfs://xx.xx.xx.7:8020/apps/hive/warehouse/bigdata.db/$element
    target_path=hdfs://xx.xx.xx.104:4007/apps/hive/warehouse/bigdata.db/$element

    echo "执行命令 hadoop distcp -skipcrccheck -i -strategy dynamic -bandwidth 30 -m 20 $source_path $target_path"
    hadoop distcp -skipcrccheck -i -strategy dynamic -bandwidth 30 -m 20 $source_path $target_path

    #table_name去重
    repair_map["$table_name"]=1
    
    echo "-----------------------"
done



for key in "${!repair_map[@]}"; do
    table_name=$key
    #修复元数据
    BEELINE_CMD="beeline -u 'jdbc:hive2://xx.xx.xx.104:7001/cfc;principal=hadoop/xx.xx.xx.104@TBDS-09T7KXLE'"
    # 执行MSCK REPAIR TABLE命令
    echo "Repairing partitions for table: $table_name"
    $BEELINE_CMD -e "MSCK REPAIR TABLE $table_name;"

    if [ $? -eq 0 ]; then
        echo "Successfully repaired partitions for table: $table_name"
    else
        echo "Failed to repair partitions for table: $table_name"
    fi
done

相关文章:

  • k8s环境中的rook-ceph的osd报Permission denied无法正常运行问题的处理方式
  • 【全栈】SprintBoot+vue3迷你商城-细节解析(2):分页
  • Unity中NavMesh的使用 及其 导出给java服务端进行寻路
  • 基于Spring Security 6的OAuth2 系列之十九 - 高级特性--OIDC1.0协议之二
  • 视点开场动画实现(九)
  • KubeSphere 产品生命周期管理政策公告正式发布!
  • ALV某个字段没有显示
  • kubeadm拉起的k8s集群证书过期的做法集群已奔溃也可以解决
  • 【核心算法篇七】《DeepSeek异常检测:孤立森林与AutoEncoder对比》
  • 用Chrome Recorder轻松完成自动化测试脚本录制
  • 计算机网络原理试题六
  • Flink SQL与Doris实时数仓Join实战教程(理论+实例保姆级教程)
  • wangEditor 编辑器 Vue 2.0 + Nodejs 配置
  • 性能测试(三)之环境搭建
  • RocketMQ - 常见问题
  • 12-滑动窗口
  • JavaScript数组-获取数组中的元素
  • Java 富文本编辑器
  • MATLAB更改图论的布局:设置layout
  • C++ 与 Java 的对比分析:除法运算中的错误处理
  • 央行:中国政府债务扩张仍有可持续性
  • 第一集|《刑警的日子》很生活,《执法者们》有班味
  • 范志毅跨界归来做青训,探索中国足球人才培养新模式
  • 招行:拟出资150亿元全资发起设立金融资产投资公司
  • 司法部:持续规范行政执法行为,加快制定行政执法监督条例
  • 抗战回望21︱《“良民”日记》:一个“良民”在沦陷区的见闻与感受