• Hive - 检查分区 partition 是否存在


    目录

    一.引言

    二.检查最新分区

    三.检查任意分区

    四.总结


    一.引言

    国庆期间任务因为某个 hive 表分区未成功创建,导致后续任务异常,为此也是苦逼的 6 点起床修复 bug。发生异常对应表的正常分区如下图所示,为 dt、hour 双分区:

    为了保证后续不再出现该问题,这里增加了定时的检查机制,用于检测分区 partition 是否生成,未生成则报警并重新执行分区生成任务。根据场景不同,下面使用两种方法检测,示例中我们只检测对应 dt 的分区是否正常生成。

    二.检查最新分区

    1. latest_partition_exist() {
    2. local args=("$@") # 将参数存储在本地数组中
    3. table_name=${args[0]}
    4. partition=${args[1]}
    5. latest_partition=`hive -e "show partitions ${table_name};" | tail -1 | cut -d '=' -f2 | cut -d '/' -f1`
    6. echo 最新分区 $latest_partition
    7. if [ $latest_partition == $partition ];then
    8. echo "Table $table_name 分区 $partition 存在"
    9. else
    10. echo "Table $table_name 分区 $partition 不存在"
    11. ... <重新生成分区的逻辑> ...
    12. fi
    13. }
    14. latest_partition_exist $table_name $partition

    函数解释

    show_partitions 展示所有分区,由于是检测最新分区,所以 tail -1 直接取最后的分区即可。这里由于是 dt、hour 双分区,所以第一层 cut 后得到的结果是 '20231006/hour',为了获取对应 dt 我们又增加了新的 '/' 划分。如果你的分区只有一层,保留一个 cut 即可。

    函数使用

    如上示例,如果我们要检测最新的分区是否是 dt='20231006',则:

    1. #!/bin/bash
    2. table_name='xxx'
    3. partition='20231006'
    4. latest_partition_exist $table_name $partition

    如果不存在则在 ... 处增加对应的分区生成逻辑即可。 

    三.检查任意分区

    上面通过 tail -1 检查最后一个即当前表的最新分区,还有一些同学可能需要检测之前的分区,此时不同使用 tail 来定位,所以增加了一版任意分区检测的方法。

    1. partition_exist() {
    2. local args=("$@") # 将参数存储在本地数组中
    3. table_name=${args[0]}
    4. partition=${args[1]}
    5. # 在 Hive 中执行 SHOW PARTITIONS 命令,并将结果赋值给变量 result
    6. result=$(hive -e "SHOW PARTITIONS ${table_name};")
    7. # 检查 result 是否包含 partition
    8. if [[ $result == *"${partition}"* ]]; then
    9. echo "Table $table_name 分区 $partition 存在"
    10. else
    11. echo "Table $table_name 分区 $partition 不存在"
    12. ... <重新生成分区的逻辑> ...
    13. fi
    14. }

    函数解释

    if [[ $result == *"${partition}"* ]]; then

    这里将所有分区信息构成数组赋值给 result。这里的 == 字符串比较操作符,*表示任意字符的通配符。也就是说,如果 $result 变量的值中任意位置包含 $partition 变量的值,条件就满足,就会执行 then 后面的代码块。

    函数使用

    如上示例,如果我们要检测最新的分区是否是 dt='20231006',则:

    1. #!/bin/bash
    2. table_name='xxx'
    3. partition='20231006'
    4. partition_exist $table_name $partition

    如果不存在则在 ... 处增加对应的分区生成逻辑即可。 

    四.总结

    因为分区未生成的原因,影响了国庆的一个早晨懒觉,教训惨痛,对后续也产生了警醒,一定要给任务增加异常检查机制、失败重试机制,这样才能换来每早的安稳睡眠。最后上个中秋的月,纪念这愉快而又短暂的双节假期:

  • 相关阅读:
    Flink学习11:flink程序并行度
    【27】c++设计模式——>迭代器模式(1)
    Excel 函数教程之如何提取字符串部分内容特殊字符,六套完整解决方案 (教程含源码)
    c++day5
    MyBatis ---- MyBatis获取参数值的两种方式(重点)
    【开发篇】十七、消息:模拟订单短信通知
    内存条选购注意事项(电脑,笔记本)
    SVN的基本使用
    【图解HTTP】了解Web及网络基础
    1-8Vmware中的文件共享
  • 原文地址:https://blog.csdn.net/BIT_666/article/details/133646679