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

HDFS核对迁移的历史数据是否正确

需要输出的数据

分区数量、最近分区、最老分区、表文件数量、表文件大小、表字段是否一样、统计日期

fenqu_num,last_fenqu,old_fenqu,table_num,table_size,hive_true,sta_time

思路:

输入,表名,分区开始时间,分区结束时间

在指定的分区时间内,要求获取出,需求字段的值。

我的hadoop版本是3

指定分区判断是否分区一致,任务切换前。任务切换后,双写的时候文件大小会不一样,所以仅仅对

hdfs dfs -ls hdfs://10.20.45.104:4007/apps/hive/warehouse/cfc.db/ods_regulatory_payment_instruction_df | grep 'dt=' | sort -r | head -n 1|awk -F ' ' '{print $NF}'

打印最后一列。就能获取path和分区路径。

代码test.sh

这里使用修改,改成目标端和测试端的就可以了(需要做互信,不然就得分发到各自的节点去跑)

con_address=hdfs://xx.xx.xx.104:4007
#con_address=hdfs://xx.xx.xx.7:8020

#!/bin/bash
#输入表名的文件
#输入分区开始日期,分区结束日期
input_table_path=$1
start_fenqu=$2
end_fenqu=$3

#读取表文件
`kinit -kt /var/krb5kdc/emr.keytab hadoop/xx.xx.xx.107@TBDS-0xxxE`

current_datetime=$(date)
echo "-------$current_datetime-------" > rs.txt
echo "输入为sh test.sh $input_table_path $start_fenqu $end_fenqu" >> rs.txt
echo "表名 最新分区 最老分区 分区个数 区间内总字节 区间内总文件个数" >> rs.txt

con_address=hdfs://xx.xx.xx.104:4007
#con_address=hdfs://xx.xx.xx.7:8020
while IFS= read -r table_name
 do
    #0.获取hdfs的分区数据
    hdfs dfs -ls $con_address/apps/hive/warehouse/bigdata.db/$table_name | grep 'dt=' | sort -r |awk -F ' ' '{print $NF}' > 1_path_list.txt
    #1.获取所需计算的分区路径
    # 读取文件内容并逐行处理
    fenqu_allow_list=() 
  while IFS= read -r line; do
    # 提取 dt= 后面的日期部分
    dt=$(echo "$line" | grep -oP 'dt=\K\d{8}')


    if [[ ! $dt =~ ^[0-9]{8}$ ]]; then
    echo "错误: 文件中的日期格式不正确: $line"
        exit 1
    fi



    # 判断年份是否大于等于 start_fenqu 且小于等于 end_fenqu
    if [[ $dt -ge $start_fenqu && $dt -le $end_fenqu ]]; then
	    fenqu_allow_list+=("$line")
    fi
  done < "1_path_list.txt"
   
 #2.统计分区个数
 fenqu_num=${#fenqu_allow_list[@]}

 sorted_paths=$(printf "%s\n" "${fenqu_allow_list[@]}" | sort -t\= -k2)
 #3.最新分区
 latest_path=$(echo "$sorted_paths" | tail -n 1)
 echo "最新分区$latest_path"

 #4.最老分区
 oldest_path=$(echo "$sorted_paths" | head -n 1)
 echo "最老分区$oldest_path"

 #5.统计分区总大小
 #6.统计分区文件总个数(不含文件夹)
 hdfs dfs -count $con_address/apps/hive/warehouse/bigdata.db/$table_name/*| grep 'dt=' > 2_path_list.txt
 fenqu_total_bytes=0
 fenqu_total_file_num=0
 #todo 读取全量txt,与list对比,获取对应的分区数据,计算总大小
  while IFS= read -r line; do
    # 使用空格分隔并获取第三个字段
    #hdfs的path路径
    field_path=$(echo "$line" | awk -F ' ' '{print $4}')
    #文件数,print 1是文件夹,没有取
    fenqu_file_num=$(echo "$line" | awk -F ' ' '{print $2}')
    #文件大小,字节
    fenqu_size=$(echo "$line" | awk -F ' ' '{print $3}')


    # 检查第三个字段是否在有效的列表中
    if [[ " ${fenqu_allow_list[@]} " =~ " ${field_path} " ]]; then
        # 如果第三个字段在列表中,打印该行
	fenqu_total_bytes=$((fenqu_total_bytes+$fenqu_size))
	fenqu_total_file_num=$((fenqu_total_file_num+$fenqu_file_num))
    fi
  done 	 < "2_path_list.txt"
  echo "此表的此区间的总数据量大小为$fenqu_total_bytes字节,文件个数为$fenqu_total_file_num"
 #6.统计文件总个数


 echo "分区个数是$fenqu_num"
  #for row in "${fenqu_allow_list[@]}"; do
   #echo "$row"
  #done
done < "$input_table_path"
   


 echo "$table_name $latest_path $oldest_path $fenqu_num $fenqu_total_bytes $fenqu_total_file_num" >> rs.txt

#写到这里,就可以检测出来了,后面的是查表字段是否一致。我还没写..不过也够了,后面很简单

   #7.生成表字段md5


   #8.写入csv


输入文件inpute.txt(任何txt都可以,里面是表名)

ods_xxxx

dwd_xxx_xxx

运行

sh test.sh input.txt 20250206 20250209


http://www.kler.cn/a/546533.html

相关文章:

  • Go语言扩展包x/sync使用指南
  • 详解Cookie和Session
  • Windchill 成套的解决方案
  • DeepSeek接入网络安全领域,AI高效驱动,重新定义网络防御边界!
  • Vim 退出编辑模式
  • 2月14日情人节,致挚爱
  • Linux进阶——selinux
  • 【Linux网络编程】华为云开放端口号
  • Django ORM:外键字段的命名与查询机制解析
  • 推荐的、好用的线性稳压器
  • SQL联合查询
  • CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程
  • VoIP之音视频会议中的混音技术
  • 2025-2-14算法打卡
  • Java--IO流详解(中)--字节流
  • C++ Primer 函数基础
  • 网络编程(tcp线程池)
  • Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现一次触发控制三个光源开关分别采集三张图像(C#)
  • 信息安全管理(3):网络安全
  • TCP可靠传输的ARQ协议