You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化Shell脚本以快速查找HDFS目录下缺失的日期文件夹

脚本性能优化方案

原有脚本性能瓶颈

  • 最核心的性能消耗来自循环内每次单独执行hdfs dfs -test命令:每个HDFS命令都需要和NameNode建立网络连接、发起元数据查询请求,单次请求开销较高,上百次循环累加就会导致总耗时过长
  • 循环内每次调用date命令生成日期也会产生额外的进程开销

优化思路

仅发起1次HDFS请求拉取目标目录下所有已存在的日期文件夹,生成完整的目标日期范围后直接在内存中做差集比对,避免循环发起大量HDFS请求。

优化后代码示例

startdate=20210524
enddate=20211022
root_dir="a/b/c"

# 声明关联数组存储已存在的日期,查询效率接近O(1)
declare -A exist_dates
# 一次性拉取目标目录下所有文件夹,提取8位日期格式的目录名存入数组
while read -r dir; do
    date_str="${dir##*/}"
    exist_dates["$date_str"]=1
done < <(hdfs dfs -ls "$root_dir" | grep -oE '[0-9]{8}$')

# 遍历完整日期范围,比对找出缺失的日期
current_date="$startdate"
while [ "$current_date" != "$enddate" ]; do
    if [ ! "${exist_dates[$current_date]}" ]; then
        echo "File does not exist for $current_date"
    fi
    current_date=$(date -d "$current_date +1 day" +%Y%m%d)
done
# 补充检查结束日期本身
if [ ! "${exist_dates[$enddate]}" ]; then
    echo "File does not exist for $enddate"
fi

提示:如果$root_dir下存在大量非8位数字命名的文件夹,可以调整grep规则过滤无效路径,进一步提升处理速度。

优化效果

原方案需要执行上百次HDFS请求,优化后仅需执行1次HDFS查询请求,总耗时会从分钟级降到秒级甚至更低,日期范围越大,性能提升幅度越明显。

内容的提问来源于stack exchange,提问作者Hannah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:48:01