如何优化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
相关产品推荐
相关产品推荐

